Skip to content

Commit 528a586

Browse files
authored
include OOO completed users in status update (#1385)
1 parent 6a19eb7 commit 528a586

File tree

5 files changed

+93
-23
lines changed

5 files changed

+93
-23
lines changed

models/userStatus.js

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
checkIfUserHasLiveTasks,
1212
generateErrorResponse,
1313
generateNewStatus,
14+
getNextDayTimeStamp,
1415
} = require("../utils/userStatus");
1516
const { TASK_STATUS } = require("../constants/tasks");
1617
const userStatusModel = firestore.collection("usersStatus");
@@ -371,7 +372,7 @@ const batchUpdateUsersStatus = async (users) => {
371372
const statusToUpdate = {
372373
state,
373374
message: "",
374-
from: currentTimeStamp,
375+
from: new Date().setUTCHours(0, 0, 0, 0),
375376
until: "",
376377
updatedAt: currentTimeStamp,
377378
};
@@ -391,8 +392,7 @@ const batchUpdateUsersStatus = async (users) => {
391392
if (currentState === state) {
392393
currentState === userState.ACTIVE ? summary.activeUsersUnaltered++ : summary.idleUsersUnaltered++;
393394
continue;
394-
}
395-
if (currentState === userState.ONBOARDING) {
395+
} else if (currentState === userState.ONBOARDING) {
396396
const docRef = userStatusModel.doc(id);
397397
if (state === userState.ACTIVE) {
398398
const updatedStatusData = {
@@ -403,20 +403,35 @@ const batchUpdateUsersStatus = async (users) => {
403403
} else {
404404
summary.onboardingUsersUnaltered++;
405405
}
406-
} else {
406+
} else if (currentState === userState.OOO) {
407+
const docRef = userStatusModel.doc(id);
407408
state === userState.ACTIVE ? summary.activeUsersAltered++ : summary.idleUsersAltered++;
409+
410+
const currentDate = new Date();
411+
const untilDate = new Date(until);
412+
413+
const timeDifferenceMilliseconds = currentDate.setUTCHours(0, 0, 0, 0) - untilDate.setUTCHours(0, 0, 0, 0);
414+
const timeDifferenceDays = Math.floor(timeDifferenceMilliseconds / (24 * 60 * 60 * 1000));
415+
416+
if (timeDifferenceDays >= 1) {
417+
batch.update(docRef, {
418+
currentStatus: statusToUpdate,
419+
});
420+
} else {
421+
const getNextDayAfterUntil = getNextDayTimeStamp(until);
422+
batch.update(docRef, {
423+
futureStatus: {
424+
...statusToUpdate,
425+
from: getNextDayAfterUntil,
426+
},
427+
});
428+
}
429+
} else {
408430
const docRef = userStatusModel.doc(id);
409-
const updatedStatusData =
410-
currentState === userState.OOO
411-
? {
412-
futureStatus: {
413-
...statusToUpdate,
414-
from: until,
415-
},
416-
}
417-
: {
418-
currentStatus: statusToUpdate,
419-
};
431+
state === userState.ACTIVE ? summary.activeUsersAltered++ : summary.idleUsersAltered++;
432+
const updatedStatusData = {
433+
currentStatus: statusToUpdate,
434+
};
420435
batch.update(docRef, updatedStatusData);
421436
}
422437
}

test/integration/taskBasedStatusUpdate.test.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,8 @@ describe("Task Based Status Updates", function () {
321321
});
322322

323323
describe("PATCH Integration tests for Changing the status to IDLE based on users list passed", function () {
324-
let [userId0, userId1, userId2, userId3, userId4, userId5, userId6, userId7, userId8, userId9] = [];
324+
let [userId0, userId1, userId2, userId3, userId4, userId5, userId6, userId7, userId8, userId9, userId10, userId11] =
325+
[];
325326
let superUserJwt;
326327
let listUsers;
327328
const reqBody = {};
@@ -337,6 +338,8 @@ describe("Task Based Status Updates", function () {
337338
userId7 = await addUser(userData[7]);
338339
userId8 = await addUser(userData[8]);
339340
userId9 = await addUser(userData[9]);
341+
userId10 = await addUser(userData[10]);
342+
userId11 = await addUser(userData[11]);
340343
superUserJwt = authService.generateAuthToken({ userId: userId4 });
341344
listUsers = [
342345
{ userId: userId0, state: "IDLE" },
@@ -349,6 +352,8 @@ describe("Task Based Status Updates", function () {
349352
{ userId: userId7, state: "ACTIVE" },
350353
{ userId: userId8, state: "ACTIVE" },
351354
{ userId: userId9, state: "ACTIVE" },
355+
{ userId: userId10, state: "ACTIVE" },
356+
{ userId: userId11, state: "IDLE" },
352357
];
353358
reqBody.users = listUsers;
354359
await userStatusModel.doc("userStatus000").set(generateStatusDataForState(userId0, userState.ACTIVE));
@@ -359,6 +364,14 @@ describe("Task Based Status Updates", function () {
359364
await userStatusModel.doc("userStatus006").set(generateStatusDataForState(userId6, userState.OOO));
360365
await userStatusModel.doc("userStatus007").set(generateStatusDataForState(userId7, userState.IDLE));
361366
await userStatusModel.doc("userStatus008").set(generateStatusDataForState(userId8, userState.ONBOARDING));
367+
const oooStateCompletedStatus = generateStatusDataForState(userId10, userState.OOO);
368+
oooStateCompletedStatus.currentStatus.from =
369+
oooStateCompletedStatus.currentStatus.from - 20 * 24 * 60 * 60 * 1000;
370+
oooStateCompletedStatus.currentStatus.until =
371+
oooStateCompletedStatus.currentStatus.until - 10 * 24 * 60 * 60 * 1000;
372+
await userStatusModel.doc("userStatus010").set(oooStateCompletedStatus);
373+
oooStateCompletedStatus.userId = userId11;
374+
await userStatusModel.doc("userStatus011").set(oooStateCompletedStatus);
362375
});
363376

364377
afterEach(async function () {
@@ -383,13 +396,13 @@ describe("Task Based Status Updates", function () {
383396
"idleUsersAltered",
384397
"idleUsersUnaltered"
385398
);
386-
expect(response.usersCount).to.equal(10);
399+
expect(response.usersCount).to.equal(12);
387400
expect(response.unprocessedUsers).to.equal(0);
388401
expect(response.onboardingUsersAltered).to.equal(1);
389402
expect(response.onboardingUsersUnaltered).to.equal(1);
390-
expect(response.activeUsersAltered).to.equal(3);
403+
expect(response.activeUsersAltered).to.equal(4);
391404
expect(response.activeUsersUnaltered).to.equal(1);
392-
expect(response.idleUsersAltered).to.equal(3);
405+
expect(response.idleUsersAltered).to.equal(4);
393406
expect(response.idleUsersUnaltered).to.equal(1);
394407

395408
const userStatus000Data = (await userStatusModel.doc("userStatus000").get()).data();
@@ -418,6 +431,10 @@ describe("Task Based Status Updates", function () {
418431
const [userStatus009Doc] = userStatus009SnapShot.docs;
419432
const userStatus009Data = userStatus009Doc.data();
420433
expect(userStatus009Data.currentStatus.state).to.equal(userState.ACTIVE);
434+
const userStatus010Data = (await userStatusModel.doc("userStatus010").get()).data();
435+
expect(userStatus010Data.currentStatus.state).to.equal(userState.ACTIVE);
436+
const userStatus011Data = (await userStatusModel.doc("userStatus011").get()).data();
437+
expect(userStatus011Data.currentStatus.state).to.equal(userState.IDLE);
421438
});
422439

423440
it("should throw an error if users firestore batch operations fail", async function () {

test/unit/models/taskBasedStatusUpdate.test.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,8 @@ describe("Update Status based on task update", function () {
226226
});
227227

228228
describe("Test the Model Function for Changing the status to IDLE based on users list passed", function () {
229-
let [userId0, userId1, userId2, userId3, userId4, userId5, userId6, userId7, userId8, userId9] = [];
229+
let [userId0, userId1, userId2, userId3, userId4, userId5, userId6, userId7, userId8, userId9, userId10, userId11] =
230+
[];
230231
let listUsers;
231232

232233
beforeEach(async function () {
@@ -241,6 +242,8 @@ describe("Update Status based on task update", function () {
241242
userId7 = await addUser(userArr[7]);
242243
userId8 = await addUser(userArr[8]);
243244
userId9 = await addUser(userArr[9]);
245+
userId10 = await addUser(userArr[10]);
246+
userId11 = await addUser(userArr[11]);
244247
await userStatusModel.doc("userStatus000").set(generateStatusDataForState(userId0, userState.ACTIVE));
245248
await userStatusModel.doc("userStatus001").set(generateStatusDataForState(userId1, userState.OOO));
246249
await userStatusModel.doc("userStatus002").set(generateStatusDataForState(userId2, userState.IDLE));
@@ -249,6 +252,16 @@ describe("Update Status based on task update", function () {
249252
await userStatusModel.doc("userStatus006").set(generateStatusDataForState(userId6, userState.OOO));
250253
await userStatusModel.doc("userStatus007").set(generateStatusDataForState(userId7, userState.IDLE));
251254
await userStatusModel.doc("userStatus008").set(generateStatusDataForState(userId8, userState.ONBOARDING));
255+
256+
const oooStateCompletedStatus = generateStatusDataForState(userId10, userState.OOO);
257+
oooStateCompletedStatus.currentStatus.from =
258+
oooStateCompletedStatus.currentStatus.from - 20 * 24 * 60 * 60 * 1000;
259+
oooStateCompletedStatus.currentStatus.until =
260+
oooStateCompletedStatus.currentStatus.until - 10 * 24 * 60 * 60 * 1000;
261+
await userStatusModel.doc("userStatus010").set(oooStateCompletedStatus);
262+
oooStateCompletedStatus.userId = userId11;
263+
await userStatusModel.doc("userStatus011").set(oooStateCompletedStatus);
264+
252265
listUsers = [
253266
{ userId: userId0, state: "IDLE" },
254267
{ userId: userId1, state: "IDLE" },
@@ -260,6 +273,8 @@ describe("Update Status based on task update", function () {
260273
{ userId: userId7, state: "ACTIVE" },
261274
{ userId: userId8, state: "ACTIVE" },
262275
{ userId: userId9, state: "ACTIVE" },
276+
{ userId: userId10, state: "ACTIVE" },
277+
{ userId: userId11, state: "IDLE" },
263278
];
264279
});
265280

@@ -280,13 +295,13 @@ describe("Update Status based on task update", function () {
280295
"idleUsersAltered",
281296
"idleUsersUnaltered"
282297
);
283-
expect(result.usersCount).to.equal(10);
298+
expect(result.usersCount).to.equal(12);
284299
expect(result.unprocessedUsers).to.equal(0);
285300
expect(result.onboardingUsersAltered).to.equal(1);
286301
expect(result.onboardingUsersUnaltered).to.equal(1);
287-
expect(result.activeUsersAltered).to.equal(3);
302+
expect(result.activeUsersAltered).to.equal(4);
288303
expect(result.activeUsersUnaltered).to.equal(1);
289-
expect(result.idleUsersAltered).to.equal(3);
304+
expect(result.idleUsersAltered).to.equal(4);
290305
expect(result.idleUsersUnaltered).to.equal(1);
291306
const userStatus000Data = (await userStatusModel.doc("userStatus000").get()).data();
292307
expect(userStatus000Data.currentStatus.state).to.equal(userState.IDLE);
@@ -314,6 +329,10 @@ describe("Update Status based on task update", function () {
314329
const [userStatus009Doc] = userStatus009SnapShot.docs;
315330
const userStatus009Data = userStatus009Doc.data();
316331
expect(userStatus009Data.currentStatus.state).to.equal(userState.ACTIVE);
332+
const userStatus010Data = (await userStatusModel.doc("userStatus010").get()).data();
333+
expect(userStatus010Data.currentStatus.state).to.equal(userState.ACTIVE);
334+
const userStatus011Data = (await userStatusModel.doc("userStatus011").get()).data();
335+
expect(userStatus011Data.currentStatus.state).to.equal(userState.IDLE);
317336
});
318337

319338
it("should throw an error if users firestore batch operations fail", async function () {

test/unit/utils/taskBasedStatusUpdates.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
createUserStatusWithState,
1212
updateCurrentStatusToState,
1313
updateFutureStatusToState,
14+
getNextDayTimeStamp,
1415
} = require("../../../utils/userStatus");
1516

1617
describe("Task Based User Status Update Util Functions", function () {
@@ -284,4 +285,13 @@ describe("Task Based User Status Update Util Functions", function () {
284285
}
285286
});
286287
});
288+
289+
describe("getNextDayTimeStamp", function () {
290+
it("should return the correct timestamp for the next day", function () {
291+
const inputTimestamp = new Date("2023-08-07T12:00:00Z").getTime();
292+
const expectedTimestamp = new Date("2023-08-08T00:00:00Z").getTime();
293+
const result = getNextDayTimeStamp(inputTimestamp);
294+
expect(result).to.equal(expectedTimestamp);
295+
});
296+
});
287297
});

utils/userStatus.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,14 @@ const generateErrorResponse = (message) => {
294294
};
295295
};
296296

297+
const getNextDayTimeStamp = (timeStamp) => {
298+
const currentDateTime = new Date(timeStamp);
299+
const nextDateDateTime = new Date(currentDateTime);
300+
nextDateDateTime.setDate(currentDateTime.getDate() + 1);
301+
nextDateDateTime.setUTCHours(0, 0, 0, 0);
302+
return nextDateDateTime.getTime();
303+
};
304+
297305
module.exports = {
298306
getUserIdBasedOnRoute,
299307
getTomorrowTimeStamp,
@@ -307,4 +315,5 @@ module.exports = {
307315
checkIfUserHasLiveTasks,
308316
generateErrorResponse,
309317
generateNewStatus,
318+
getNextDayTimeStamp,
310319
};

0 commit comments

Comments
 (0)