From b6bef144e401ca47c08d19451603db596e26cf79 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Verma <61198989+imdigitalashish@users.noreply.github.com> Date: Fri, 6 Jun 2025 20:29:09 +0000 Subject: [PATCH] Fix group role update logic --- controllers/discordactions.js | 64 +++++++++++++++++++++++- middlewares/validators/discordactions.js | 16 ++++++ routes/discordactions.js | 10 ++++ services/discordService.js | 21 ++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) diff --git a/controllers/discordactions.js b/controllers/discordactions.js index f77758b00..ef0eb89e1 100644 --- a/controllers/discordactions.js +++ b/controllers/discordactions.js @@ -10,7 +10,7 @@ const { addLog } = require("../models/logs"); const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); const discordMavenRoleId = config.get("discordMavenRoleId"); -const { setUserDiscordNickname, getDiscordMembers } = discordServices; +const { setUserDiscordNickname, getDiscordMembers, updateGroupRoleInDiscord } = discordServices; /** * Creates a role @@ -118,6 +118,67 @@ const deleteGroupRole = async (req, res) => { } }; +/** + * Updates a group's name or description + * @param {Object} req - Express request object + * @param {Object} res - Express response object + */ +const updateGroupRoleDetails = async (req, res) => { + const { groupId } = req.params; + let { rolename, description } = req.body; + try { + const { roleExists, existingRoles } = await discordRolesModel.isGroupRoleExists({ groupId }); + if (!roleExists) { + return res.boom.notFound("Group role not found"); + } + + const updateData = {}; + if (rolename) { + if (!rolename.startsWith("group-")) { + rolename = `group-${rolename}`; + } + + const { roleExists: nameExists, existingRoles: nameExistingRoles } = + await discordRolesModel.isGroupRoleExists({ rolename }); + if (nameExists) { + const existingId = nameExistingRoles.docs[0].id; + if (existingId !== groupId) { + return res.status(409).json({ message: "Role already exists!" }); + } + } + + updateData.rolename = rolename; + } + if (description !== undefined) { + updateData.description = description; + } + + if (Object.keys(updateData).length === 0) { + return res.status(400).json({ message: "Nothing to update" }); + } + + const roleData = existingRoles.data(); + + if (updateData.rolename) { + const discordUpdate = await updateGroupRoleInDiscord( + roleData.roleid, + rolename, + req.userData + ); + if (!discordUpdate.success) { + return res.boom.badImplementation(discordUpdate.message); + } + } + + await discordRolesModel.updateGroupRole(updateData, groupId); + + return res.status(200).json({ message: "Group role updated successfully" }); + } catch (error) { + logger.error(`Error while updating group role: ${error}`); + return res.boom.badImplementation("Internal server error"); + } +}; + /** * Fetches all group roles or provides paginated results when ?dev=true is passed. * @@ -572,5 +633,6 @@ module.exports = { setRoleToUsersWith31DaysPlusOnboarding, getUserDiscordInvite, generateInviteForUser, + updateGroupRoleDetails, deleteGroupRole, }; diff --git a/middlewares/validators/discordactions.js b/middlewares/validators/discordactions.js index 42eaf8775..271d50ab9 100644 --- a/middlewares/validators/discordactions.js +++ b/middlewares/validators/discordactions.js @@ -15,6 +15,21 @@ const validateGroupRoleBody = async (req, res, next) => { res.boom.badRequest(error.details[0].message); } }; + +const validateGroupRoleUpdateBody = async (req, res, next) => { + const schema = Joi.object({ + rolename: Joi.string().trim(), + description: Joi.string().trim(), + }).or("rolename", "description"); + + try { + await schema.validateAsync(req.body); + next(); + } catch (error) { + logger.error(`Error validating updateGroupRole payload : ${error}`); + res.boom.badRequest(error.details[0].message); + } +}; const validateMemberRoleBody = async (req, res, next) => { const schema = Joi.object({ userid: Joi.string().trim().required(), @@ -66,4 +81,5 @@ module.exports = { validateMemberRoleBody, validateLazyLoadingParams, validateUpdateUsersNicknameStatusBody, + validateGroupRoleUpdateBody, }; diff --git a/routes/discordactions.js b/routes/discordactions.js index b0f197b86..232be1368 100644 --- a/routes/discordactions.js +++ b/routes/discordactions.js @@ -15,6 +15,7 @@ const { syncDiscordGroupRolesInFirestore, setRoleToUsersWith31DaysPlusOnboarding, deleteGroupRole, + updateGroupRoleDetails, getPaginatedAllGroupRoles, } = require("../controllers/discordactions"); const { @@ -22,6 +23,7 @@ const { validateMemberRoleBody, validateUpdateUsersNicknameStatusBody, validateLazyLoadingParams, + validateGroupRoleUpdateBody, } = require("../middlewares/validators/discordactions"); const checkIsVerifiedDiscord = require("../middlewares/verifydiscord"); const checkCanGenerateDiscordLink = require("../middlewares/checkCanGenerateDiscordLink"); @@ -37,6 +39,14 @@ const router = express.Router(); router.post("/groups", authenticate, checkIsVerifiedDiscord, validateGroupRoleBody, createGroupRole); router.get("/groups", authenticate, checkIsVerifiedDiscord, validateLazyLoadingParams, getPaginatedAllGroupRoles); router.delete("/groups/:groupId", authenticate, checkIsVerifiedDiscord, authorizeRoles([SUPERUSER]), deleteGroupRole); +router.patch( + "/groups/:groupId", + authenticate, + checkIsVerifiedDiscord, + authorizeRoles([SUPERUSER]), + validateGroupRoleUpdateBody, + updateGroupRoleDetails +); router.post("/roles", authenticate, checkIsVerifiedDiscord, validateMemberRoleBody, addGroupRoleToMember); /** * Short-circuit the GET method for this endpoint diff --git a/services/discordService.js b/services/discordService.js index 1244fe9d3..3fb3d45d1 100644 --- a/services/discordService.js +++ b/services/discordService.js @@ -140,6 +140,26 @@ const deleteGroupRoleFromDiscord = async (roleId) => { } }; +const updateGroupRoleInDiscord = async (roleId, roleName, userData) => { + try { + const headers = generateCloudFlareHeaders(userData); + const response = await fetch(`${DISCORD_BASE_URL}/roles/${roleId}`, { + method: "PATCH", + headers, + body: JSON.stringify({ rolename: roleName }), + }); + + if (response.status === 200) { + return { success: true }; + } + const data = await response.json(); + return { success: false, message: data.message }; + } catch (err) { + logger.error("Error updating role on Discord", err); + return { success: false, message: "Internal server error" }; + } +}; + module.exports = { getDiscordMembers, getDiscordRoles, @@ -148,4 +168,5 @@ module.exports = { removeRoleFromUser, setUserDiscordNickname, deleteGroupRoleFromDiscord, + updateGroupRoleInDiscord, };