@@ -327,101 +327,111 @@ const updateStatusOnTaskCompletion = async (userId) => {
327
327
}
328
328
} ;
329
329
330
- const massUpdateIdleUsers = async ( users ) => {
330
+ const batchUpdateUsersStatus = async ( users ) => {
331
331
const currentTimeStamp = new Date ( ) . getTime ( ) ;
332
332
const batch = firestore . batch ( ) ;
333
- let usersWithStatusUnchanged = 0 ;
334
-
335
- await Promise . all (
336
- users . map ( async ( userId ) => {
337
- let latestStatusData ;
338
- try {
339
- latestStatusData = await getUserStatus ( userId ) ;
340
- } catch ( error ) {
341
- usersWithStatusUnchanged ++ ;
342
- return batch ;
343
- }
344
- const { id, userStatusExists, data } = latestStatusData ;
333
+ const summary = {
334
+ totalUsers : users . length ,
335
+ totalUnprocessedUsers : 0 ,
336
+ totalOnboardingUsersAltered : 0 ,
337
+ totalOnboardingUsersUnAltered : 0 ,
338
+ totalActiveUsersAltered : 0 ,
339
+ totalActiveUsersUnAltered : 0 ,
340
+ totalIdleUsersAltered : 0 ,
341
+ totalIdleUsersUnAltered : 0 ,
342
+ } ;
345
343
346
- if ( ! userStatusExists || ! data ?. currentStatus ) {
347
- const newUserStatusRef = userStatusModel . doc ( ) ;
348
- const newUserStatusData = {
349
- userId,
350
- currentStatus : {
351
- state : userState . IDLE ,
352
- message : "" ,
353
- from : currentTimeStamp ,
354
- until : "" ,
355
- updatedAt : currentTimeStamp ,
356
- } ,
357
- } ;
358
- batch . set ( newUserStatusRef , newUserStatusData ) ;
359
- } else {
360
- const {
361
- currentStatus : { state, until } ,
362
- } = data ;
344
+ for ( const { userId, state } of users ) {
345
+ let latestStatusData ;
346
+ try {
347
+ latestStatusData = await getUserStatus ( userId ) ;
348
+ } catch ( error ) {
349
+ summary . totalUnprocessedUsers ++ ;
350
+ continue ;
351
+ }
352
+ const { id, userStatusExists, data } = latestStatusData ;
353
+ const statusToUpdate = {
354
+ state,
355
+ message : "" ,
356
+ from : currentTimeStamp ,
357
+ until : "" ,
358
+ updatedAt : currentTimeStamp ,
359
+ } ;
363
360
364
- if ( state === userState . OOO || state === userState . ACTIVE ) {
365
- const docRef = userStatusModel . doc ( id ) ;
366
- const updatedStatusData =
367
- state === userState . OOO
368
- ? {
369
- futureStatus : {
370
- state : userState . IDLE ,
371
- message : "" ,
372
- from : until ,
373
- until : "" ,
374
- updatedAt : currentTimeStamp ,
375
- } ,
376
- }
377
- : {
378
- currentStatus : {
379
- state : userState . IDLE ,
380
- message : "" ,
381
- from : currentTimeStamp ,
382
- until : "" ,
383
- updatedAt : currentTimeStamp ,
384
- } ,
385
- } ;
361
+ if ( ! userStatusExists || ! data ?. currentStatus ) {
362
+ const newUserStatusRef = userStatusModel . doc ( ) ;
363
+ const newUserStatusData = {
364
+ userId,
365
+ currentStatus : statusToUpdate ,
366
+ } ;
367
+ state === userState . ACTIVE ? summary . totalActiveUsersAltered ++ : summary . totalIdleUsersAltered ++ ;
368
+ batch . set ( newUserStatusRef , newUserStatusData ) ;
369
+ } else {
370
+ const {
371
+ currentStatus : { state : currentState , until } ,
372
+ } = data ;
373
+ if ( currentState === state ) {
374
+ currentState === userState . ACTIVE ? summary . totalActiveUsersUnAltered ++ : summary . totalIdleUsersUnAltered ++ ;
375
+ continue ;
376
+ }
377
+ if ( currentState === userState . ONBOARDING ) {
378
+ const docRef = userStatusModel . doc ( id ) ;
379
+ if ( state === userState . ACTIVE ) {
380
+ const updatedStatusData = {
381
+ currentStatus : statusToUpdate ,
382
+ } ;
383
+ summary . totalOnboardingUsersAltered ++ ;
386
384
batch . update ( docRef , updatedStatusData ) ;
387
385
} else {
388
- usersWithStatusUnchanged ++ ;
386
+ summary . totalOnboardingUsersUnAltered ++ ;
389
387
}
388
+ } else {
389
+ state === userState . ACTIVE ? summary . totalActiveUsersAltered ++ : summary . totalIdleUsersAltered ++ ;
390
+ const docRef = userStatusModel . doc ( id ) ;
391
+ const updatedStatusData =
392
+ currentState === userState . OOO
393
+ ? {
394
+ futureStatus : {
395
+ ...statusToUpdate ,
396
+ from : until ,
397
+ } ,
398
+ }
399
+ : {
400
+ currentStatus : statusToUpdate ,
401
+ } ;
402
+ batch . update ( docRef , updatedStatusData ) ;
390
403
}
391
- return batch ;
392
- } )
393
- ) ;
404
+ }
405
+ }
394
406
395
407
try {
396
408
await batch . commit ( ) ;
397
- return {
398
- totalUsers : users . length ,
399
- usersWithStatusUpdated : users . length - usersWithStatusUnchanged ,
400
- usersOnboardingOrAlreadyIdle : usersWithStatusUnchanged ,
401
- } ;
409
+ return summary ;
402
410
} catch ( error ) {
403
411
throw new Error ( "Batch operation failed" ) ;
404
412
}
405
413
} ;
406
414
407
- const getIdleUsers = async ( ) => {
408
- const idleUsers = [ ] ;
409
- const usersNotProcessed = [ ] ;
415
+ const getTaskBasedUsersStatus = async ( ) => {
416
+ const users = [ ] ;
417
+ let totalIdleUsers = 0 ;
418
+ let totalActiveUsers = 0 ;
419
+ const unprocessedUsers = [ ] ;
410
420
let errorCount = 0 ;
411
- let discordActiveNonArchivedUsersQuerySnapshot ;
421
+ let usersSnapshot ;
412
422
try {
413
- discordActiveNonArchivedUsersQuerySnapshot = await usersCollection
423
+ usersSnapshot = await usersCollection
414
424
. where ( "roles.in_discord" , "==" , true )
415
425
. where ( "roles.archived" , "==" , false )
416
426
. get ( ) ;
417
427
} catch ( error ) {
418
428
logger . error ( `unable to get users ${ error . message } ` ) ;
419
429
throw new Error ( "unable to get users" ) ;
420
430
}
421
- const totalValidUsersCount = discordActiveNonArchivedUsersQuerySnapshot . size ;
422
- if ( totalValidUsersCount ) {
431
+ const totalUsers = usersSnapshot . size ;
432
+ if ( totalUsers ) {
423
433
await Promise . all (
424
- discordActiveNonArchivedUsersQuerySnapshot . docs . map ( async ( userDoc ) => {
434
+ usersSnapshot . docs . map ( async ( userDoc ) => {
425
435
const assigneeId = userDoc . id ;
426
436
try {
427
437
const tasksQuerySnapshot = await firestore
@@ -430,23 +440,28 @@ const getIdleUsers = async () => {
430
440
. where ( "status" , "in" , [ TASK_STATUS . ASSIGNED , TASK_STATUS . IN_PROGRESS ] )
431
441
. get ( ) ;
432
442
if ( tasksQuerySnapshot . empty ) {
433
- idleUsers . push ( assigneeId ) ;
443
+ totalIdleUsers ++ ;
444
+ users . push ( { userId : assigneeId , state : userState . IDLE } ) ;
445
+ } else {
446
+ totalActiveUsers ++ ;
447
+ users . push ( { userId : assigneeId , state : userState . ACTIVE } ) ;
434
448
}
435
449
} catch ( error ) {
436
450
errorCount ++ ;
437
- usersNotProcessed . push ( assigneeId ) ;
451
+ unprocessedUsers . push ( assigneeId ) ;
438
452
logger . error ( `Error retrieving tasks for user ${ assigneeId } : ${ error . message } ` ) ;
439
453
}
440
454
} )
441
455
) ;
442
456
}
443
457
444
458
return {
445
- totalValidUsersCount,
446
- idleUsersCount : idleUsers . length ,
447
- idleUsers,
448
- usersNotProcessedCount : errorCount ,
449
- usersNotProcessed,
459
+ totalUsers,
460
+ totalIdleUsers,
461
+ totalActiveUsers,
462
+ totalUnprocessedUsers : errorCount ,
463
+ unprocessedUsers,
464
+ users,
450
465
} ;
451
466
} ;
452
467
@@ -503,7 +518,7 @@ module.exports = {
503
518
updateUserStatusOnNewTaskAssignment,
504
519
updateUserStatusOnTaskUpdate,
505
520
updateStatusOnTaskCompletion,
506
- massUpdateIdleUsers ,
507
- getIdleUsers ,
521
+ batchUpdateUsersStatus ,
522
+ getTaskBasedUsersStatus ,
508
523
cancelOooStatus,
509
524
} ;
0 commit comments