diff --git a/constants/roles.js b/constants/roles.js index 9f80a4968..d28e484a0 100644 --- a/constants/roles.js +++ b/constants/roles.js @@ -4,6 +4,7 @@ const ROLES = { APPOWNER: "app_owner", MEMBER: "member", ARCHIVED: "archived", + INDISCORD: "in_discord", }; module.exports = ROLES; diff --git a/constants/users.js b/constants/users.js index fea46dd70..bdb5939f9 100644 --- a/constants/users.js +++ b/constants/users.js @@ -13,6 +13,7 @@ const USER_STATUS = { const ALLOWED_FILTER_PARAMS = { ITEM_TAG: ["levelId", "levelName", "levelValue", "tagId"], USER_STATE: ["state"], + ROLE: ["role"], }; module.exports = { profileStatus, USER_STATUS, ALLOWED_FILTER_PARAMS }; diff --git a/controllers/users.js b/controllers/users.js index 2f98bd4ff..4db6a2ae3 100644 --- a/controllers/users.js +++ b/controllers/users.js @@ -5,7 +5,7 @@ const logsQuery = require("../models/logs"); const imageService = require("../services/imageService"); const { profileDiffStatus } = require("../constants/profileDiff"); const { logType } = require("../constants/logs"); -const { fetch } = require("../utils/fetch"); + const logger = require("../utils/logger"); const obfuscate = require("../utils/obfuscate"); const { getPaginationLink, getUsernamesFromPRs } = require("../utils/users"); @@ -24,7 +24,11 @@ const verifyUser = async (req, res) => { logger.error(`Error while verifying user: ${error}`); return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); } - fetch(process.env.IDENTITY_SERVICE_URL, "POST", null, { userId }, { "Content-Type": "application/json" }); + fetch(process.env.IDENTITY_SERVICE_URL, { + method: "POST", + body: { userId }, + headers: { "Content-Type": "application/json" }, + }); return res.json({ message: "Your request has been queued successfully", }); diff --git a/middlewares/validators/user.js b/middlewares/validators/user.js index 8ead61e64..ac91998d0 100644 --- a/middlewares/validators/user.js +++ b/middlewares/validators/user.js @@ -1,5 +1,6 @@ const joi = require("joi"); const { USER_STATUS } = require("../../constants/users"); +const ROLES = require("../../constants/roles"); const updateUser = async (req, res, next) => { const schema = joi @@ -172,6 +173,8 @@ async function validateUserQueryParams(req, res, next) { joi.array().items(joi.string().valid("IDLE", "OOO", "ACTIVE")) ) .optional(), + role: joi.string().valid(ROLES.MEMBER, ROLES.INDISCORD).optional(), + verified: joi.string().optional(), }) .messages({ "object.min": "Please provide at least one filter criteria", diff --git a/models/users.js b/models/users.js index f20b00d56..0d4ba5b15 100644 --- a/models/users.js +++ b/models/users.js @@ -360,6 +360,8 @@ const getRdsUserInfoByGitHubUsername = async (githubUsername) => { * @param {Array} query.levelNumber - Array of levelNumbers to filter the users on * @param {Array} query.tagId - Array of tagIds to filter the users on * @param {Array} query.state - Array of states to filter the users on + * @param {String} query.role - filter the users on role + * @param {String} query.verified - filter the users on verified i.e, discordId data * @return {Promise} - Array of user documents that match the filter criteria */ @@ -412,6 +414,33 @@ const getUsersBasedOnFilter = async (query) => { const filteredUserDocs = userDocs.filter((doc) => !doc.roles?.archived); return filteredUserDocs; } + + const { role: roleQuery, verified: verifiedQuery } = query; + + if (roleQuery) { + const filteredUsers = []; + const snapshot = await userModel.where(`roles.${roleQuery}`, "==", true).get(); + snapshot.forEach((doc) => { + filteredUsers.push({ + id: doc.id, + ...doc.data(), + }); + }); + + return filteredUsers.filter((user) => !user.roles?.archived); + } + if (verifiedQuery === "true") { + const filteredUsers = []; + const snapshot = await userModel.where("discordId", "!=", null).get(); + snapshot.forEach((doc) => { + filteredUsers.push({ + id: doc.id, + ...doc.data(), + }); + }); + + return filteredUsers.filter((user) => !user.roles?.archived); + } return []; }; diff --git a/test/fixtures/user/user.js b/test/fixtures/user/user.js index 94d9d7f9d..e46c6eafe 100644 --- a/test/fixtures/user/user.js +++ b/test/fixtures/user/user.js @@ -21,8 +21,10 @@ module.exports = () => { isMember: true, phone: "1234567890", email: "abc@gmail.com", + joined_discord: "2023-01-13T18:21:09.278000+00:00", roles: { member: true, + in_discord: true, }, tokens: { githubAccessToken: "githubAccessToken", @@ -105,6 +107,7 @@ module.exports = () => { github_display_name: "Ankush Dharkar", phone: "1234567890", email: "ad@amazon.com", + joined_discord: "2023-01-13T18:21:09.278000+00:00", status: "idle", tokens: { githubAccessToken: "githubAccessToken", @@ -112,6 +115,7 @@ module.exports = () => { roles: { super_user: true, archived: false, + in_discord: true, }, picture: { publicId: "profile/mtS4DhUvNYsKqI7oCWVB/aenklfhtjldc5ytei3ar", diff --git a/test/unit/models/users.test.js b/test/unit/models/users.test.js index 728f267c9..747015fed 100644 --- a/test/unit/models/users.test.js +++ b/test/unit/models/users.test.js @@ -88,4 +88,16 @@ describe("users", function () { expect(userExists).to.equal(true); }); }); + + describe(" search users API: getUsersBasedOnFilter", function () { + it("should return an empty array if no query is provided", async function () { + const result = await users.getUsersBasedOnFilter({}); + expect(result).to.deep.equal([]); + }); + + it("should return an array of verified users", async function () { + const result = await users.getUsersBasedOnFilter({ verified: "true" }); + expect(result).to.deep.equal(userDataArray.filter((user) => user.discordId)); + }); + }); });