@@ -15,6 +15,7 @@ const {
1515 generateNewStatus,
1616 getNextDayTimeStamp,
1717 convertTimestampsToUTC,
18+ resolveLastOooUntil,
1819} = require ( "../utils/userStatus" ) ;
1920const { TASK_STATUS } = require ( "../constants/tasks" ) ;
2021const userStatusModel = firestore . collection ( "usersStatus" ) ;
@@ -213,8 +214,13 @@ const updateUserStatus = async (userId, updatedStatusData) => {
213214 if ( userStatusDoc ) {
214215 const docId = userStatusDoc . id ;
215216 const userStatusData = userStatusDoc . data ( ) ;
217+ const previousCurrentStatus = userStatusData . currentStatus || { } ;
218+ const previousState = previousCurrentStatus . state ;
219+ const previousUntil = previousCurrentStatus . until ;
220+ let requestedNextState ;
216221 if ( Object . keys ( newStatusData ) . includes ( "currentStatus" ) ) {
217- const newUserState = newStatusData . currentStatus . state ;
222+ requestedNextState = newStatusData . currentStatus ?. state ;
223+ const newUserState = requestedNextState ;
218224 const isNewStateOoo = newUserState === userState . OOO ;
219225 const isNewStateNotOoo = newUserState === userState . ACTIVE || newUserState === userState . IDLE ;
220226 const isCurrentStateOoo = userStatusData . currentStatus ?. state === userState . OOO ;
@@ -235,6 +241,15 @@ const updateUserStatus = async (userId, updatedStatusData) => {
235241 }
236242 }
237243 }
244+ const lastOooUntilUpdate = resolveLastOooUntil ( {
245+ previousState,
246+ previousUntil,
247+ nextState : requestedNextState ,
248+ fallbackTimestamp : newStatusData . currentStatus ?. updatedAt ,
249+ } ) ;
250+ if ( lastOooUntilUpdate !== undefined ) {
251+ newStatusData . lastOooUntil = lastOooUntilUpdate ;
252+ }
238253 if (
239254 userStatusData . currentStatus ?. state === userState . IDLE &&
240255 newStatusData . currentStatus ?. state !== userState . IDLE
@@ -255,7 +270,7 @@ const updateUserStatus = async (userId, updatedStatusData) => {
255270 }
256271 }
257272 }
258- const { id } = await userStatusModel . add ( { userId, ...newStatusData } ) ;
273+ const { id } = await userStatusModel . add ( { userId, lastOooUntil : null , ...newStatusData } ) ;
259274 return { id, userStatusExists : false , data : newStatusData } ;
260275 }
261276 } catch ( error ) {
@@ -283,20 +298,30 @@ const updateAllUserStatus = async () => {
283298 summary . usersCount = userStatusDocs . _size ;
284299 const batch = firestore . batch ( ) ;
285300 const today = new Date ( ) . getTime ( ) ;
286- userStatusDocs . forEach ( async ( document ) => {
301+ for ( const document of userStatusDocs . docs ) {
287302 const doc = document . data ( ) ;
288303 const docRef = document . ref ;
289304 const userId = doc . userId ;
290305 const newStatusData = { ...doc } ;
291306 let toUpdate = false ;
292307 const { futureStatus, currentStatus } = doc ;
293- const { state : futureState } = futureStatus ;
294- const { state : currentState } = currentStatus ;
308+ const futureState = futureStatus ?. state ;
309+ const currentState = currentStatus ?. state ;
310+ const currentUntil = currentStatus ?. until ;
295311 if ( futureState === "ACTIVE" || futureState === "IDLE" ) {
296312 if ( today >= futureStatus . from ) {
297313 // OOO period is over and we need to update their current status
298314 newStatusData . currentStatus = { ...futureStatus , until : "" , updatedAt : today } ;
299315 delete newStatusData . futureStatus ;
316+ const lastOooUntilUpdate = resolveLastOooUntil ( {
317+ previousState : currentState ,
318+ previousUntil : currentUntil ,
319+ nextState : futureState ,
320+ fallbackTimestamp : today ,
321+ } ) ;
322+ if ( lastOooUntilUpdate !== undefined ) {
323+ newStatusData . lastOooUntil = lastOooUntilUpdate ;
324+ }
300325 toUpdate = ! toUpdate ;
301326 summary . oooUsersAltered ++ ;
302327 } else {
@@ -319,6 +344,7 @@ const updateAllUserStatus = async () => {
319344 }
320345 newStatusData . currentStatus = newCurrentStatus ;
321346 newStatusData . futureStatus = newFutureStatus ;
347+ newStatusData . lastOooUntil = null ;
322348 toUpdate = ! toUpdate ;
323349 summary . nonOooUsersAltered ++ ;
324350 } else {
@@ -333,7 +359,7 @@ const updateAllUserStatus = async () => {
333359 }
334360 batch . set ( docRef , newStatusData ) ;
335361 }
336- } ) ;
362+ }
337363 if ( batch . _ops . length > 100 ) {
338364 logger . info (
339365 `Warning: More than 100 User Status documents to update. The max limit permissible is 500. Refer https://github.com/Real-Dev-Squad/website-backend/issues/890 for more details.`
@@ -505,15 +531,17 @@ const batchUpdateUsersStatus = async (users) => {
505531 const newUserStatusRef = userStatusModel . doc ( ) ;
506532 const newUserStatusData = {
507533 userId,
534+ lastOooUntil : null ,
508535 currentStatus : statusToUpdate ,
509536 } ;
510537 state === userState . ACTIVE ? summary . activeUsersAltered ++ : summary . idleUsersAltered ++ ;
511538 if ( state === userState . IDLE ) await addGroupIdleRoleToDiscordUser ( userId ) ;
512539 batch . set ( newUserStatusRef , newUserStatusData ) ;
513540 } else {
514- const {
515- currentStatus : { state : currentState , until } ,
516- } = data ;
541+ const currentStatusData = data ?. currentStatus || { } ;
542+ const currentState = currentStatusData . state ;
543+ const currentUntil = currentStatusData . until ;
544+ const nextState = state ;
517545 if ( currentState === state ) {
518546 currentState === userState . ACTIVE ? summary . activeUsersUnaltered ++ : summary . idleUsersUnaltered ++ ;
519547 continue ;
@@ -533,18 +561,25 @@ const batchUpdateUsersStatus = async (users) => {
533561 state === userState . ACTIVE ? summary . activeUsersAltered ++ : summary . idleUsersAltered ++ ;
534562
535563 const currentDate = new Date ( ) ;
536- const untilDate = new Date ( until ) ;
564+ const untilDate = new Date ( currentUntil ) ;
537565
538566 const timeDifferenceMilliseconds = currentDate . setUTCHours ( 0 , 0 , 0 , 0 ) - untilDate . setUTCHours ( 0 , 0 , 0 , 0 ) ;
539567 const timeDifferenceDays = Math . floor ( timeDifferenceMilliseconds / ( 24 * 60 * 60 * 1000 ) ) ;
540568
541569 if ( timeDifferenceDays >= 1 ) {
542570 if ( state === userState . IDLE ) await addGroupIdleRoleToDiscordUser ( userId ) ;
571+ const lastOooUntilUpdate = resolveLastOooUntil ( {
572+ previousState : currentState ,
573+ previousUntil : currentUntil ,
574+ nextState,
575+ fallbackTimestamp : currentTimeStamp ,
576+ } ) ;
543577 batch . update ( docRef , {
544578 currentStatus : statusToUpdate ,
579+ ...( lastOooUntilUpdate !== undefined && { lastOooUntil : lastOooUntilUpdate } ) ,
545580 } ) ;
546581 } else {
547- const getNextDayAfterUntil = getNextDayTimeStamp ( until ) ;
582+ const getNextDayAfterUntil = getNextDayTimeStamp ( currentUntil ) ;
548583 batch . update ( docRef , {
549584 futureStatus : {
550585 ...statusToUpdate ,
@@ -559,6 +594,15 @@ const batchUpdateUsersStatus = async (users) => {
559594 const updatedStatusData = {
560595 currentStatus : statusToUpdate ,
561596 } ;
597+ const lastOooUntilUpdate = resolveLastOooUntil ( {
598+ previousState : currentState ,
599+ previousUntil : currentUntil ,
600+ nextState,
601+ fallbackTimestamp : currentTimeStamp ,
602+ } ) ;
603+ if ( lastOooUntilUpdate !== undefined ) {
604+ updatedStatusData . lastOooUntil = lastOooUntilUpdate ;
605+ }
562606 batch . update ( docRef , updatedStatusData ) ;
563607 }
564608 }
@@ -661,6 +705,15 @@ const cancelOooStatus = async (userId) => {
661705 }
662706 const updatedStatus = generateNewStatus ( isActive ) ;
663707 const newStatusData = { ...docData , ...updatedStatus } ;
708+ const lastOooUntilUpdate = resolveLastOooUntil ( {
709+ previousState : docData . currentStatus ?. state ,
710+ previousUntil : docData . currentStatus ?. until ,
711+ nextState : updatedStatus . currentStatus ?. state ,
712+ fallbackTimestamp : Date . now ( ) ,
713+ } ) ;
714+ if ( lastOooUntilUpdate !== undefined ) {
715+ newStatusData . lastOooUntil = lastOooUntilUpdate ;
716+ }
664717 if ( futureStatus ?. state ) {
665718 newStatusData . futureStatus = { } ;
666719 }
0 commit comments