Skip to content

Commit 1e63004

Browse files
Merge pull request #1612 from Real-Dev-Squad/conflict/resolve-dev-main-oct-17-2023
Dev to main sync
2 parents 8534c0e + 47ecc67 commit 1e63004

File tree

8 files changed

+662
-70
lines changed

8 files changed

+662
-70
lines changed

controllers/extensionRequests.js

Lines changed: 175 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -14,73 +14,156 @@ const { parseQueryParams } = require("../utils/queryParser");
1414
* @param res {Object} - Express response object
1515
*/
1616
const createTaskExtensionRequest = async (req, res) => {
17-
try {
18-
const extensionBody = req.body;
19-
20-
let assigneeUsername = await getUsernameElseUndefined(extensionBody.assignee);
21-
let assigneeId = extensionBody.assignee;
22-
if (!assigneeUsername) {
23-
assigneeId = await getUserIdElseUndefined(extensionBody.assignee);
24-
assigneeUsername = extensionBody.assignee;
25-
extensionBody.assignee = assigneeId;
26-
}
17+
const dev = req.query.dev === "true";
18+
if (dev) {
19+
try {
20+
let extensionBody = req.body;
2721

28-
if (!assigneeId) {
29-
return res.boom.badRequest("User with this id or username doesn't exist.");
30-
}
22+
let assigneeUsername = await getUsernameElseUndefined(extensionBody.assignee);
23+
let assigneeId = extensionBody.assignee;
24+
if (!assigneeUsername) {
25+
assigneeId = await getUserIdElseUndefined(extensionBody.assignee);
26+
assigneeUsername = extensionBody.assignee;
27+
extensionBody.assignee = assigneeId;
28+
}
3129

32-
if (req.userData.id !== extensionBody.assignee && !req.userData.roles?.super_user) {
33-
return res.boom.forbidden("Only assigned user and super user can create an extension request for this task.");
34-
}
30+
if (!assigneeId) {
31+
return res.boom.badRequest("User Not Found");
32+
}
3533

36-
const { taskData: task } = await tasks.fetchTask(extensionBody.taskId);
37-
if (!task) {
38-
return res.boom.badRequest("Task with this id or taskid doesn't exist.");
39-
}
40-
if (task.assignee !== assigneeUsername) {
41-
return res.boom.badRequest("This task is assigned to some different user");
42-
}
43-
if (task.endsOn >= extensionBody.newEndsOn) {
44-
return res.boom.badRequest("The value for newEndsOn should be greater than the previous ETA");
45-
}
46-
if (extensionBody.oldEndsOn !== task.endsOn) {
47-
extensionBody.oldEndsOn = task.endsOn;
48-
}
34+
if (req.userData.id !== extensionBody.assignee && !req.userData.roles?.super_user) {
35+
return res.boom.forbidden("Only assigned user and super user can create an extension request for this task.");
36+
}
4937

50-
const prevExtensionRequest = await extensionRequestsQuery.fetchExtensionRequests({
51-
taskId: extensionBody.taskId,
52-
assignee: extensionBody.assignee,
53-
});
54-
if (prevExtensionRequest.length) {
55-
return res.boom.forbidden("An extension request for this task already exists.");
38+
const { taskData: task } = await tasks.fetchTask(extensionBody.taskId);
39+
if (!task) {
40+
return res.boom.badRequest("Task Not Found");
41+
}
42+
if (task.assignee !== assigneeUsername) {
43+
return res.boom.badRequest("This task is assigned to some different user.");
44+
}
45+
if (task.endsOn >= extensionBody.newEndsOn) {
46+
return res.boom.badRequest("New ETA must be greater than Old ETA");
47+
}
48+
if (extensionBody.oldEndsOn !== task.endsOn) {
49+
extensionBody.oldEndsOn = task.endsOn;
50+
}
51+
52+
const latestExtensionRequest = await extensionRequestsQuery.fetchLatestExtensionRequest({
53+
taskId: extensionBody.taskId,
54+
});
55+
56+
if (latestExtensionRequest && latestExtensionRequest.status === EXTENSION_REQUEST_STATUS.PENDING) {
57+
return res.boom.badRequest("An extension request for this task already exists.");
58+
}
59+
60+
let requestNumber;
61+
if (latestExtensionRequest && latestExtensionRequest.assigneeId === assigneeId) {
62+
if (latestExtensionRequest.requestNumber && latestExtensionRequest.requestNumber > 0) {
63+
requestNumber = latestExtensionRequest.requestNumber + 1;
64+
extensionBody = { ...extensionBody, requestNumber };
65+
} else {
66+
extensionBody = { ...extensionBody, requestNumber: 2 };
67+
}
68+
} else {
69+
extensionBody = { ...extensionBody, requestNumber: 1 };
70+
}
71+
72+
const extensionRequest = await extensionRequestsQuery.createExtensionRequest(extensionBody);
73+
const extensionLog = {
74+
type: "extensionRequests",
75+
meta: {
76+
taskId: extensionBody.taskId,
77+
createdBy: req.userData.id,
78+
},
79+
body: {
80+
extensionRequestId: extensionRequest.id,
81+
oldEndsOn: task.endsOn,
82+
newEndsOn: extensionBody.newEndsOn,
83+
assignee: extensionBody.assignee,
84+
status: EXTENSION_REQUEST_STATUS.PENDING,
85+
},
86+
};
87+
88+
await addLog(extensionLog.type, extensionLog.meta, extensionLog.body);
89+
90+
return res.json({
91+
message: "Extension Request created successfully!",
92+
extensionRequest: { ...extensionBody, id: extensionRequest.id },
93+
});
94+
} catch (err) {
95+
logger.error(`Error while creating new extension request: ${err}`);
96+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
5697
}
98+
} else {
99+
try {
100+
const extensionBody = req.body;
57101

58-
const extensionRequest = await extensionRequestsQuery.createExtensionRequest(extensionBody);
102+
let assigneeUsername = await getUsernameElseUndefined(extensionBody.assignee);
103+
let assigneeId = extensionBody.assignee;
104+
if (!assigneeUsername) {
105+
assigneeId = await getUserIdElseUndefined(extensionBody.assignee);
106+
assigneeUsername = extensionBody.assignee;
107+
extensionBody.assignee = assigneeId;
108+
}
59109

60-
const extensionLog = {
61-
type: "extensionRequests",
62-
meta: {
110+
if (!assigneeId) {
111+
return res.boom.badRequest("User with this id or username doesn't exist.");
112+
}
113+
114+
if (req.userData.id !== extensionBody.assignee && !req.userData.roles?.super_user) {
115+
return res.boom.forbidden("Only assigned user and super user can create an extension request for this task.");
116+
}
117+
118+
const { taskData: task } = await tasks.fetchTask(extensionBody.taskId);
119+
if (!task) {
120+
return res.boom.badRequest("Task with this id or taskid doesn't exist.");
121+
}
122+
if (task.assignee !== assigneeUsername) {
123+
return res.boom.badRequest("This task is assigned to some different user");
124+
}
125+
if (task.endsOn >= extensionBody.newEndsOn) {
126+
return res.boom.badRequest("The value for newEndsOn should be greater than the previous ETA");
127+
}
128+
if (extensionBody.oldEndsOn !== task.endsOn) {
129+
extensionBody.oldEndsOn = task.endsOn;
130+
}
131+
132+
const prevExtensionRequest = await extensionRequestsQuery.fetchExtensionRequests({
63133
taskId: extensionBody.taskId,
64-
createdBy: req.userData.id,
65-
},
66-
body: {
67-
extensionRequestId: extensionRequest.id,
68-
oldEndsOn: task.endsOn,
69-
newEndsOn: extensionBody.newEndsOn,
70134
assignee: extensionBody.assignee,
71-
status: EXTENSION_REQUEST_STATUS.PENDING,
72-
},
73-
};
135+
});
136+
if (prevExtensionRequest.length) {
137+
return res.boom.forbidden("An extension request for this task already exists.");
138+
}
74139

75-
await addLog(extensionLog.type, extensionLog.meta, extensionLog.body);
140+
const extensionRequest = await extensionRequestsQuery.createExtensionRequest(extensionBody);
76141

77-
return res.json({
78-
message: "Extension Request created successfully!",
79-
extensionRequest: { ...extensionBody, id: extensionRequest.id },
80-
});
81-
} catch (err) {
82-
logger.error(`Error while creating new extension request: ${err}`);
83-
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
142+
const extensionLog = {
143+
type: "extensionRequests",
144+
meta: {
145+
taskId: extensionBody.taskId,
146+
createdBy: req.userData.id,
147+
},
148+
body: {
149+
extensionRequestId: extensionRequest.id,
150+
oldEndsOn: task.endsOn,
151+
newEndsOn: extensionBody.newEndsOn,
152+
assignee: extensionBody.assignee,
153+
status: EXTENSION_REQUEST_STATUS.PENDING,
154+
},
155+
};
156+
157+
await addLog(extensionLog.type, extensionLog.meta, extensionLog.body);
158+
159+
return res.json({
160+
message: "Extension Request created successfully!",
161+
extensionRequest: { ...extensionBody, id: extensionRequest.id },
162+
});
163+
} catch (err) {
164+
logger.error(`Error while creating new extension request: ${err}`);
165+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
166+
}
84167
}
85168
};
86169

@@ -132,19 +215,47 @@ const getExtensionRequest = async (req, res) => {
132215
* @param res {Object} - Express response object
133216
*/
134217
const getSelfExtensionRequests = async (req, res) => {
218+
const dev = req.query.dev === "true";
219+
135220
try {
136221
const { id: userId } = req.userData;
137222
const { taskId, status } = req.query;
138223

139-
if (userId) {
140-
const allExtensionRequests = await extensionRequestsQuery.fetchExtensionRequests({
141-
status,
142-
taskId,
143-
assignee: userId,
144-
});
145-
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests });
224+
if (dev) {
225+
if (userId) {
226+
let allExtensionRequests;
227+
if (taskId) {
228+
const latestExtensionRequest = await extensionRequestsQuery.fetchLatestExtensionRequest({
229+
taskId,
230+
});
231+
232+
if (latestExtensionRequest && latestExtensionRequest.assigneeId !== userId) {
233+
allExtensionRequests = [];
234+
} else {
235+
allExtensionRequests = [latestExtensionRequest];
236+
}
237+
} else {
238+
allExtensionRequests = await extensionRequestsQuery.fetchExtensionRequests({
239+
assignee: userId,
240+
status: status || undefined,
241+
});
242+
}
243+
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests });
244+
} else {
245+
return res.boom.notFound("User doesn't exist");
246+
}
247+
} else {
248+
if (userId) {
249+
const allExtensionRequests = await extensionRequestsQuery.fetchExtensionRequests({
250+
taskId,
251+
assignee: userId,
252+
status: status || undefined,
253+
});
254+
return res.json({ message: "Extension Requests returned successfully!", allExtensionRequests });
255+
} else {
256+
return res.boom.notFound("User doesn't exist");
257+
}
146258
}
147-
return res.boom.notFound("User doesn't exist");
148259
} catch (error) {
149260
logger.error(`Error while fetching extension requests: ${error}`);
150261
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);

models/extensionRequests.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,34 @@ const fetchExtensionRequest = async (extensionRequestId) => {
143143
}
144144
};
145145

