Skip to content

Commit a244d76

Browse files
chore: refactors and fix test
1 parent 410c03d commit a244d76

File tree

4 files changed

+45
-38
lines changed

4 files changed

+45
-38
lines changed

models/discordactions.js

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,13 @@ const discordMissedUpdatesRoleId = config.get("discordMissedUpdatesRoleId");
2121
const userStatusModel = firestore.collection("usersStatus");
2222
const usersUtils = require("../utils/users");
2323
const { getUsersBasedOnFilter, fetchUser } = require("./users");
24-
const {
25-
convertDaysToMilliseconds,
26-
convertMillisToSeconds,
27-
convertTimestampToUTCStartOrEndOfDay,
28-
} = require("../utils/time");
24+
const { convertDaysToMilliseconds } = require("../utils/time");
2925
const { chunks } = require("../utils/array");
3026
const tasksModel = firestore.collection("tasks");
31-
const progressesModel = firestore.collection("progresses");
32-
const { COMPLETED_TASK_STATUS } = require("../constants/tasks.ts");
3327
const { FIRESTORE_IN_CLAUSE_SIZE } = require("../constants/users");
3428
const discordService = require("../services/discordService");
29+
const { buildTasksQueryForMissedUpdates } = require("../utils/tasks");
30+
const { buildProgressQueryForMissedUpdates } = require("../utils/progresses");
3531

