Skip to content

Commit a3131fc

Browse files
authored
Merge pull request #1276 from Real-Dev-Squad/1273-fetch-route-for-task-request-using-query-params
feat: Add fetchTaskRequestById
2 parents f2e26f1 + de9ca5b commit a3131fc

File tree

4 files changed

+173
-22
lines changed

4 files changed

+173
-22
lines changed

controllers/tasksRequests.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ const fetchTaskRequests = async (_, res) => {
66
try {
77
const data = await taskRequestsModel.fetchTaskRequests();
88

9-
if (data || data.length > 0) {
10-
res.status(200).json({
9+
if (data.length > 0) {
10+
return res.status(200).json({
1111
message: "Task requests returned successfully",
1212
data,
1313
});
@@ -23,6 +23,26 @@ const fetchTaskRequests = async (_, res) => {
2323
}
2424
};
2525

26+
const fetchTaskRequestById = async (req, res) => {
27+
try {
28+
const id = req.params.id;
29+
const data = await taskRequestsModel.fetchTaskRequestById(id);
30+
31+
if (!data.taskRequestExists) {
32+
return res.status(404).json({
33+
message: "Task request not found",
34+
});
35+
}
36+
return res.status(200).json({
37+
message: "Task request returned successfully",
38+
data: data.taskRequestData,
39+
});
40+
} catch (err) {
41+
logger.error("Error while fetching task requests", err);
42+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
43+
}
44+
};
45+
2646
const addOrUpdate = async (req, res) => {
2747
try {
2848
const { taskId, userId } = req.body;
@@ -81,4 +101,5 @@ module.exports = {
81101
approveTaskRequest,
82102
addOrUpdate,
83103
fetchTaskRequests,
104+
fetchTaskRequestById,
84105
};

models/taskRequests.js

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,66 @@ const userModel = require("./users");
1313
const fetchTaskRequests = async () => {
1414
const taskRequests = [];
1515

16-
const taskRequestsSnapshots = (await taskRequestsCollection.get()).docs;
16+
try {
17+
const taskRequestsSnapshots = (await taskRequestsCollection.get()).docs;
1718

18-
const taskPromises = [];
19-
const userPromises = [];
19+
const taskPromises = [];
20+
const userPromises = [];
2021

21-
taskRequestsSnapshots.forEach((taskRequestsSnapshot) => {
22-
const taskRequestData = taskRequestsSnapshot.data();
23-
const { requestors } = taskRequestData;
22+
taskRequestsSnapshots.forEach((taskRequestsSnapshot) => {
23+
const taskRequestData = taskRequestsSnapshot.data();
24+
taskRequestData.id = taskRequestsSnapshot.id;
25+
taskRequestData.url = new URL(`/taskRequests/${taskRequestData.id}`, config.get("services.rdsUi.baseUrl"));
26+
const { requestors } = taskRequestData;
2427

25-
taskPromises.push(tasksModel.fetchTask(taskRequestData.taskId));
26-
userPromises.push(Promise.all(requestors.map((requestor) => userModel.fetchUser({ userId: requestor }))));
28+
taskPromises.push(tasksModel.fetchTask(taskRequestData.taskId));
29+
userPromises.push(Promise.all(requestors.map((requestor) => userModel.fetchUser({ userId: requestor }))));
2730

28-
taskRequests.push(taskRequestData);
29-
});
31+
taskRequests.push(taskRequestData);
32+
});
3033

31-
const tasks = await Promise.all(taskPromises);
32-
const users = await Promise.all(userPromises);
34+
const tasks = await Promise.all(taskPromises);
35+
const users = await Promise.all(userPromises);
3336

34-
taskRequests.forEach((taskRequest, index) => {
35-
taskRequest.task = tasks[+index].taskData;
36-
taskRequest.requestors = users[+index];
37-
});
37+
taskRequests.forEach((taskRequest, index) => {
38+
taskRequest.task = tasks[+index].taskData;
39+
taskRequest.requestors = users[+index];
40+
});
41+
} catch (err) {
42+
logger.error("Error in updating task", err);
43+
}
3844

3945
return taskRequests;
4046
};
4147

48+
/**
49+
* Fetches task request by id
50+
*
51+
* @param taskRequestId { string }: id of task request
52+
* @return Promise<{taskRequest: Object}>
53+
*/
54+
const fetchTaskRequestById = async (taskRequestId) => {
55+
try {
56+
const taskRequestSnapshot = await taskRequestsCollection.doc(taskRequestId).get();
57+
const taskRequestData = taskRequestSnapshot.data();
58+
59+
if (taskRequestData) {
60+
taskRequestData.id = taskRequestSnapshot.id;
61+
taskRequestData.url = new URL(`/taskRequests/${taskRequestData.id}`, config.get("services.rdsUi.baseUrl"));
62+
}
63+
return {
64+
taskRequestData,
65+
taskRequestExists: true,
66+
};
67+
} catch (err) {
68+
logger.error("Error in updating task", err);
69+
}
70+
71+
return {
72+
taskRequestExists: false,
73+
};
74+
};
75+
4276
/**
4377
* Creates a task request
4478
*
@@ -73,11 +107,12 @@ const addOrUpdate = async (taskId, userId) => {
73107
taskId,
74108
};
75109

76-
await taskRequestsCollection.add(newTaskRequest);
110+
const newTaskRequestRef = await taskRequestsCollection.add(newTaskRequest);
77111

78112
return {
79113
isCreate: true,
80114
taskRequest: newTaskRequest,
115+
id: newTaskRequestRef.id,
81116
};
82117
} catch (err) {
83118
logger.error("Error in updating task", err);
@@ -117,6 +152,7 @@ const approveTaskRequest = async (taskRequestId, user) => {
117152

118153
module.exports = {
119154
fetchTaskRequests,
155+
fetchTaskRequestById,
120156
addOrUpdate,
121157
approveTaskRequest,
122158
};

routes/taskRequests.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { cacheResponse } = require("../utils/cache");
88
const { validateUser } = require("../middlewares/taskRequests");
99

1010
router.get("/", authenticate, authorizeRoles([SUPERUSER]), cacheResponse(), taskRequests.fetchTaskRequests);
11+
router.get("/:id", authenticate, authorizeRoles([SUPERUSER]), taskRequests.fetchTaskRequestById);
1112
router.post("/addOrUpdate", authenticate, validateUser, taskRequests.addOrUpdate);
1213
router.patch("/approve", authenticate, authorizeRoles([SUPERUSER]), validateUser, taskRequests.approveTaskRequest);
1314

test/integration/taskRequests.test.js

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@ describe("Task Requests", function () {
5858

5959
taskId = (await tasksModel.updateTask(taskData[4])).taskId;
6060
await userStatusModel.updateUserStatus(userId, idleUserStatus);
61-
await taskRequestsModel.addOrUpdate(taskId, userId);
6261
});
6362

64-
it("should fetch taskRequests", function (done) {
63+
it("should fetch 404 when taskRequests are empty", function (done) {
6564
chai
6665
.request(app)
6766
.get("/taskRequests")
@@ -71,13 +70,30 @@ describe("Task Requests", function () {
7170
return done(err);
7271
}
7372

73+
expect(res).to.have.status(404);
74+
return done();
75+
});
76+
});
77+
78+
it("should fetch taskRequests", async function () {
79+
await taskRequestsModel.addOrUpdate(taskId, userId);
80+
81+
chai
82+
.request(app)
83+
.get("/taskRequests")
84+
.set("cookie", `${cookieName}=${jwt}`)
85+
.then(function (err, res) {
86+
if (err) {
87+
return err;
88+
}
89+
7490
expect(res).to.have.status(200);
7591
expect(res.body.message).to.equal("Task requests returned successfully");
7692
expect(res.body.data).to.be.a("Array");
7793
expect(res.body.data.length).to.equal(1);
7894
expect(res.body.data[0]).to.have.property("requestors");
7995
expect(res.body.data[0].requestors.length).to.equal(1);
80-
return done();
96+
return res;
8197
});
8298
});
8399
});
@@ -111,6 +127,83 @@ describe("Task Requests", function () {
111127
});
112128
});
113129

130+
describe("GET /taskRequest/:id - fetches task request by id", function () {
131+
describe("When the user is super user", function () {
132+
let taskRequestId;
133+
before(async function () {
134+
superUserId = await addUser(superUser);
135+
sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId }));
136+
jwt = authService.generateAuthToken({ userId: superUserId });
137+
138+
taskId = (await tasksModel.updateTask(taskData[4])).taskId;
139+
taskRequestId = (await taskRequestsModel.addOrUpdate(taskId, userId)).id;
140+
});
141+
142+
it("should fetch the task request", function (done) {
143+
chai
144+
.request(app)
145+
.get(`/taskRequests/${taskRequestId}`)
146+
.set("cookie", `${cookieName}=${jwt}`)
147+
.end((err, res) => {
148+
if (err) {
149+
return done(err);
150+
}
151+
152+
expect(res).to.have.status(200);
153+
expect(res.body.message).to.be.equal("Task request returned successfully");
154+
expect(res.body.data).to.be.a("object");
155+
return done();
156+
});
157+
});
158+
159+
it("should return 404 if the resource is not found", function (done) {
160+
sinon.stub(taskRequestsModel, "fetchTaskRequestById").callsFake(() => []);
161+
162+
chai
163+
.request(app)
164+
.get(`/taskRequests/taskRequestId`)
165+
.set("cookie", `${cookieName}=${jwt}`)
166+
.end((err, res) => {
167+
if (err) {
168+
return done(err);
169+
}
170+
171+
expect(res).to.have.status(404);
172+
expect(res.body.message).to.be.equal("Task request not found");
173+
return done();
174+
});
175+
});
176+
});
177+
178+
describe("When the user is not a super user", function () {
179+
before(async function () {
180+
userId = await addUser(member);
181+
sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId }));
182+
jwt = authService.generateAuthToken({ userId });
183+
184+
taskId = (await tasksModel.updateTask(taskData[4])).taskId;
185+
186+
await userStatusModel.updateUserStatus(userId, idleUserStatus);
187+
await taskRequestsModel.addOrUpdate(taskId, userId);
188+
});
189+
190+
it("should return 401 status code", function (done) {
191+
chai
192+
.request(app)
193+
.get(`/taskRequests/taskrequstid`)
194+
.set("cookie", `${cookieName}=${jwt}`)
195+
.end((err, res) => {
196+
if (err) {
197+
return done(err);
198+
}
199+
200+
expect(res).to.have.status(401);
201+
return done();
202+
});
203+
});
204+
});
205+
});
206+
114207
describe("POST /taskRequests/addOrUpdate - add or updates a task request", function () {
115208
describe("When a new task requested is created", function () {
116209
before(async function () {

0 commit comments

Comments
 (0)