Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove unverified role on /verify #2192

4 changes: 4 additions & 0 deletions controllers/external-accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { retrieveDiscordUsers, fetchUsersForKeyValues } = require("../services/da
const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../constants/external-accounts");
const logger = require("../utils/logger");
const { markUnDoneTasksOfArchivedUsersBacklog } = require("../models/tasks");
const { removeDiscordRole } = require("../utils/removeDiscordRole");

const addExternalAccountData = async (req, res) => {
const createdOn = Date.now();
Expand Down Expand Up @@ -46,6 +47,7 @@ const getExternalAccountData = async (req, res) => {
return res.boom.serverUnavailable(SOMETHING_WENT_WRONG);
}
};

const linkExternalAccount = async (req, res) => {
try {
const { id: userId, roles } = req.userData;
Expand All @@ -69,6 +71,8 @@ const linkExternalAccount = async (req, res) => {
userId
);

await removeDiscordRole(req.userData, attributes.discordId, undefined, "unverified");
shubhdevelop marked this conversation as resolved.
Show resolved Hide resolved

return res.status(204).json({ message: "Your discord profile has been linked successfully" });
} catch (error) {
logger.error(`Error getting external account data: ${error}`);
Expand Down
11 changes: 11 additions & 0 deletions test/integration/external-accounts.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages");
const firestore = require("../../utils/firestore");
const userData = require("../fixtures/user/user")();
const userModel = firestore.collection("users");
const discordRolesModel = firestore.collection("discord-roles");
const memberRoleModel = firestore.collection("member-group-roles");
const tasksModel = firestore.collection("tasks");
const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../../constants/external-accounts");
chai.use(chaiHttp);
Expand Down Expand Up @@ -448,12 +450,21 @@ describe("External Accounts", function () {

describe("PATCH /external-accounts/link/:token", function () {
shubhdevelop marked this conversation as resolved.
Show resolved Hide resolved
let newUserJWT;
let discordId;
let roleid;
let rolename;

beforeEach(async function () {
const userId = await addUser(userData[3]);
newUserJWT = authService.generateAuthToken({ userId });
await externalAccountsModel.addExternalAccountData(externalAccountData[2]);
await externalAccountsModel.addExternalAccountData(externalAccountData[3]);

discordId = externalAccountData[2].attributes.discordId;
roleid = "unverifiedRoleId";
rolename = "unverified";
await discordRolesModel.add({ rolename, roleid });
await memberRoleModel.add({ roleid, userid: discordId });
});

afterEach(async function () {
Expand Down
87 changes: 87 additions & 0 deletions test/unit/utils/removeDiscordRole.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const chai = require("chai");
const { expect } = chai;
const { removeDiscordRole } = require("../../../utils/removeDiscordRole");
const addUser = require("../../utils/addUser");
const cleanDb = require("../../utils/cleanDb");
const firestore = require("../../../utils/firestore");
const discordRolesModel = firestore.collection("discord-roles");
const memberRoleModel = firestore.collection("member-group-roles");
const userData = require("../../fixtures/user/user")();
const { groupData, memberGroupData } = require("../../fixtures/discordactions/discordactions");

describe("removeDiscordRole", function () {
let userId;
let discordId;
let roleid;
let rolename;

beforeEach(async function () {
userData[0].roles = { archived: false, in_discord: true };
userId = await addUser(userData[0]);
discordId = userData[0].discordId;
userData[0] = { ...userData[0], id: userId };

const addRolePromises = memberGroupData.map(async (data) => {
await memberRoleModel.add(data);
});
const discordRolesModelPromise = [discordRolesModel.add(groupData[0]), discordRolesModel.add(groupData[1])];
await Promise.all(discordRolesModelPromise);
roleid = groupData[0].roleid;
rolename = groupData[0].rolename;
await memberRoleModel.add({ roleid, userid: discordId });
await Promise.all(addRolePromises);
});

afterEach(async function () {
await cleanDb();
});

it("should remove discord role successfully", async function () {
const result = await removeDiscordRole(userData[0], discordId, roleid, rolename);

expect(result).to.equal(undefined);
});

it("should throw an error if roleid and rolename doesn't exist in database when attempting to remove", async function () {
roleid = "randomRoleId";
rolename = "randomRoleName";

try {
await removeDiscordRole(userData[0], discordId, roleid, rolename);
} catch (error) {
expect(error.message).to.equal("Role doesn't exist");
}
});

it("should throw an error if roleid doesn't exist in database when attempting to remove", async function () {
roleid = "randomRoleId";
rolename = undefined;

try {
await removeDiscordRole(userData[0], discordId, roleid, rolename);
} catch (error) {
expect(error.message).to.equal("Role doesn't exist");
}
});

it("should throw an error if rolename doesn't exist in database when attempting to remove", async function () {
roleid = undefined;
rolename = "randomRoleName";

try {
await removeDiscordRole(userData[0], discordId, roleid, rolename);
} catch (error) {
expect(error.message).to.equal("Role doesn't exist");
}
});

it("should throw an error if role deletion failed", async function () {
discordId = "randomDiscordId";

try {
await removeDiscordRole(userData[0], discordId, roleid, rolename);
} catch (error) {
expect(error.message).to.equal("Role deletion failed");
}
});
});
Achintya-Chatterjee marked this conversation as resolved.
Show resolved Hide resolved
26 changes: 26 additions & 0 deletions utils/removeDiscordRole.js
yesyash marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
This function handles all scenarios for role arguments - only "roleid" / only "rolename" / both.
Ensure that if only "roleid" is provided, pass "rolename" as "undefined", and vice versa.
When both "roleid" and "rolename" are available, pass both as arguments.
For implementation reference, see linkExternalAccount in controllers/external-accounts.js."
*/
yesyash marked this conversation as resolved.
Show resolved Hide resolved

const discordRolesModel = require("../models/discordactions");
const discordServices = require("../services/discordService");

export const removeDiscordRole = async (userData, discordId, roleid, rolename) => {
const role = await discordRolesModel.isGroupRoleExists({ roleid, rolename });

if (!role.roleExists) {
throw new Error("Role doesn't exist");
}

const roleData = role.existingRoles.docs[0].data();

await discordServices.removeRoleFromUser(roleData.roleid, discordId, userData);

const { wasSuccess } = await discordRolesModel.removeMemberGroup(roleData.roleid, discordId);
if (!wasSuccess) {
throw new Error("Role deletion failed");
}
};