From 223dfd45aeb09ee9db29030ae0d1be35c5aa0ee3 Mon Sep 17 00:00:00 2001 From: "mostafa.amen07" Date: Thu, 22 Oct 2020 10:29:05 +0200 Subject: [PATCH] refactor(issue): add optional refreshIssues method Adding optional refreshIssues method to issue service interface Allow for future implementation from issue providers --- .../features/issue/issue-service-interface.ts | 8 ++++ src/app/features/issue/issue.service.ts | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/app/features/issue/issue-service-interface.ts b/src/app/features/issue/issue-service-interface.ts index 40a542a478..0094a8d10e 100644 --- a/src/app/features/issue/issue-service-interface.ts +++ b/src/app/features/issue/issue-service-interface.ts @@ -19,5 +19,13 @@ export interface IssueServiceInterface { issue: IssueData } | null>; + refreshIssues?(tasks: Task[], + isNotifySuccess: boolean, + isNotifyNoUpdateRequired: boolean): Promise<{ + task: Task, + taskChanges: Partial, + issue: IssueData + }[]>; + getMappedAttachments?(issueDataIN: IssueData): TaskAttachment[]; } diff --git a/src/app/features/issue/issue.service.ts b/src/app/features/issue/issue.service.ts index dce52466ac..5b550219a9 100644 --- a/src/app/features/issue/issue.service.ts +++ b/src/app/features/issue/issue.service.ts @@ -96,6 +96,50 @@ export class IssueService { } } + async refreshIssues( + tasks: Task[], + isNotifySuccess: boolean = true, + isNotifyNoUpdateRequired: boolean = false + ): Promise { + // dynamic map that has a list of tasks for every entry where the entry is an issue type + const tasksIssueIdsByIssueType: any = {}; + const tasksWithoutIssueId = []; + const tasksWithoutMethod = []; + + for (const task of tasks) { + if (!task.issueId || !task.issueType) { + tasksWithoutIssueId.push(task); + } else if (!this.ISSUE_SERVICE_MAP[task.issueType].refreshIssues) { + tasksWithoutMethod.push(task); + } + else if (!tasksIssueIdsByIssueType[task.issueType]){ + tasksIssueIdsByIssueType[task.issueType] = []; + tasksIssueIdsByIssueType[task.issueType].push(task); + } else { + tasksIssueIdsByIssueType[task.issueType].push(task); + } + } + + for (const issuesType of Object.keys(tasksIssueIdsByIssueType)) { + const updates = await (this.ISSUE_SERVICE_MAP[issuesType].refreshIssues as any)(tasksIssueIdsByIssueType[issuesType], isNotifySuccess, isNotifyNoUpdateRequired); + if (updates) { + for (const update of updates) { + if (this.ISSUE_REFRESH_MAP[issuesType][update.task.issueId]) { + this.ISSUE_REFRESH_MAP[issuesType][update.task.issueId].next(update.issue); + } + this._taskService.update(update.task.id, update.taskChanges); + } + } + } + + for (const taskWithoutIssueId of tasksWithoutIssueId) { + throw new Error('No issue task ' + taskWithoutIssueId.id); + } + for (const taskWithoutMethod of tasksWithoutMethod) { + throw new Error('Issue method not available ' + taskWithoutMethod); + } + } + async addTaskWithIssue( issueType: IssueProviderKey, issueIdOrData: string | number | IssueDataReduced,