146+
const fetchLatestExtensionRequest = async (ExtensionRequestQuery) => {
147+
try {
148+
let extensionRequestsSnapshot = extensionRequestsModel;
149+
Object.entries(ExtensionRequestQuery).forEach(([key, value]) => {
150+
if (value) {
151+
extensionRequestsSnapshot = extensionRequestsSnapshot.where(key, "==", value);
152+
}
153+
});
154+
const extensionRequestSnapshot = await extensionRequestsSnapshot.orderBy("timestamp", "desc").limit(1).get();
155+
156+
if (extensionRequestSnapshot.size === 0) {
157+
return [];
158+
}
159+
160+
const request = buildExtensionRequests(extensionRequestSnapshot);
161+
const updatedRequests = await formatExtensionRequest(request[0]);
162+
return updatedRequests;
163+
} catch (err) {
164+
logger.error("error getting extension requests", err);
165+
throw err;
166+
}
167+
};
168+
146169
module.exports = {
147170
createExtensionRequest,
148171
fetchExtensionRequests,
149172
fetchExtensionRequest,
150173
updateExtensionRequest,
151174
fetchPaginatedExtensionRequests,
175+
fetchLatestExtensionRequest,
152176
};

models/userStatus.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,9 @@ const cancelOooStatus = async (userId) => {
659659
}
660660
const updatedStatus = generateNewStatus(isActive);
661661
const newStatusData = { ...docData, ...updatedStatus };
662+
if (futureStatus?.state) {
663+
newStatusData.futureStatus = {};
664+
}
662665
await userStatusModel.doc(docId).update(newStatusData);
663666
if (!isActive) {
664667
await addGroupIdleRoleToDiscordUser(userId);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const userData = require("../../fixtures/user/user")();
2+
const { DINERO, NEELAM } = require("../../../constants/wallets");
3+
const user = userData[5];
4+
const appOwner = userData[3];
5+
module.exports = () => {
6+
return [
7+
{
8+
title: "Test task 1",
9+
type: "feature",
10+
endsOn: 1234,
11+
startedOn: 4567,
12+
status: "active",
13+
percentCompleted: 10,
14+
assignee: user.username,
15+
isNoteworthy: true,
16+
completionAward: { [DINERO]: 3, [NEELAM]: 300 },
17+
lossRate: { [DINERO]: 1 },
18+
},
19+
{
20+
title: "Test task 2",
21+
type: "feature",
22+
endsOn: 1234,
23+
startedOn: 4567,
24+
status: "active",
25+
percentCompleted: 10,
26+
assignee: user.username,
27+
isNoteworthy: true,
28+
completionAward: { [DINERO]: 3, [NEELAM]: 300 },
29+
lossRate: { [DINERO]: 1 },
30+
},
31+
{
32+
title: "Test task 3",
33+
purpose: "To Test mocha",
34+
featureUrl: "<testUrl>",
35+
type: "group",
36+
links: ["test1"],
37+
endsOn: 1234,
38+
startedOn: 54321,
39+
status: "active",
40+
percentCompleted: 10,
41+
dependsOn: ["d12", "d23"],
42+
isNoteworthy: false,
43+
assignee: appOwner.username,
44+
completionAward: { [DINERO]: 3, [NEELAM]: 300 },
45+
lossRate: { [DINERO]: 1 },
46+
},
47+
{
48+
title: "Test task 4",
49+
type: "feature",
50+
endsOn: 1234,
51+
startedOn: 4567,
52+
status: "active",
53+
percentCompleted: 10,
54+
assignee: appOwner.username,
55+
isNoteworthy: true,
56+
completionAward: { [DINERO]: 3, [NEELAM]: 300 },
57+
lossRate: { [DINERO]: 1 },
58+
},
59+
];
60+
};

test/fixtures/userStatus/userStatus.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,17 @@ const OutputFixtureForFnConvertTimestampsToUTC = {
207207
},
208208
};
209209

210+
const generateDefaultFutureStatus = (state, from, until) => {
211+
const futureStatusData = {
212+
state,
213+
from,
214+
until,
215+
message: "",
216+
updatedAt: new Date().getTime(),
217+
};
218+
return futureStatusData;
219+
};
220+
210221
module.exports = {
211222
userStatusDataForNewUser,
212223
userStatusDataAfterSignup,
@@ -221,4 +232,5 @@ module.exports = {
221232
getStatusData,
222233
inputFixtureForFnConvertTimestampsToUTC,
223234
OutputFixtureForFnConvertTimestampsToUTC,
235+
generateDefaultFutureStatus,
224236
};

0 commit comments

Comments
 (0)