@@ -8,7 +8,8 @@ const { findSubscribedGroupIds } = require("../utils/helper");
88const { retrieveUsers } = require ( "../services/dataAccessLayer" ) ;
99const { BATCH_SIZE_IN_CLAUSE } = require ( "../constants/firebase" ) ;
1010const { getAllUserStatus, getGroupRole, getUserStatus } = require ( "./userStatus" ) ;
11- const { userState } = require ( "../constants/userStatus" ) ;
11+ const { normalizeTimestamp } = require ( "../utils/userStatus" ) ;
12+ const { userState, POST_OOO_GRACE_PERIOD_IN_DAYS } = require ( "../constants/userStatus" ) ;
1213const { ONE_DAY_IN_MS , SIMULTANEOUS_WORKER_CALLS } = require ( "../constants/users" ) ;
1314const userModel = firestore . collection ( "users" ) ;
1415const photoVerificationModel = firestore . collection ( "photo-verification" ) ;
@@ -958,6 +959,7 @@ const getMissedProgressUpdatesUsers = async (options = {}) => {
958959 const stats = {
959960 tasks : 0 ,
960961 missedUpdatesTasks : 0 ,
962+ filteredByOoo : 0 ,
961963 } ;
962964 try {
963965 const discordUsersPromise = discordService . getDiscordMembers ( ) ;
@@ -1031,8 +1033,7 @@ const getMissedProgressUpdatesUsers = async (options = {}) => {
10311033
10321034 const userIdChunks = chunks ( Array . from ( usersMap . keys ( ) ) , FIRESTORE_IN_CLAUSE_SIZE ) ;
10331035 const userStatusSnapshotPromise = userIdChunks . map (
1034- async ( userIdList ) =>
1035- await userStatusModel . where ( "currentStatus.state" , "==" , userState . OOO ) . where ( "userId" , "in" , userIdList ) . get ( )
1036+ async ( userIdList ) => await userStatusModel . where ( "userId" , "in" , userIdList ) . get ( )
10361037 ) ;
10371038 const userDetailsPromise = userIdChunks . map (
10381039 async ( userIdList ) =>
@@ -1046,7 +1047,13 @@ const getMissedProgressUpdatesUsers = async (options = {}) => {
10461047
10471048 userStatusChunks . forEach ( ( userStatusList ) =>
10481049 userStatusList . forEach ( ( doc ) => {
1049- usersMap . get ( doc . data ( ) . userId ) . isOOO = true ;
1050+ const userStatusData = doc . data ( ) ;
1051+ const mappedUser = usersMap . get ( userStatusData . userId ) ;
1052+ if ( ! mappedUser ) {
1053+ return ;
1054+ }
1055+ mappedUser . isOOO = userStatusData . currentStatus ?. state === userState . OOO ;
1056+ mappedUser . lastOooUntil = userStatusData . lastOooUntil ?? null ;
10501057 } )
10511058 ) ;
10521059
@@ -1083,9 +1090,18 @@ const getMissedProgressUpdatesUsers = async (options = {}) => {
10831090
10841091 await Promise . all ( progressCountPromise ) ;
10851092
1093+ const gracePeriodCutoff = Date . now ( ) - convertDaysToMilliseconds ( POST_OOO_GRACE_PERIOD_IN_DAYS ) ;
10861094 for ( const [ userId , userData ] of usersMap . entries ( ) ) {
10871095 const discordUserData = discordUserMap . get ( userData . discordId ) ;
10881096 const isDiscordMember = ! ! discordUserData ;
1097+ const normalizedLastOooUntil = normalizeTimestamp ( userData . lastOooUntil ) ;
1098+ const isWithinGracePeriod = normalizedLastOooUntil !== null && normalizedLastOooUntil >= gracePeriodCutoff ;
1099+
1100+ if ( userData . latestProgressCount === 0 && ( userData . isOOO || isWithinGracePeriod ) ) {
1101+ stats . filteredByOoo ++ ;
1102+ usersMap . delete ( userId ) ;
1103+ continue ;
1104+ }
10891105 const shouldAddRole =
10901106 userData . latestProgressCount === 0 &&
10911107 ! userData . isOOO &&
0 commit comments