Skip to content

Commit

Permalink
2005 reimplement orphan tasks filteration logic (#2013)
Browse files Browse the repository at this point in the history
* Feat: filter orphan tasks while archiving users

* add: tests

* nit: batch update the task documents

* add DONE status while fetching task docs

* nit: remove extra line
  • Loading branch information
MehulKChaudhari authored Apr 17, 2024
1 parent ea11f83 commit 32b3e35
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 3 deletions.
12 changes: 11 additions & 1 deletion controllers/external-accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const { addOrUpdate, getUsersByRole, updateUsersInBatch } = require("../models/u
const { retrieveDiscordUsers, fetchUsersForKeyValues } = require("../services/dataAccessLayer");
const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../constants/external-accounts");
const logger = require("../utils/logger");
const { markUnDoneTasksOfArchivedUsersBacklog } = require("../models/tasks");

const addExternalAccountData = async (req, res) => {
const createdOn = Date.now();
Expand Down Expand Up @@ -182,6 +183,7 @@ const newSyncExternalAccountData = async (req, res) => {
discordUserData.forEach((discordUser) => discordUserIdSet.add(discordUser.user.id));

let updateUserList = [];
const archiveUserList = [];

for (const rdsUser of unArchivedRdsUsersData) {
let userData = {};
Expand Down Expand Up @@ -210,10 +212,13 @@ const newSyncExternalAccountData = async (req, res) => {
archived: true,
},
};
archiveUserList.push({ id: rdsUser.id }); // adding users which are to be archived
}
updateUserList.push(userData);
}
const unArchiveUsersInBatchPromise = updateUsersInBatch(updateUserList);
// Mark un done tasks assigned to archived users BACKLOG
const markTasksBacklogPromise = markUnDoneTasksOfArchivedUsersBacklog(archiveUserList);

const archivedUsersInDiscordList = await fetchUsersForKeyValues("discordId", [...discordUserIdSet]);
totalUsersProcessed += archivedUsersInDiscordList.length;
Expand All @@ -233,14 +238,19 @@ const newSyncExternalAccountData = async (req, res) => {
}
const archiveUsersInBatchPromise = updateUsersInBatch(updateUserList);

await Promise.all([unArchiveUsersInBatchPromise, archiveUsersInBatchPromise]);
const [, , backlogTasksCount] = await Promise.all([
unArchiveUsersInBatchPromise,
archiveUsersInBatchPromise,
markTasksBacklogPromise,
]);

return res.json({
message: "Data Sync Complete",
usersArchivedCount: usersArchivedCount,
usersUnArchivedCount: usersUnArchivedCount,
totalUsersProcessed: totalUsersProcessed,
rdsDiscordServerUsers: discordUserData.length,
backlogTasksCount: backlogTasksCount,
});
} catch (err) {
logger.error("Error in syncing users discord joined at");
Expand Down
39 changes: 37 additions & 2 deletions models/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,18 @@ const { chunks } = require("../utils/array");
const { DOCUMENT_WRITE_SIZE } = require("../constants/constants");
const { fromFirestoreData, toFirestoreData, buildTasks } = require("../utils/tasks");
const { TASK_TYPE, TASK_STATUS, TASK_STATUS_OLD, TASK_SIZE } = require("../constants/tasks");
const { IN_PROGRESS, NEEDS_REVIEW, IN_REVIEW, ASSIGNED, BLOCKED, SMOKE_TESTING, COMPLETED, SANITY_CHECK, BACKLOG } =
TASK_STATUS;
const {
IN_PROGRESS,
NEEDS_REVIEW,
IN_REVIEW,
ASSIGNED,
BLOCKED,
SMOKE_TESTING,
COMPLETED,
SANITY_CHECK,
BACKLOG,
DONE,
} = TASK_STATUS;
const { OLD_ACTIVE, OLD_BLOCKED, OLD_PENDING, OLD_COMPLETED } = TASK_STATUS_OLD;
const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages");

Expand Down Expand Up @@ -667,6 +677,30 @@ const updateOrphanTasksStatus = async (lastOrphanTasksFilterationTimestamp) => {
}
};

const markUnDoneTasksOfArchivedUsersBacklog = async (users) => {
try {
let orphanTasksUpdatedCount = 0;
const batch = firestore.batch();
for (const user of users) {
const tasksQuerySnapshot = await tasksModel
.where("assigneeId", "==", user.id)
.where("status", "not-in", [COMPLETED, DONE, BACKLOG])
.get();
tasksQuerySnapshot.forEach(async (taskDoc) => {
orphanTasksUpdatedCount++;
const taskRef = tasksModel.doc(taskDoc.id);
batch.update(taskRef, { status: BACKLOG, updated_at: Date.now() });
});
}

await batch.commit();
return orphanTasksUpdatedCount;
} catch (error) {
logger.error("Error marking tasks as backlog:", error);
throw error;
}
};

module.exports = {
updateTask,
fetchTasks,
Expand All @@ -685,4 +719,5 @@ module.exports = {
getOverdueTasks,
updateTaskStatus,
updateOrphanTasksStatus,
markUnDoneTasksOfArchivedUsersBacklog,
};
1 change: 1 addition & 0 deletions test/fixtures/discordResponse/discord-response.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ const usersFromRds = [
in_discord: false,
archived: false,
},
id: "nonArchivedAndNotInDiscord",
},
];

Expand Down
20 changes: 20 additions & 0 deletions test/integration/external-accounts.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages");
const firestore = require("../../utils/firestore");
const userData = require("../fixtures/user/user")();
const userModel = firestore.collection("users");
const tasksModel = firestore.collection("tasks");
const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../../constants/external-accounts");
chai.use(chaiHttp);
const cookieName = config.get("userToken.cookieName");
Expand Down Expand Up @@ -309,6 +310,21 @@ describe("External Accounts", function () {
it("Should Archive Users With Archived as False and Not in RDS Discord Server", async function () {
await userModel.add(usersFromRds[4]); // nonArchivedAndNotInDiscord

const userId = usersFromRds[4].id;
const task1 = {
assigneeId: userId,
status: "ACTIVE",
};
const task2 = {
assigneeId: userId,
status: "COMPLETED",
};
const task3 = {
assigneeId: userId,
status: "IN_PROGRESS",
};
await Promise.all([tasksModel.add(task1), tasksModel.add(task2), tasksModel.add(task3)]);

fetchStub.returns(
Promise.resolve({
status: 200,
Expand All @@ -329,6 +345,7 @@ describe("External Accounts", function () {
usersUnArchivedCount: 0,
totalUsersProcessed: 2,
rdsDiscordServerUsers: 3,
backlogTasksCount: 2,
});
});

Expand All @@ -354,6 +371,7 @@ describe("External Accounts", function () {
usersUnArchivedCount: 0,
totalUsersProcessed: 2,
rdsDiscordServerUsers: 3,
backlogTasksCount: 0,
});
});

Expand All @@ -379,6 +397,7 @@ describe("External Accounts", function () {
usersUnArchivedCount: 1,
totalUsersProcessed: 2,
rdsDiscordServerUsers: 3,
backlogTasksCount: 0,
});
});

Expand All @@ -404,6 +423,7 @@ describe("External Accounts", function () {
usersUnArchivedCount: 0,
totalUsersProcessed: 1,
rdsDiscordServerUsers: 3,
backlogTasksCount: 0,
});
});

Expand Down

0 comments on commit 32b3e35

Please sign in to comment.