Skip to content

Commit 749e1be

Browse files
authored
Merge pull request #2477 from Real-Dev-Squad/feat-get-users-with-profile-status-blocked
feat: get users based on their profile status
2 parents 6b15882 + 5ec02eb commit 749e1be

File tree

4 files changed

+111
-1
lines changed

4 files changed

+111
-1
lines changed

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,

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: {

0 commit comments

Comments
 (0)