|
| 1 | +import { Injectable } from '@nestjs/common'; |
| 2 | +import GanttDAO from '@entities/gantt/gantt.dao'; |
| 3 | +import TaskDAO from '@entities/task/task.dao'; |
| 4 | +import { ITasChangeDTO } from './gantt.feature.interface'; |
| 5 | + |
| 6 | +@Injectable() |
| 7 | +export default class GanttFeatureService { |
| 8 | + constructor( |
| 9 | + private ganttDAO: GanttDAO, |
| 10 | + private taskDAO: TaskDAO, |
| 11 | + ) {} |
| 12 | + |
| 13 | + public async applyChanges(data: ITasChangeDTO[]) { |
| 14 | + const updatedTasks: any[] = []; |
| 15 | + const deletedTasks: any[] = []; |
| 16 | + const createdTasks: any[] = []; |
| 17 | + |
| 18 | + for (const task of data) { |
| 19 | + if (task.state === 'Unchanged') continue; |
| 20 | + |
| 21 | + switch (task.state) { |
| 22 | + case 'Created': |
| 23 | + const { taskID, ...rest } = task; |
| 24 | + createdTasks.push(rest); |
| 25 | + break; |
| 26 | + |
| 27 | + case 'Deleted': |
| 28 | + if (task.taskID === undefined) |
| 29 | + throw new Error("Data missing 'taskID' attribute"); |
| 30 | + |
| 31 | + const gantt = task.ganttID |
| 32 | + ? { gantt: { ganttID: task.ganttID } } |
| 33 | + : {}; |
| 34 | + |
| 35 | + deletedTasks.push({ |
| 36 | + taskID: task.taskID, |
| 37 | + gantt, |
| 38 | + }); |
| 39 | + break; |
| 40 | + |
| 41 | + case 'Updated': |
| 42 | + if (task.taskID === undefined) |
| 43 | + throw new Error("Data missing 'taskID' attribute"); |
| 44 | + |
| 45 | + updatedTasks.push(task); |
| 46 | + |
| 47 | + default: |
| 48 | + throw new Error('Unknown error'); |
| 49 | + } |
| 50 | + } |
| 51 | + |
| 52 | + const [createdTaskEntities, updatedTaskEntites, deletedTaskEntites] = |
| 53 | + await Promise.all([ |
| 54 | + this.taskDAO.bulkCreateTaskRecords(createdTasks), |
| 55 | + this.taskDAO.bulkUpdateTaskRecords(updatedTasks), |
| 56 | + this.taskDAO.bulkDeleteTaskRecords(deletedTasks), |
| 57 | + ]).then((res) => res); |
| 58 | + |
| 59 | + return { createdTaskEntities, updatedTaskEntites, deletedTaskEntites }; |
| 60 | + } |
| 61 | +} |
0 commit comments