Skip to content

Commit

Permalink
refactor: improve error handling and logging in removeDiscordRoleFrom…
Browse files Browse the repository at this point in the history
…User function
  • Loading branch information
shobhan-sundar-goutam committed Nov 21, 2024
1 parent deb2d1f commit 6bdc786
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 11 deletions.
3 changes: 2 additions & 1 deletion constants/logs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ export const logType = {
DISCORD_INVITES: "DISCORD_INVITES",
EXTERNAL_SERVICE: "EXTERNAL_SERVICE",
ADD_UNVERIFIED_ROLE: "ADD_UNVERIFIED_ROLE",
REMOVE_ROLE_FROM_USER: "REMOVE_ROLE_FROM_USER",
REMOVE_ROLE_FROM_USER_SUCCESS: "REMOVE_ROLE_FROM_USER_SUCCESS",
REMOVE_ROLE_FROM_USER_FAILED: "REMOVE_ROLE_FROM_USER_FAILED",
EXTENSION_REQUESTS: "extensionRequests",
TASK: "task",
TASK_REQUESTS: "taskRequests",
Expand Down
30 changes: 28 additions & 2 deletions test/integration/external-accounts.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -589,12 +589,38 @@ describe("External Accounts", function () {
removeDiscordRoleStub.restore();
});

it("Should return 500 when removeDiscordRole fails because role deletion failed", async function () {
it("Should return 500 when removeDiscordRole fails because role deletion from discord failed", async function () {
await externalAccountsModel.addExternalAccountData(externalAccountData[2]);

const removeDiscordRoleStub = Sinon.stub(removeDiscordRoleUtils, "removeDiscordRoleFromUser").resolves({
success: false,
message: "Role deletion failed",
message: "Role deletion from discord failed",
});

const response = await chai
.request(app)
.patch(`/external-accounts/link/${externalAccountData[2].token}`)
.query({ action: EXTERNAL_ACCOUNTS_POST_ACTIONS.DISCORD_USERS_SYNC })
.set("Cookie", `${cookieName}=${newUserJWT}`);

const unverifiedRoleRemovalResponse = await removeDiscordRoleStub();

expect(response).to.have.status(500);
expect(response.body).to.be.an("object");
expect(response.body).to.have.property("message");
expect(response.body.message).to.equal(
`User details updated but ${unverifiedRoleRemovalResponse.message}. Please contact admin`
);

removeDiscordRoleStub.restore();
});

it("Should return 500 when removeDiscordRole fails because role deletion from database failed", async function () {
await externalAccountsModel.addExternalAccountData(externalAccountData[2]);

const removeDiscordRoleStub = Sinon.stub(removeDiscordRoleUtils, "removeDiscordRoleFromUser").resolves({
success: false,
message: "Role deletion from database failed",
});

const response = await chai
Expand Down
16 changes: 13 additions & 3 deletions test/unit/utils/remvoeDiscordRoleFromUser.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,23 @@ describe("removeDiscordRoleFromUser", function () {
}
});

it("should throw an error if role deletion failed", async function () {
fetchStub.rejects(new Error("Role deletion failed"));
it("should throw an error if role deletion from discord failed", async function () {
fetchStub.rejects(new Error("Role deletion from discord failed"));

try {
await removeDiscordRoleFromUser(userData[0], discordId, roleid);
} catch (error) {
expect(error.message).to.equal("Role deletion failed");
expect(error.message).to.equal("Role deletion from discord failed");
}
});

it("should throw an error if role deletion from database failed", async function () {
fetchStub.rejects(new Error("Role deletion from database failed"));

try {
await removeDiscordRoleFromUser(userData[0], discordId, roleid);
} catch (error) {
expect(error.message).to.equal("Role deletion from database failed");
}
});
});
20 changes: 15 additions & 5 deletions utils/removeDiscordRoleFromUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,30 @@ export const removeDiscordRoleFromUser = async (userData, discordId, roleId) =>
const { roleExists } = await discordRolesModel.isGroupRoleExists({ roleid: roleId });

if (!roleExists) {
throw new Error("Role doesn't exist");
const message = "Role doesn't exist";
await addLog(logType.REMOVE_ROLE_FROM_USER_FAILED, { roleId }, { message, userid: discordId, userData });
throw new Error(message);
}

await discordServices.removeRoleFromUser(roleId, discordId, userData);
try {
await discordServices.removeRoleFromUser(roleId, discordId, userData);
} catch (error) {
const message = "Role deletion from discord failed";
await addLog(logType.REMOVE_ROLE_FROM_USER_FAILED, { roleId, userid: discordId, userData }, { message });
throw new Error(message);
}

const { wasSuccess } = await discordRolesModel.removeMemberGroup(roleId, discordId);
if (!wasSuccess) {
throw new Error("Role deletion failed");
const message = "Role deletion from database failed";
await addLog(logType.REMOVE_ROLE_FROM_USER_FAILED, { roleId, userid: discordId }, { message, userData });
throw new Error(message);
}

await addLog(
logType.REMOVE_ROLE_FROM_USER,
logType.REMOVE_ROLE_FROM_USER_SUCCESS,
{ roleId, userid: discordId },
{ message: "Role removed successfully from user" }
{ message: "Role removed successfully from user", userData }
);

return { success: true, message: "Role deleted successfully" };
Expand Down

0 comments on commit 6bdc786

Please sign in to comment.