@@ -3,10 +3,14 @@ const tasksModel = firestore.collection("tasks");
3
3
const ItemModel = firestore . collection ( "itemTags" ) ;
4
4
const dependencyModel = firestore . collection ( "taskDependencies" ) ;
5
5
const userUtils = require ( "../utils/users" ) ;
6
+ const { updateTaskStatusToDone } = require ( "../services/tasks" ) ;
7
+ const { chunks } = require ( "../utils/array" ) ;
8
+ const { DOCUMENT_WRITE_SIZE } = require ( "../constants/constants" ) ;
6
9
const { fromFirestoreData, toFirestoreData, buildTasks } = require ( "../utils/tasks" ) ;
7
10
const { TASK_TYPE , TASK_STATUS , TASK_STATUS_OLD , TASK_SIZE } = require ( "../constants/tasks" ) ;
8
11
const { IN_PROGRESS , NEEDS_REVIEW , IN_REVIEW , ASSIGNED , BLOCKED , SMOKE_TESTING , COMPLETED , SANITY_CHECK } = TASK_STATUS ;
9
12
const { OLD_ACTIVE , OLD_BLOCKED , OLD_PENDING , OLD_COMPLETED } = TASK_STATUS_OLD ;
13
+ const { INTERNAL_SERVER_ERROR } = require ( "../constants/errorMessages" ) ;
10
14
11
15
/**
12
16
* Adds and Updates tasks
@@ -575,6 +579,62 @@ const getOverdueTasks = async (days = 0) => {
575
579
}
576
580
} ;
577
581
582
+ const updateTaskStatus = async ( ) => {
583
+ try {
584
+ const snapshot = await tasksModel . where ( "status" , "==" , "COMPLETED" ) . get ( ) ;
585
+ const tasksStatusCompleted = [ ] ;
586
+ let summary = {
587
+ totalTasks : snapshot . size ,
588
+ totalUpdatedStatus : 0 ,
589
+ totalOperationsFailed : 0 ,
590
+ updatedTaskDetails : [ ] ,
591
+ failedTaskDetails : [ ] ,
592
+ } ;
593
+
594
+ if ( snapshot . size === 0 ) {
595
+ return summary ;
596
+ }
597
+
598
+ snapshot . forEach ( ( task ) => {
599
+ const id = task . id ;
600
+ const taskData = task . data ( ) ;
601
+ tasksStatusCompleted . push ( { ...taskData , id } ) ;
602
+ } ) ;
603
+ const taskStatusCompletedChunks = chunks ( tasksStatusCompleted , DOCUMENT_WRITE_SIZE ) ;
604
+
605
+ const updatedTasksPromises = await Promise . all (
606
+ taskStatusCompletedChunks . map ( async ( tasks ) => {
607
+ const res = await updateTaskStatusToDone ( tasks ) ;
608
+ return {
609
+ totalUpdatedStatus : res . totalUpdatedStatus ,
610
+ totalOperationsFailed : res . totalOperationsFailed ,
611
+ updatedTaskDetails : res . updatedTaskDetails ,
612
+ failedTaskDetails : res . failedTaskDetails ,
613
+ } ;
614
+ } )
615
+ ) ;
616
+
617
+ updatedTasksPromises . forEach ( ( res ) => {
618
+ summary = {
619
+ ...summary ,
620
+ totalUpdatedStatus : ( summary . totalUpdatedStatus += res . totalUpdatedStatus ) ,
621
+ totalOperationsFailed : ( summary . totalOperationsFailed += res . totalOperationsFailed ) ,
622
+ updatedTaskDetails : [ ...summary . updatedTaskDetails , ...res . updatedTaskDetails ] ,
623
+ failedTaskDetails : [ ...summary . failedTaskDetails , ...res . failedTaskDetails ] ,
624
+ } ;
625
+ } ) ;
626
+
627
+ if ( summary . totalOperationsFailed === summary . totalTasks ) {
628
+ throw Error ( INTERNAL_SERVER_ERROR ) ;
629
+ }
630
+
631
+ return summary ;
632
+ } catch ( error ) {
633
+ logger . error ( `Error in updating task status: ${ error } ` ) ;
634
+ throw error ;
635
+ }
636
+ } ;
637
+
578
638
module . exports = {
579
639
updateTask,
580
640
fetchTasks,
@@ -591,4 +651,5 @@ module.exports = {
591
651
fetchPaginatedTasks,
592
652
getBuiltTasks,
593
653
getOverdueTasks,
654
+ updateTaskStatus,
594
655
} ;
0 commit comments