Skip to content

Commit 70f0d5a

Browse files
authored
Merge pull request #2478 from Real-Dev-Squad/develop
Dev to Main Sync
2 parents 36a094c + 749e1be commit 70f0d5a

File tree

13 files changed

+234
-23
lines changed

13 files changed

+234
-23
lines changed

controllers/oooRequests.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ export const createOooRequestController = async (
6565
}
6666

6767
const latestOooRequest: OooStatusRequest = await getRequestByKeyValues({
68-
userId,
69-
type: REQUEST_TYPE.OOO,
70-
status: REQUEST_STATE.PENDING,
68+
requestedBy: userId,
69+
type: REQUEST_TYPE.OOO,
70+
status: REQUEST_STATE.PENDING,
7171
});
7272

7373
if (latestOooRequest) {

controllers/users.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ const getUserById = async (req, res) => {
9090
const getUsers = async (req, res) => {
9191
try {
9292
// getting user details by id if present.
93-
const { q, dev: devParam, query } = req.query;
93+
const { q, dev: devParam, query, profileStatus } = req.query;
9494
const dev = devParam === "true";
9595
const queryString = (dev ? q : query) || "";
9696
const transformedQuery = parseSearchQuery(queryString);
@@ -136,6 +136,21 @@ const getUsers = async (req, res) => {
136136
}
137137
}
138138

139+
if (profileStatus) {
140+
const normalizedProfileStatus = String(profileStatus).trim().toUpperCase();
141+
try {
142+
const users = await userQuery.fetchUserForKeyValue("profileStatus", normalizedProfileStatus);
143+
return res.json({
144+
message: `Users with profile status ${normalizedProfileStatus} returned successfully!`,
145+
count: users.length,
146+
users: users,
147+
});
148+
} catch (error) {
149+
logger.error(`Error while fetching users with profile status ${normalizedProfileStatus}: ${error}`);
150+
return res.boom.serverUnavailable(SOMETHING_WENT_WRONG);
151+
}
152+
}
153+
139154
if (!transformedQuery?.days && transformedQuery?.filterBy === "unmerged_prs") {
140155
return res.boom.badRequest(`Days is required for filterBy ${transformedQuery?.filterBy}`);
141156
}

middlewares/validators/user.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ async function getUsers(req, res, next) {
197197
query: joi.string().optional(),
198198
q: joi.string().optional(),
199199
profile: joi.string().valid("true").optional(),
200+
profileStatus: joi.string().optional().messages({
201+
"string.empty": "profileStatus value must not be empty",
202+
}),
200203
filterBy: joi.string().optional(),
201204
days: joi.string().optional(),
202205
dev: joi.string().optional(),
@@ -368,6 +371,7 @@ const migrationsValidator = async (req, res, next) => {
368371
res.boom.badRequest("Invalid Query Parameters Passed");
369372
}
370373
};
374+
371375
module.exports = {
372376
updateUser,
373377
updateProfileURL,

models/requests.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import firestore from "../utils/firestore";
2+
import type { OooStatusRequest } from "../types/oooRequest";
23
const requestModel = firestore.collection("requests");
3-
import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE } from "../constants/requests";
4+
import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE, REQUEST_TYPE } from "../constants/requests";
45
import {
56
ERROR_WHILE_FETCHING_REQUEST,
67
ERROR_WHILE_CREATING_REQUEST,
78
ERROR_WHILE_UPDATING_REQUEST,
89
REQUEST_DOES_NOT_EXIST,
910
} from "../constants/requests";
1011
import { getUserId } from "../utils/users";
12+
import { transformRequestResponse } from "../utils/requests";
1113
const SIZE = 5;
1214

15+
1316
export const createRequest = async (body: any) => {
1417
try {
1518
const requestBody: any = {
@@ -149,6 +152,8 @@ export const getRequests = async (query: any) => {
149152
return null;
150153
}
151154

155+
allRequests = transformRequestResponse(allRequests, dev);
156+
152157
return {
153158
allRequests,
154159
prev: prevDoc.empty ? null : prevDoc.docs[0].id,

services/oooRequest.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ export const createOooRequest = async (
6666
from: body.from,
6767
until: body.until,
6868
type: body.type,
69-
requestedBy: username,
70-
userId,
69+
requestedBy: userId,
7170
reason: body.reason,
7271
comment: null,
7372
status: REQUEST_STATE.PENDING,

test/fixtures/oooRequest/oooRequest.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ export const createdOOORequest = {
2727
reason: validOooStatusRequests.reason,
2828
status: "PENDING",
2929
lastModifiedBy: null,
30-
requestedBy: "suraj-maity-1",
31-
userId: "jCqqOYCnm93mcmaYuSsQ",
30+
requestedBy: "jCqqOYCnm93mcmaYuSsQ",
3231
comment: null
3332
};
3433

test/integration/requests.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,10 @@ describe("/requests OOO", function () {
188188
expect(res.body).to.not.have.property("data");
189189

190190
await requestsQuery.getRequestByKeyValues({
191-
userId: testUserId,
191+
requestedBy: testUserId,
192192
type: REQUEST_TYPE.OOO,
193193
status: REQUEST_STATE.PENDING
194194
}).then((request) => {
195-
expect(request).to.not.be.null;
196195
expect(request.reason).to.equal(validOooStatusRequests.reason);
197196
done();
198197
}).catch(done);
@@ -580,7 +579,7 @@ describe("/requests OOO", function () {
580579
it("should return all requests", function (done) {
581580
chai
582581
.request(app)
583-
.get("/requests")
582+
.get("/requests?dev=true")
584583
.end(function (err, res) {
585584
expect(res).to.have.status(200);
586585
expect(res.body.data).to.have.lengthOf(2);

test/integration/users.test.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,65 @@ describe("Users", function () {
974974
return done();
975975
});
976976
});
977+
978+
it("Should return users filtered by profile status", function (done) {
979+
chai
980+
.request(app)
981+
.get("/users?profileStatus=BLOCKED")
982+
.end((err, res) => {
983+
if (err) {
984+
return done(err);
985+
}
986+
expect(res).to.have.status(200);
987+
expect(res.body).to.be.a("object");
988+
expect(res.body.message).to.equal("Users with profile status BLOCKED returned successfully!");
989+
expect(res.body.users).to.be.a("array");
990+
expect(res.body.count).to.be.a("number");
991+
992+
res.body.users.forEach((user) => {
993+
expect(user.profileStatus).to.equal("BLOCKED");
994+
});
995+
996+
return done();
997+
});
998+
});
999+
1000+
it("Should return empty array when no users with specified profile status", function (done) {
1001+
chai
1002+
.request(app)
1003+
.get("/users?profileStatus=NON_EXISTENT_STATUS")
1004+
.end((err, res) => {
1005+
if (err) {
1006+
return done(err);
1007+
}
1008+
expect(res).to.have.status(200);
1009+
expect(res.body).to.be.a("object");
1010+
expect(res.body.message).to.equal("Users with profile status NON_EXISTENT_STATUS returned successfully!");
1011+
expect(res.body.users).to.be.a("array");
1012+
expect(res.body.count).to.equal(0);
1013+
expect(res.body.users).to.have.length(0);
1014+
1015+
return done();
1016+
});
1017+
});
1018+
1019+
it("Should accept lowercase profileStatus", function (done) {
1020+
chai
1021+
.request(app)
1022+
.get("/users?profileStatus=blocked")
1023+
.end((err, res) => {
1024+
if (err) {
1025+
return done(err);
1026+
}
1027+
expect(res).to.have.status(200);
1028+
expect(res.body).to.be.a("object");
1029+
expect(res.body.users).to.be.a("array");
1030+
res.body.users.forEach((user) => {
1031+
expect(user.profileStatus).to.equal("BLOCKED");
1032+
});
1033+
return done();
1034+
});
1035+
});
9771036
});
9781037

9791038
describe("GET /users/self", function () {

test/unit/middlewares/user-validator.test.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,38 @@ describe("Middleware | Validators | User", function () {
488488
expect(next.calledOnce).to.be.equal(true);
489489
});
490490

491+
it("Allows the request with profileStatus parameter to pass to next", async function () {
492+
const req = {
493+
query: {
494+
profileStatus: "BLOCKED",
495+
},
496+
};
497+
498+
const res = {};
499+
const next = sinon.spy();
500+
501+
await getUsers(req, res, next);
502+
expect(next.calledOnce).to.be.equal(true);
503+
});
504+
505+
it("Stops the propagation when profileStatus is empty", async function () {
506+
const req = {
507+
query: {
508+
profileStatus: "",
509+
},
510+
};
511+
const res = {
512+
boom: {
513+
badRequest: () => {},
514+
},
515+
};
516+
const nextSpy = sinon.spy();
517+
await getUsers(req, res, nextSpy).catch((err) => {
518+
expect(err).to.be.an.instanceOf(Error);
519+
});
520+
expect(nextSpy.calledOnce).to.be.equal(false);
521+
});
522+
491523
it("Stops the request for passing on to next", async function () {
492524
const req = {
493525
query: {

test/unit/models/requests.test.ts

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
import { REQUEST_STATE, REQUEST_TYPE } from "../../../constants/requests";
1212
import userDataFixture from "./../../fixtures/user/user";
1313
import addUser from "../../utils/addUser";
14+
import { oldOooStatusRequest, OooStatusRequest } from "../../../types/oooRequest";
1415
const userData = userDataFixture();
1516

1617
let testUserId: string;
@@ -46,8 +47,8 @@ describe("models/oooRequests", () => {
4647

4748
describe("updateRequest", () => {
4849
it("should update an existing OOO request", async () => {
49-
const oooRequest: any = await createRequest(createOooStatusRequests);
50-
const updatedOooRequest: any = await updateRequest(
50+
const oooRequest: oldOooStatusRequest = await createRequest(createOooStatusRequests);
51+
const updatedOooRequest: oldOooStatusRequest = await updateRequest(
5152
oooRequest.id,
5253
updateOooApprovedRequests,
5354
updateOooApprovedRequests.lastModifiedBy
@@ -112,17 +113,42 @@ describe("models/oooRequests", () => {
112113
expect(oooRequestData.allRequests).to.be.have.length(2);
113114
});
114115

115-
it("Should return a list of all the requests with specified state - APPROVED", async () => {
116-
const oooRequest: any = await createRequest(createOooStatusRequests);
117-
await updateRequest(oooRequest.id, updateOooApprovedRequests, updateOooApprovedRequests.lastModifiedBy, REQUEST_TYPE.OOO)
116+
it("Should return APPROVED state in old schema when dev=false", async () => {
117+
const oooRequest: OooStatusRequest = await createRequest(createOooStatusRequests);
118+
await updateRequest(
119+
oooRequest.id,
120+
updateOooApprovedRequests,
121+
updateOooApprovedRequests.lastModifiedBy,
122+
REQUEST_TYPE.OOO
123+
);
124+
const query = { dev: "false", status: REQUEST_STATE.APPROVED };
125+
const oooRequestData = await getRequests(query);
126+
expect(oooRequestData.allRequests[0].status).to.be.equal(REQUEST_STATE.APPROVED);
127+
});
128+
129+
it("Should return APPROVED status in new schema when dev=true", async () => {
130+
const oooRequest: OooStatusRequest = await createRequest(createOooStatusRequests);
131+
await updateRequest(
132+
oooRequest.id,
133+
updateOooApprovedRequests,
134+
updateOooApprovedRequests.lastModifiedBy,
135+
REQUEST_TYPE.OOO
136+
);
118137
const query = { dev: "true", state: REQUEST_STATE.APPROVED };
119138
const oooRequestData = await getRequests(query);
120139
expect(oooRequestData.allRequests[0].state).to.be.equal(REQUEST_STATE.APPROVED);
121140
});
122141

123-
it("Should return a list of all the requests with specified state - PENDING", async () => {
142+
it("Should return PENDING state in old schema when dev=false", async () => {
143+
await createRequest(createOooStatusRequests);
144+
const query = { dev: "false", status: REQUEST_STATE.PENDING };
145+
const oooRequestData = await getRequests(query);
146+
expect(oooRequestData.allRequests[0].status).to.be.equal(REQUEST_STATE.PENDING);
147+
});
148+
149+
it("Should return PENDING status in new schema when dev=true", async () => {
124150
await createRequest(createOooStatusRequests);
125-
const query = { dev: "true", state: REQUEST_STATE.PENDING };
151+
const query = { dev: "true", status: REQUEST_STATE.PENDING };
126152
const oooRequestData = await getRequests(query);
127153
expect(oooRequestData.allRequests[0].state).to.be.equal(REQUEST_STATE.PENDING);
128154
});
@@ -144,7 +170,7 @@ describe("models/oooRequests", () => {
144170
});
145171

146172
it("Should return empty array if no data is found", async () => {
147-
const query = { dev: "true", state: REQUEST_STATE.PENDING };
173+
const query = { dev: "true", status: REQUEST_STATE.PENDING };
148174
const oooRequestData = await getRequests(query);
149175
expect(oooRequestData).to.be.equal(null);
150176
});

0 commit comments

Comments
 (0)