3632
/**
3733
*
@@ -844,7 +840,7 @@ const updateUsersWith31DaysPlusOnboarding = async () => {
844840
}
845841
};
846842

847-
const addMissedProgressUpdatesRoleInDiscord = async (options = {}) => {
843+
const getMissedProgressUpdatesUsers = async (options = {}) => {
848844
const { cursor, size = 500, excludedDates = [], dateGap = 3 } = options;
849845
const stats = {
850846
tasks: 0,
@@ -854,21 +850,15 @@ const addMissedProgressUpdatesRoleInDiscord = async (options = {}) => {
854850
const discordUsersPromise = discordService.getDiscordMembers();
855851
const missedUpdatesRoleId = discordMissedUpdatesRoleId;
856852

857-
const completedTasksStatusList = Object.values(COMPLETED_TASK_STATUS);
858853
let gapWindowStart = Date.now() - convertDaysToMilliseconds(dateGap);
859854
const gapWindowEnd = Date.now();
860-
861855
excludedDates.forEach((timestamp) => {
862856
if (timestamp > gapWindowStart && timestamp < gapWindowEnd) {
863857
gapWindowStart -= convertDaysToMilliseconds(1);
864858
}
865859
});
866860

867-
let taskQuery = tasksModel
868-
.where("status", "not-in", completedTasksStatusList)
869-
.where("startedOn", "<", convertMillisToSeconds(gapWindowStart))
870-
.orderBy("assignee") // this order by will eliminate the documents which has no assignee field. https://firebase.google.com/docs/firestore/query-data/order-limit-data#limitations
871-
.limit(size);
861+
let taskQuery = buildTasksQueryForMissedUpdates(gapWindowStart, size);
872862

873863
if (cursor) {
874864
const data = await tasksModel.doc(cursor).get();
@@ -902,13 +892,8 @@ const addMissedProgressUpdatesRoleInDiscord = async (options = {}) => {
902892
});
903893
}
904894
const updateTasksIdMap = async () => {
905-
const progressSnapshot = await progressesModel
906-
.where("type", "==", "task")
907-
.where("taskId", "==", taskId)
908-
.where("date", ">=", convertTimestampToUTCStartOrEndOfDay(gapWindowStart))
909-
.where("date", "<=", convertTimestampToUTCStartOrEndOfDay(gapWindowEnd, true))
910-
.count()
911-
.get();
895+
const progressQuery = buildProgressQueryForMissedUpdates(taskId, gapWindowStart, gapWindowEnd);
896+
const progressSnapshot = await progressQuery.get();
912897
const userData = usersMap.get(taskAssignee);
913898
userData.latestProgressCount = Math.min(progressSnapshot.data().count, userData.latestProgressCount);
914899

@@ -1055,7 +1040,7 @@ module.exports = {
10551040
updateUsersNicknameStatus,
10561041
updateIdle7dUsersOnDiscord,
10571042
updateUsersWith31DaysPlusOnboarding,
1058-
addMissedProgressUpdatesRoleInDiscord,
1043+
getMissedProgressUpdatesUsers,
10591044
getUserDiscordInvite,
10601045
addInviteToInviteModel,
10611046
};

test/unit/models/discordactions.test.js

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const {
2727
enrichGroupDataWithMembershipInfo,
2828
fetchGroupToUserMapping,
2929
updateUsersNicknameStatus,
30-
addMissedProgressUpdatesRoleInDiscord,
30+
getMissedProgressUpdatesUsers,
3131
addInviteToInviteModel,
3232
getUserDiscordInvite,
3333
} = require("../../../models/discordactions");
@@ -591,7 +591,7 @@ describe("discordactions", function () {
591591
}).timeout(10000);
592592
});
593593

594-
describe("addMissedProgressUpdatesRoleInDiscord", function () {
594+
describe("getMissedProgressUpdatesUsers", function () {
595595
let activeUserWithProgressUpdates;
596596
let idleUser;
597597
let userNotInDiscord;
@@ -639,10 +639,6 @@ describe("discordactions", function () {
639639
date.setDate(date.getDate() - 1);
640640
const progressData = stubbedModelTaskProgressData(null, taskIdList[2], date.getTime(), date.valueOf());
641641
progressDataList.push(progressData);
642-
const date2 = new Date();
643-
date2.setDate(date2.getDate() - 3);
644-
const progressData2 = stubbedModelTaskProgressData(null, taskIdList[2], date2.getTime(), date2.valueOf());
645-
progressDataList.push(progressData2);
646642

647643
await Promise.all(progressDataList.map(async (progress) => await createProgressDocument(progress)));
648644

@@ -653,7 +649,7 @@ describe("discordactions", function () {
653649
await cleanDb();
654650
});
655651
it("should list of users who missed updating progress", async function () {
656-
const result = await addMissedProgressUpdatesRoleInDiscord();
652+
const result = await getMissedProgressUpdatesUsers();
657653
expect(result).to.be.an("object");
658654
expect(result).to.be.deep.equal({
659655
tasks: 4,
@@ -663,7 +659,7 @@ describe("discordactions", function () {
663659
});
664660

665661
it("should not list of users who are not active and who missed updating progress", async function () {
666-
const result = await addMissedProgressUpdatesRoleInDiscord();
662+
const result = await getMissedProgressUpdatesUsers();
667663
expect(result).to.be.an("object");
668664
expect(result.usersToAddRole).to.not.contain(idleUser.discordId);
669665
expect(result.usersToAddRole).to.not.contain(userNotInDiscord.discordId);
@@ -673,13 +669,13 @@ describe("discordactions", function () {
673669
const date = new Date();
674670
date.setDate(date.getDate() - 1);
675671
const date2 = new Date();
676-
date.setDate(date2.getDate() - 2);
672+
date2.setDate(date2.getDate() - 2);
677673
const date3 = new Date();
678-
date.setDate(date3.getDate() - 3);
674+
date3.setDate(date3.getDate() - 3);
679675
const date4 = new Date();
680-
date.setDate(date4.getDate() - 4);
676+
date4.setDate(date4.getDate() - 4);
681677
// this should now only get users who have not provided any update in last 7 days instead of 3;
682-
const result = await addMissedProgressUpdatesRoleInDiscord({
678+
const result = await getMissedProgressUpdatesUsers({
683679
excludedDates: [date.valueOf(), date2.valueOf(), date3.valueOf(), date4.valueOf()],
684680
});
685681
expect(result).to.be.an("object");
@@ -691,17 +687,17 @@ describe("discordactions", function () {
691687
});
692688

693689
it("should process only 1 task when size is passed as 1", async function () {
694-
const result = await addMissedProgressUpdatesRoleInDiscord({ size: 1 });
690+
const result = await getMissedProgressUpdatesUsers({ size: 1 });
695691

696692
expect(result).to.be.an("object");
697693
expect(result.tasks).to.be.equal(1);
698694
});
699695
it("should fetch process tasks when cursor is passed", async function () {
700-
const result = await addMissedProgressUpdatesRoleInDiscord({ size: 4 });
696+
const result = await getMissedProgressUpdatesUsers({ size: 4 });
701697

702698
expect(result).to.be.an("object");
703699
expect(result).to.haveOwnProperty("cursor");
704-
const nextResult = await addMissedProgressUpdatesRoleInDiscord({ size: 4, cursor: result.cursor });
700+
const nextResult = await getMissedProgressUpdatesUsers({ size: 4, cursor: result.cursor });
705701
expect(nextResult).to.be.an("object");
706702
expect(nextResult).to.not.haveOwnProperty("cursor");
707703
});

utils/progresses.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ const { NotFound } = require("http-errors");
22
const { fetchTask } = require("../models/tasks");
33
const { fetchUser } = require("../models/users");
44
const fireStore = require("../utils/firestore");
5+
const progressesModel = fireStore.collection("progresses");
6+
57
const {
68
PROGRESSES_RESPONSE_MESSAGES: { PROGRESS_DOCUMENT_NOT_FOUND },
79
MILLISECONDS_IN_DAY,
810
PROGRESS_VALID_SORT_FIELDS,
911
} = require("../constants/progresses");
12+
const { convertTimestampToUTCStartOrEndOfDay } = require("./time");
1013
const progressesCollection = fireStore.collection("progresses");
1114

1215
/**
@@ -211,6 +214,14 @@ const buildQueryToSearchProgressByDay = (pathParams) => {
211214
return query;
212215
};
213216

217+
const buildProgressQueryForMissedUpdates = (taskId, startTimestamp, endTimestamp) => {
218+
return progressesModel
219+
.where("type", "==", "task")
220+
.where("taskId", "==", taskId)
221+
.where("date", ">=", convertTimestampToUTCStartOrEndOfDay(startTimestamp))
222+
.where("date", "<=", convertTimestampToUTCStartOrEndOfDay(endTimestamp, true))
223+
.count();
224+
};
214225
module.exports = {
215226
getProgressDateTimestamp,
216227
buildQueryForPostingProgress,
@@ -222,4 +233,5 @@ module.exports = {
222233
buildRangeProgressQuery,
223234
getProgressRecords,
224235
buildQueryToSearchProgressByDay,
236+
buildProgressQueryForMissedUpdates,
225237
};

utils/tasks.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
const { getUsername, getUserId, getParticipantUsernames, getParticipantUserIds } = require("./users");
22
const { TASK_TYPE, MAPPED_TASK_STATUS } = require("../constants/tasks");
3+
const fireStore = require("../utils/firestore");
4+
const tasksModel = fireStore.collection("tasks");
5+
const { COMPLETED_TASK_STATUS } = require("../constants/tasks.ts");
6+
const { convertMillisToSeconds } = require("./time");
37

48
const fromFirestoreData = async (task) => {
59
if (!task) {
@@ -110,10 +114,20 @@ const parseSearchQuery = (queryString) => {
110114
return searchParams;
111115
};
112116

117+
const buildTasksQueryForMissedUpdates = (startedOnTimestamp, size) => {
118+
const completedTasksStatusList = Object.values(COMPLETED_TASK_STATUS);
119+
return tasksModel
120+
.where("status", "not-in", completedTasksStatusList)
121+
.where("startedOn", "<", convertMillisToSeconds(startedOnTimestamp))
122+
.orderBy("assignee")
123+
.limit(size);
124+
};
125+
113126
module.exports = {
114127
fromFirestoreData,
115128
toFirestoreData,
116129
buildTasks,
117130
transformQuery,
118131
parseSearchQuery,
132+
buildTasksQueryForMissedUpdates,
119133
};

0 commit comments

Comments
 (0)