Skip to content

Commit f5836f9

Browse files
Merge pull request #1717 from Real-Dev-Squad/develop
Dev to main sync
2 parents dd56658 + 93c06df commit f5836f9

File tree

4 files changed

+310
-11
lines changed

4 files changed

+310
-11
lines changed

controllers/tasks.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const { getPaginatedLink } = require("../utils/helper");
1212
const { updateUserStatusOnTaskUpdate, updateStatusOnTaskCompletion } = require("../models/userStatus");
1313
const dataAccess = require("../services/dataAccessLayer");
1414
const { parseSearchQuery } = require("../utils/tasks");
15+
const { addTaskCreatedAtAndUpdatedAtFields } = require("../services/tasks");
1516
/**
1617
* Creates new task
1718
*
@@ -24,9 +25,12 @@ const addNewTask = async (req, res) => {
2425
const { id: createdBy } = req.userData;
2526
const dependsOn = req.body.dependsOn;
2627
let userStatusUpdate;
28+
const timeStamp = Math.round(Date.now() / 1000);
2729
const body = {
2830
...req.body,
2931
createdBy,
32+
createdAt: timeStamp,
33+
updatedAt: timeStamp,
3034
};
3135
delete body.dependsOn;
3236
const { taskId, taskDetails } = await tasks.updateTask(body);
@@ -270,7 +274,7 @@ const updateTask = async (req, res) => {
270274
if (!task.taskData) {
271275
return res.boom.notFound("Task not found");
272276
}
273-
const requestData = { ...req.body };
277+
const requestData = { ...req.body, updatedAt: Math.round(Date.now() / 1000) };
274278
if (requestData?.assignee) {
275279
const user = await dataAccess.retrieveUsers({ username: requestData.assignee });
276280
if (!user.userExists) {
@@ -310,8 +314,10 @@ const updateTask = async (req, res) => {
310314
*/
311315
const updateTaskStatus = async (req, res, next) => {
312316
try {
317+
req.body.updatedAt = Math.round(new Date().getTime() / 1000);
313318
let userStatusUpdate;
314319
const taskId = req.params.id;
320+
const { userStatusFlag } = req.query;
315321
const { id: userId, username } = req.userData;
316322
const task = await tasks.fetchSelfTask(taskId, userId);
317323

@@ -320,18 +326,34 @@ const updateTaskStatus = async (req, res, next) => {
320326
if (task.taskData.status === TASK_STATUS.VERIFIED || req.body.status === TASK_STATUS.MERGED)
321327
return res.boom.forbidden("Status cannot be updated. Please contact admin.");
322328

323-
if (task.taskData.status === TASK_STATUS.DONE && req.body.percentCompleted < 100) {
324-
if (req.body.status === TASK_STATUS.DONE || !req.body.status) {
325-
return res.boom.badRequest("Task percentCompleted can't updated as status is DONE");
329+
if (userStatusFlag) {
330+
if (task.taskData.status === TASK_STATUS.DONE && req.body.percentCompleted < 100) {
331+
if (req.body.status === TASK_STATUS.DONE || !req.body.status) {
332+
return res.boom.badRequest("Task percentCompleted can't updated as status is DONE");
333+
}
334+
}
335+
336+
if (
337+
(req.body.status === TASK_STATUS.DONE || req.body.status === TASK_STATUS.VERIFIED) &&
338+
task.taskData.percentCompleted !== 100
339+
) {
340+
if (req.body.percentCompleted !== 100) {
341+
return res.boom.badRequest("Status cannot be updated. Task is not done yet");
342+
}
326343
}
327344
}
328345

346+
if (task.taskData.status === TASK_STATUS.COMPLETED && req.body.percentCompleted < 100) {
347+
if (req.body.status === TASK_STATUS.COMPLETED || !req.body.status) {
348+
return res.boom.badRequest("Task percentCompleted can't updated as status is COMPLETED");
349+
}
350+
}
329351
if (
330-
(req.body.status === TASK_STATUS.DONE || req.body.status === TASK_STATUS.VERIFIED) &&
352+
(req.body.status === TASK_STATUS.COMPLETED || req.body.status === TASK_STATUS.VERIFIED) &&
331353
task.taskData.percentCompleted !== 100
332354
) {
333355
if (req.body.percentCompleted !== 100) {
334-
return res.boom.badRequest("Status cannot be updated. Task is not done yet");
356+
return res.boom.badRequest("Status cannot be updated. Task is not completed yet");
335357
}
336358
}
337359

@@ -428,6 +450,11 @@ const assignTask = async (req, res) => {
428450

429451
const updateStatus = async (req, res) => {
430452
try {
453+
const { action, field } = req.body;
454+
if (action === "ADD" && field === "CREATED_AT+UPDATED_AT") {
455+
const updateStats = await addTaskCreatedAtAndUpdatedAtFields();
456+
return res.json(updateStats);
457+
}
431458
const response = await tasks.updateTaskStatus();
432459
return res.status(200).json(response);
433460
} catch (error) {

services/tasks.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
const firestore = require("../utils/firestore");
22
const tasksModel = firestore.collection("tasks");
3+
const { chunks } = require("../utils/array");
4+
const { DOCUMENT_WRITE_SIZE: FIRESTORE_BATCH_OPERATIONS_LIMIT } = require("../constants/constants");
5+
36
const updateTaskStatusToDone = async (tasksData) => {
47
const batch = firestore.batch();
58
const tasksBatch = [];
@@ -26,6 +29,61 @@ const updateTaskStatusToDone = async (tasksData) => {
2629
return { ...summary };
2730
}
2831
};
32+
33+
const addTaskCreatedAtAndUpdatedAtFields = async () => {
34+
const operationStats = {
35+
totalTasks: 0,
36+
totalTaskToBeUpdate: 0,
37+
totalTasksUpdated: 0,
38+
totalFailedTasks: 0,
39+
failedTasksIds: [],
40+
};
41+
const updatedTasks = [];
42+
const tasks = await tasksModel.get();
43+
44+
if (tasks.empty) {
45+
return operationStats;
46+
}
47+
48+
operationStats.totalTasks = tasks.size;
49+
50+
tasks.forEach((task) => {
51+
const taskData = task.data();
52+
let didAddField = false;
53+
if (!taskData.createdAt) {
54+
taskData.createdAt = task.createTime.seconds;
55+
didAddField = true;
56+
}
57+
if (!taskData.updatedAt) {
58+
taskData.updatedAt = task.updateTime.seconds;
59+
didAddField = true;
60+
}
61+
if (didAddField) {
62+
updatedTasks.push({ id: task.id, data: taskData });
63+
}
64+
});
65+
66+
operationStats.totalTaskToBeUpdate = updatedTasks.length;
67+
68+
const chunkedTasks = chunks(updatedTasks, FIRESTORE_BATCH_OPERATIONS_LIMIT);
69+
70+
chunkedTasks.forEach((tasks) => {
71+
const batch = firestore.batch();
72+
tasks.forEach(({ id, data }) => {
73+
batch.update(tasksModel.doc(id), data);
74+
});
75+
try {
76+
batch.commit();
77+
operationStats.totalTasksUpdated += tasks.length;
78+
} catch (error) {
79+
operationStats.totalFailedTasks += tasks.length;
80+
tasks.forEach(({ id }) => operationStats.failedTasksIds.push(id));
81+
}
82+
});
83+
return operationStats;
84+
};
85+
2986
module.exports = {
3087
updateTaskStatusToDone,
88+
addTaskCreatedAtAndUpdatedAtFields,
3189
};

test/fixtures/tasks/tasks.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ module.exports = () => {
1414
type: "feature",
1515
assignee: "akshay",
1616
createdBy: "ankush",
17+
createdAt: 1644753600,
18+
updatedAt: 1644753600,
1719
status: "IN_PROGRESS",
1820
percentCompleted: 50,
1921
endsOn: 1647172800, // 13 march
@@ -25,6 +27,8 @@ module.exports = () => {
2527
type: "feature",
2628
assignee: "ankur",
2729
createdBy: "ankush",
30+
createdAt: 1644753600,
31+
updatedAt: 1644753600,
2832
status: "ASSIGNED",
2933
percentCompleted: 50,
3034
endsOn: 1647172800, // 13 march
@@ -36,6 +40,8 @@ module.exports = () => {
3640
type: "feature",
3741
assignee: "ankur",
3842
createdBy: "ankush",
43+
createdAt: 1644753600,
44+
updatedAt: 1644753600,
3945
status: "BLOCKED",
4046
percentCompleted: 50,
4147
endsOn: 1647172800,
@@ -51,6 +57,8 @@ module.exports = () => {
5157
percentCompleted: 50,
5258
endsOn: 1650032259,
5359
startedOn: 1644753600,
60+
createdAt: 1644753600,
61+
updatedAt: 1644753600,
5462
},
5563
{
5664
title: "Test task",
@@ -67,6 +75,8 @@ module.exports = () => {
6775
priority: "HIGH",
6876
isNoteworthy: true,
6977
assignee: false,
78+
createdAt: 1644753600,
79+
updatedAt: 1644753600,
7080
},
7181
{
7282
title: "Test task-dependency",
@@ -80,6 +90,8 @@ module.exports = () => {
8090
lossRate: { [DINERO]: 1 },
8191
isNoteworthy: true,
8292
assignee: false,
93+
createdAt: 1644753600,
94+
updatedAt: 1644753600,
8395
},
8496
{
8597
id: "P86Y1hVrS0zR5ZcVPwLZ",
@@ -102,6 +114,8 @@ module.exports = () => {
102114
status: "IN_PROGRESS",
103115
assigneeId: "WbceXEPcohuJ5IxHHecf",
104116
dependsOn: [],
117+
createdAt: 1644753600,
118+
updatedAt: 1644753600,
105119
},
106120
{
107121
id: "P86Y1fsvS0zR5ZcVPwLZ",
@@ -123,6 +137,8 @@ module.exports = () => {
123137
title: "Undefined status",
124138
assigneeId: "WbceXEPcdsuJ5IxHHecf",
125139
dependsOn: [],
140+
createdAt: 1644753600,
141+
updatedAt: 1644753600,
126142
},
127143
];
128144
};

0 commit comments

Comments
 (0)