Skip to content

Commit 7c5e573

Browse files
authored
Merge pull request #1639 from Real-Dev-Squad/develop
Dev to main sync
2 parents a880313 + 211dd38 commit 7c5e573

File tree

7 files changed

+141
-74
lines changed

7 files changed

+141
-74
lines changed

constants/logs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const logType = {
22
PROFILE_DIFF_APPROVED: "PROFILE_DIFF_APPROVED",
33
PROFILE_DIFF_REJECTED: "PROFILE_DIFF_REJECTED",
44
CLOUDFLARE_CACHE_PURGED: "CLOUDFLARE_CACHE_PURGED",
5+
EVENTS_REMOVE_PEER: "EVENTS_REMOVE_PEER",
56
};
67

78
module.exports = { logType };

controllers/events.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const logger = require("../utils/logger");
77
const { removeUnwantedProperties } = require("../utils/events");
88

99
const crypto = require("crypto");
10+
const { addLog } = require("../models/logs");
11+
const { logType } = require("../constants/logs");
1012

1113
const tokenService = new EventTokenService();
1214
const apiService = new EventAPIService(tokenService);
@@ -296,6 +298,7 @@ const kickoutPeer = async (req, res) => {
296298
try {
297299
await apiService.post(`/active-rooms/${id}/remove-peers`, payload);
298300
await eventQuery.kickoutPeer({ eventId: id, peerId: payload.peer_id, reason: req.body.reason });
301+
addLog(logType.EVENTS_REMOVE_PEER, { removed_by: req.userData.id }, payload);
299302
return res.status(200).json({
300303
message: `Selected Participant is removed from event.`,
301304
});

controllers/extensionRequests.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ const getSelfExtensionRequests = async (req, res) => {
249249
const superUserId = logs[0].meta.userId;
250250
const name = await getFullName(superUserId);
251251
latestExtensionRequest.reviewedBy = `${name?.first_name} ${name?.last_name}`;
252+
latestExtensionRequest.reviewedAt = logs[0].timestamp._seconds;
252253
}
253254
}
254255
allExtensionRequests = [latestExtensionRequest];

controllers/tasksRequests.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/er
22
const { TASK_REQUEST_TYPE } = require("../constants/taskRequests");
33
const taskRequestsModel = require("../models/taskRequests");
44
const tasksModel = require("../models/tasks.js");
5+
const { updateUserStatusOnTaskUpdate } = require("../models/userStatus");
56
const githubService = require("../services/githubService");
67
const usersUtils = require("../utils/users");
78

@@ -167,6 +168,8 @@ const approveTaskRequest = async (req, res) => {
167168
if (response.isTaskRequestInvalid) {
168169
return res.boom.badRequest("Task request was previously approved or rejected.");
169170
}
171+
await updateUserStatusOnTaskUpdate(user.username);
172+
170173
return res.status(200).json({
171174
message: `Task successfully assigned to user ${response.approvedTo}`,
172175
taskRequest: response.taskRequest,

middlewares/taskRequests.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
2-
const { userState } = require("../constants/userStatus");
3-
const userStatusModel = require("../models/userStatus.js");
42
const dataAccess = require("../services/dataAccessLayer");
53
/**
64
* Validates user id for task request
@@ -20,14 +18,6 @@ async function validateUser(req, res, next) {
2018
return res.boom.conflict("User does not exist");
2119
}
2220

23-
const { userStatusExists, data: userStatus } = await userStatusModel.getUserStatus(userId);
24-
if (!userStatusExists) {
25-
return res.boom.conflict("User status does not exist");
26-
}
27-
if (userStatus.currentStatus.state === userState.ACTIVE) {
28-
return res.boom.conflict("User is currently active on another task");
29-
}
30-
3121
req.body.user = user;
3222

3323
return next();

test/integration/events.test.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const event1Data = eventData[0];
1616
const userData = require("../fixtures/user/user")();
1717

1818
const eventQuery = require("../../models/events");
19+
const logsModel = require("../../models/logs");
1920

2021
const defaultUser = userData[16];
2122

@@ -721,4 +722,98 @@ describe("events", function () {
721722
});
722723
});
723724
});
725+
726+
describe("PATCH /events/:id/peers/kickout", function () {
727+
let service;
728+
let superUserAuthToken;
729+
let memberAuthToken;
730+
beforeEach(async function () {
731+
const superUser = userData[4];
732+
const member = userData[6];
733+
const superUserId = await addUser(superUser);
734+
const memberUserId = await addUser(member);
735+
superUserAuthToken = authService.generateAuthToken({ userId: superUserId });
736+
memberAuthToken = authService.generateAuthToken({ userId: memberUserId });
737+
});
738+
739+
afterEach(function () {
740+
service.restore();
741+
sinon.restore();
742+
});
743+
744+
it("returns a success message when the request is successful for super user", function (done) {
745+
const payload = {
746+
peerId: "peer123",
747+
reason: "Kicked out for a reason",
748+
};
749+
750+
service = sinon.stub(EventAPIService.prototype, "post").returns({ message: "peer remove request submitted" });
751+
752+
sinon.stub(eventQuery, "kickoutPeer").returns({ message: "Selected Participant is removed from event." });
753+
sinon.stub(logsModel, "addLog");
754+
755+
chai
756+
.request(app)
757+
.patch(`/events/${event1Data.room_id}/peers/kickout`)
758+
.set("cookie", `${cookieName}=${superUserAuthToken}`)
759+
.send(payload)
760+
.end((error, response) => {
761+
if (error) {
762+
return done(error);
763+
}
764+
765+
expect(response).to.have.status(200);
766+
expect(response.body.message).to.be.a("string");
767+
expect(response.body.message).to.equal("Selected Participant is removed from event.");
768+
769+
return done();
770+
});
771+
});
772+
773+
it("returns a success message when the request is successful for member user", function (done) {
774+
const payload = {
775+
peerId: "peer123",
776+
reason: "Kicked out for a reason",
777+
};
778+
779+
service = sinon.stub(EventAPIService.prototype, "post").returns({ message: "peer remove request submitted" });
780+
781+
sinon.stub(eventQuery, "kickoutPeer").returns({ message: "Selected Participant is removed from event." });
782+
sinon.stub(logsModel, "addLog");
783+
784+
chai
785+
.request(app)
786+
.patch(`/events/${event1Data.room_id}/peers/kickout`)
787+
.set("cookie", `${cookieName}=${memberAuthToken}`)
788+
.send(payload)
789+
.end((error, response) => {
790+
if (error) {
791+
return done(error);
792+
}
793+
794+
expect(response).to.have.status(200);
795+
expect(response.body.message).to.be.a("string");
796+
expect(response.body.message).to.equal("Selected Participant is removed from event.");
797+
798+
return done();
799+
});
800+
});
801+
802+
it("should return unauthorized error if user is not authenticated", function (done) {
803+
chai
804+
.request(app)
805+
.patch(`/events/${event1Data.room_id}/peers/kickout`)
806+
.end((error, response) => {
807+
if (error) {
808+
return done(error);
809+
}
810+
811+
expect(response).to.have.status(401);
812+
expect(response.body.error).to.be.equal("Unauthorized");
813+
expect(response.body.message).to.be.equal("Unauthenticated User");
814+
815+
return done();
816+
});
817+
});
818+
});
724819
});

test/integration/taskRequests.test.js

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const config = require("config");
2020
const { TASK_REQUEST_TYPE } = require("../../constants/taskRequests");
2121
const usersUtils = require("../../utils/users");
2222
const githubService = require("../../services/githubService");
23+
const { userState } = require("../../constants/userStatus");
2324

2425
const cookieName = config.get("userToken.cookieName");
2526

@@ -374,26 +375,6 @@ describe("Task Requests", function () {
374375

375376
taskId = (await tasksModel.updateTask(taskData[4])).taskId;
376377
});
377-
378-
it("should match response", function (done) {
379-
chai
380-
.request(app)
381-
.post("/taskRequests/addOrUpdate")
382-
.set("cookie", `${cookieName}=${jwt}`)
383-
.send({
384-
taskId,
385-
userId,
386-
})
387-
.end((err, res) => {
388-
if (err) {
389-
return done(err);
390-
}
391-
392-
expect(res).to.have.status(409);
393-
expect(res.body.message).to.equal("User status does not exist");
394-
return done();
395-
});
396-
});
397378
});
398379

399380
describe("When the user status is not idle", function () {
@@ -404,37 +385,14 @@ describe("Task Requests", function () {
404385

405386
taskId = (await tasksModel.updateTask(taskData[4])).taskId;
406387
});
407-
it("should match response when the user is active on another task", function (done) {
408-
sinon
409-
.stub(userStatusModel, "getUserStatus")
410-
.callsFake(() => ({ userStatusExists: true, data: activeUserStatus }));
411-
412-
chai
413-
.request(app)
414-
.post("/taskRequests/addOrUpdate")
415-
.set("cookie", `${cookieName}=${jwt}`)
416-
.send({
417-
taskId,
418-
userId,
419-
})
420-
.end((err, res) => {
421-
if (err) {
422-
return done(err);
423-
}
424-
425-
expect(res).to.have.status(409);
426-
expect(res.body.message).to.equal("User is currently active on another task");
427-
return done();
428-
});
429-
});
430388
});
431389
});
432390

433391
describe("PATCH /taskRequests/approve - approves task request", function () {
434392
let activeUserId, oooUserId;
435393

436394
describe("When the user is super user", function () {
437-
before(async function () {
395+
beforeEach(async function () {
438396
userId = await addUser(member);
439397
activeUserId = await addUser(activeMember);
440398
oooUserId = await addUser(member2);
@@ -450,6 +408,10 @@ describe("Task Requests", function () {
450408
await userStatusModel.updateUserStatus(oooUserId, { ...oooUserStatus });
451409
await taskRequestsModel.addOrUpdate(taskId, userId);
452410
});
411+
afterEach(async function () {
412+
sinon.restore();
413+
await cleanDb();
414+
});
453415

454416
it("should match response for successfull approval", function (done) {
455417
sinon.stub(taskRequestsModel, "approveTaskRequest").resolves({ approvedTo: member.username });
@@ -472,26 +434,6 @@ describe("Task Requests", function () {
472434
});
473435
});
474436

475-
it("should return 409 error with message when user is active", function (done) {
476-
chai
477-
.request(app)
478-
.patch("/taskRequests/approve")
479-
.set("cookie", `${cookieName}=${jwt}`)
480-
.send({
481-
taskRequestId: taskId,
482-
userId: activeUserId,
483-
})
484-
.end((err, res) => {
485-
if (err) {
486-
return done(err);
487-
}
488-
489-
expect(res).to.have.status(409);
490-
expect(res.body.message).to.equal("User is currently active on another task");
491-
return done();
492-
});
493-
});
494-
495437
it("should throw 400 error when taskRequestId is missing", function (done) {
496438
chai
497439
.request(app)
@@ -581,6 +523,38 @@ describe("Task Requests", function () {
581523
return done();
582524
});
583525
});
526+
describe("Checks the user status", function () {
527+
it("Should change the user status to ACTIVE when request is successful", async function () {
528+
sinon.stub(taskRequestsModel, "approveTaskRequest").resolves({ approvedTo: member.username });
529+
const res = await chai
530+
.request(app)
531+
.patch("/taskRequests/approve")
532+
.set("cookie", `${cookieName}=${jwt}`)
533+
.send({
534+
taskRequestId: taskId,
535+
userId,
536+
});
537+
538+
expect(res).to.have.status(200);
539+
const userStatus = await userStatusModel.getUserStatus(userId);
540+
expect(userStatus.data.currentStatus.state).to.be.equal(userState.ACTIVE);
541+
});
542+
it("Should not change the user status to ACTIVE when request is unsuccessful", async function () {
543+
sinon.stub(taskRequestsModel, "approveTaskRequest").resolves({ isTaskRequestInvalid: true });
544+
const res = await chai
545+
.request(app)
546+
.patch("/taskRequests/approve")
547+
.set("cookie", `${cookieName}=${jwt}`)
548+
.send({
549+
taskRequestId: taskId,
550+
userId,
551+
});
552+
553+
expect(res).to.have.status(400);
554+
const userStatus = await userStatusModel.getUserStatus(userId);
555+
expect(userStatus.data.currentStatus.state).to.be.equal(userState.IDLE);
556+
});
557+
});
584558
});
585559

586560
describe("When the user is not super user", function () {

0 commit comments

Comments
 (0)