From 639ca1d287e12465a3dda74d520fe63dde0d0359 Mon Sep 17 00:00:00 2001 From: Ajeyakrishna <98796547+Ajeyakrishna-k@users.noreply.github.com> Date: Fri, 15 Dec 2023 20:47:26 +0530 Subject: [PATCH] Fix missed updates script (#1787) * fix: minor changes to missed updates * fix: adds an extra status to query * fix: use the correct function for time conversion * chore: update test case data * feat: update response for missed updates details * chore: updates response messages for tests --- controllers/tasks.js | 10 ++++++++-- models/discordactions.js | 12 ++++++------ test/integration/tasks.test.js | 20 +++++++++++++------- test/unit/models/discordactions.test.js | 4 ++-- utils/tasks.js | 9 ++++----- utils/time.js | 2 +- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/controllers/tasks.js b/controllers/tasks.js index 44de1405f..45238d807 100644 --- a/controllers/tasks.js +++ b/controllers/tasks.js @@ -492,9 +492,15 @@ const getUsersHandler = async (req, res) => { size: size && Number.parseInt(size), excludedDates: date?.map((date) => Number.parseInt(date.value)), excludedDays: weekday?.map((day) => daysOfWeek[day.value]), - dateGap: !!daysGap && daysGap.length === 1 && Number.parseInt(daysGap[0].value), + dateGap: !!daysGap && daysGap.length === 1 ? Number.parseInt(daysGap[0].value) : null, }); - return res.status(200).json(response); + + if (response.error) { + return res.boom.badRequest(response.message); + } + return res + .status(200) + .json({ message: "Discord details of users with status missed updates fetched successfully", data: response }); } else { return res.boom.badRequest("Unknown type and query"); } diff --git a/models/discordactions.js b/models/discordactions.js index 2a7abf149..8adb45990 100644 --- a/models/discordactions.js +++ b/models/discordactions.js @@ -21,7 +21,7 @@ const discordMissedUpdatesRoleId = config.get("discordMissedUpdatesRoleId"); const userStatusModel = firestore.collection("usersStatus"); const usersUtils = require("../utils/users"); const { getUsersBasedOnFilter, fetchUser } = require("./users"); -const { convertDaysToMilliseconds } = require("../utils/time"); +const { convertDaysToMilliseconds, convertMillisToSeconds } = require("../utils/time"); const { chunks } = require("../utils/array"); const tasksModel = firestore.collection("tasks"); const { FIRESTORE_IN_CLAUSE_SIZE } = require("../constants/users"); @@ -874,13 +874,12 @@ const getMissedProgressUpdatesUsers = async (options = {}) => { } } - let taskQuery = buildTasksQueryForMissedUpdates(gapWindowStart, size); + let taskQuery = buildTasksQueryForMissedUpdates(size); if (cursor) { const data = await tasksModel.doc(cursor).get(); if (!data.data()) { return { - statusCode: 400, error: "Bad Request", message: `Invalid cursor: ${cursor}`, }; @@ -894,7 +893,9 @@ const getMissedProgressUpdatesUsers = async (options = {}) => { stats.tasks = tasksQuerySnapshot.size; tasksQuerySnapshot.forEach((doc) => { - const taskAssignee = doc.data().assignee; + const { assignee: taskAssignee, startedOn: taskStartedOn } = doc.data(); + if (!taskAssignee || taskStartedOn >= convertMillisToSeconds(gapWindowStart)) return; + const taskId = doc.id; if (usersMap.has(taskAssignee)) { @@ -952,8 +953,7 @@ const getMissedProgressUpdatesUsers = async (options = {}) => { }); }); - const discordUserList = await Promise.all(discordUsersPromise); - + const discordUserList = await discordUsersPromise; const discordUserMap = new Map(); discordUserList.forEach((discordUser) => { const discordUserData = { isBot: !!discordUser.user.bot }; diff --git a/test/integration/tasks.test.js b/test/integration/tasks.test.js index a288b3a77..57e009a6c 100644 --- a/test/integration/tasks.test.js +++ b/test/integration/tasks.test.js @@ -1397,9 +1397,12 @@ describe("Tasks", function () { .query({ q: `status:${tasksUsersStatus.MISSED_UPDATES}` }) .set("Authorization", `Bearer ${jwtToken}`); expect(response.body).to.be.deep.equal({ - usersToAddRole: [activeUserWithProgressUpdates.discordId], - tasks: 4, - missedUpdatesTasks: 3, + message: "Discord details of users with status missed updates fetched successfully", + data: { + usersToAddRole: [activeUserWithProgressUpdates.discordId], + tasks: 4, + missedUpdatesTasks: 3, + }, }); expect(response.status).to.be.equal(200); }); @@ -1408,14 +1411,17 @@ describe("Tasks", function () { .request(app) .get("/tasks/users/discord") .query({ - size: 3, + size: 5, q: `status:${tasksUsersStatus.MISSED_UPDATES} -weekday:sun -weekday:mon -weekday:tue -weekday:wed -weekday:thu -weekday:fri -date:231423432 -days-count:4`, }) .set("Authorization", `Bearer ${jwtToken}`); expect(response.body).to.be.deep.equal({ - usersToAddRole: [], - tasks: 0, - missedUpdatesTasks: 0, + message: "Discord details of users with status missed updates fetched successfully", + data: { + usersToAddRole: [], + tasks: 4, + missedUpdatesTasks: 0, + }, }); expect(response.status).to.be.equal(200); }); diff --git a/test/unit/models/discordactions.test.js b/test/unit/models/discordactions.test.js index ac453e3d3..2042f224c 100644 --- a/test/unit/models/discordactions.test.js +++ b/test/unit/models/discordactions.test.js @@ -682,7 +682,7 @@ describe("discordactions", function () { }); expect(result).to.be.an("object"); expect(result).to.be.deep.equal({ - tasks: 0, + tasks: 4, missedUpdatesTasks: 0, usersToAddRole: [], }); @@ -716,7 +716,7 @@ describe("discordactions", function () { }); expect(result).to.be.an("object"); expect(result).to.be.deep.equal({ - tasks: 1, + tasks: 5, missedUpdatesTasks: 0, usersToAddRole: [], }); diff --git a/utils/tasks.js b/utils/tasks.js index c04107ce0..f1b4616c6 100644 --- a/utils/tasks.js +++ b/utils/tasks.js @@ -1,8 +1,7 @@ const { getUsername, getUserId, getParticipantUsernames, getParticipantUserIds } = require("./users"); -const { TASK_TYPE, MAPPED_TASK_STATUS, COMPLETED_TASK_STATUS } = require("../constants/tasks"); +const { TASK_TYPE, MAPPED_TASK_STATUS, COMPLETED_TASK_STATUS, TASK_STATUS } = require("../constants/tasks"); const fireStore = require("../utils/firestore"); const tasksModel = fireStore.collection("tasks"); -const { convertMillisToSeconds } = require("./time"); const fromFirestoreData = async (task) => { if (!task) { @@ -113,11 +112,11 @@ const parseSearchQuery = (queryString) => { return searchParams; }; -const buildTasksQueryForMissedUpdates = (startedOnTimestamp, size) => { +const buildTasksQueryForMissedUpdates = (size) => { const completedTasksStatusList = Object.values(COMPLETED_TASK_STATUS); return tasksModel - .where("status", "not-in", completedTasksStatusList) - .where("startedOn", "<", convertMillisToSeconds(startedOnTimestamp)) + .where("status", "not-in", [...completedTasksStatusList, TASK_STATUS.AVAILABLE]) + .orderBy("status") .orderBy("assignee") .limit(size); }; diff --git a/utils/time.js b/utils/time.js index dcb7db7ee..5910a7bdc 100644 --- a/utils/time.js +++ b/utils/time.js @@ -31,7 +31,7 @@ const convertDaysToMilliseconds = (days) => { */ const convertMillisToSeconds = (milliseconds) => { if (typeof milliseconds !== "number") throw Error("Not a number"); - return milliseconds / 1000; + return Math.round(milliseconds / 1000); }; /** * Returns time in seconds of timestamp after given duration