Skip to content

Commit 34f8031

Browse files
committed
feat: get users based on their profile status
1 parent 6b15882 commit 34f8031

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

controllers/users.js

Lines changed: 15 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,20 @@ const getUsers = async (req, res) => {
136136
}
137137
}
138138

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

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: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,47 @@ 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+
});
9771018
});
9781019

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

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,20 @@ 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+
491505
it("Stops the request for passing on to next", async function () {
492506
const req = {
493507
query: {

0 commit comments

Comments
 (0)