Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ebe549e
feat: sync-indiscord role
bhtibrewal May 17, 2023
fa48a59
test: fix failing test
bhtibrewal May 17, 2023
6b0186b
chore: rename variable
bhtibrewal May 17, 2023
f86620b
feat: implement background worker using bull
bhtibrewal May 19, 2023
76c61b6
feat: sync in_discord API
bhtibrewal May 21, 2023
1424fe0
chore: remove commented code and add comments
bhtibrewal May 21, 2023
3a62f8a
Merge remote-tracking branch 'origin/develop' into feat/sync-indiscor…
bhtibrewal May 21, 2023
375aba7
chore : remove test
bhtibrewal May 21, 2023
ab9f99f
Update users.js
bhtibrewal May 23, 2023
2c8b802
chore: fix prettier issue
bhtibrewal May 23, 2023
f0bbe82
chore: address PR comments
bhtibrewal May 24, 2023
9956719
chore: remove id from update data
bhtibrewal May 25, 2023
54c7f93
Merge branch 'develop' into feat/sync-indiscord-role
bhtibrewal May 25, 2023
1e6583e
resolve merge conflicts
RitikJaiswal75 Jun 6, 2023
7463bec
remove bull and unwanted code
RitikJaiswal75 Jun 6, 2023
497464e
remove unwanted changes from controller
RitikJaiswal75 Jun 6, 2023
c03bf64
temporary commit
RitikJaiswal75 Jun 6, 2023
f8e7a16
remove yarn lock changes
RitikJaiswal75 Jun 6, 2023
4592e15
add filter queries
RitikJaiswal75 Jun 6, 2023
73cfa3f
rename controll for better understanding
RitikJaiswal75 Jun 6, 2023
1f8861b
remove changes made to levels api
RitikJaiswal75 Jun 6, 2023
24fb190
add tests for returning discord users
RitikJaiswal75 Jun 6, 2023
a520a64
make the api only for superuser
RitikJaiswal75 Jun 6, 2023
1435ec7
fix authorizeroles function call
RitikJaiswal75 Jun 6, 2023
e284cb6
store user.data() in a variable to reuse
RitikJaiswal75 Jun 7, 2023
d42050e
rename controller
RitikJaiswal75 Jun 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion controllers/discordactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ const discordRolesModel = require("../models/discordactions");
* @param res {Object} - Express response object
*/

const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl");
const DISCORD_BASE_URL = "";
// config.get("services.discordBot.baseUrl");

const createGroupRole = async (req, res) => {
try {
Expand Down
37 changes: 35 additions & 2 deletions controllers/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ 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");
const { getPaginationLink, getUsernamesFromPRs, mapDiscordMembersDataAndSyncRole } = require("../utils/users");
const { getQualifiers } = require("../utils/helper");
const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages");
const { getFilteredPRsOrIssues } = require("../utils/pullRequests");
const jwt = require("jsonwebtoken");

const verifyUser = async (req, res) => {
const userId = req.userData.id;
Expand Down Expand Up @@ -462,6 +462,38 @@ const filterUsers = async (req, res) => {
}
};

/*
* R
*
*
*/
const DISCORD_BASE_URL = "https://553e-49-36-233-201.ngrok.io";
// config.get("services.discordBot.baseUrl");

const syncInDiscordRole = async (req, res) => {
try {
const authToken = jwt.sign({}, config.get("botToken.botPrivateKey"), {
algorithm: "RS256",
});

const response = await fetch(`${DISCORD_BASE_URL}/discord-members`, {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${authToken}`,
},
});
const discordMembers = await response.json();

const allUsers = await userQuery.getAllUsers();
mapDiscordMembersDataAndSyncRole(allUsers, discordMembers);

return res.json({ message: "Synced with discord members " });
} catch (error) {
logger.error(`Error while fetching all users: ${error}`);
return res.boom.serverUnavailable("Something went wrong please contact admin");
}
};

module.exports = {
verifyUser,
generateChaincode,
Expand All @@ -481,4 +513,5 @@ module.exports = {
addDefaultArchivedRole,
getUserSkills,
filterUsers,
syncInDiscordRole,
};
17 changes: 17 additions & 0 deletions models/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,22 @@ const getUsersBasedOnFilter = async (query) => {
return [];
};

/**
* Fetch all users
*
* @return @return {Promise<users>}
*/

const getAllUsers = async () => {
try {
const usersRef = await userModel.get();
return usersRef;
} catch (err) {
logger.error("Error retrieving users data with roles of inDiscord", err);
throw err;
}
};

module.exports = {
addOrUpdate,
fetchPaginatedUsers,
Expand All @@ -436,4 +452,5 @@ module.exports = {
getRdsUserInfoByGitHubUsername,
fetchUsers,
getUsersBasedOnFilter,
getAllUsers,
};
1 change: 1 addition & 0 deletions routes/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ router.get("/:userId/intro", authenticate, authorizeRoles([SUPERUSER]), users.ge
router.put("/self/intro", authenticate, userValidator.validateJoinData, users.addUserIntro);
router.get("/:id/skills", users.getUserSkills);
router.get("/:id/badges", getUserBadges);
router.post("/", authenticate, users.syncInDiscordRole);

// upload.single('profile') -> multer inmemory storage of file for type multipart/form-data
router.post("/picture", authenticate, upload.single("profile"), users.postUserPicture);
Expand Down
57 changes: 57 additions & 0 deletions test/unit/utils/users.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const chai = require("chai");
const { expect } = chai;

const sinon = require("sinon");
const usersUtils = require("../../../utils/users");
const cleanDb = require("../../utils/cleanDb");
const addUser = require("../../utils/addUser");
Expand Down Expand Up @@ -65,4 +66,60 @@ describe("users", function () {
expect(participantUserId).to.include(userId);
});
});

describe("mapDiscordMembersDataAndSyncRole", function () {
it("should update roles and joined_discord fields for users with matching Discord IDs", function () {
const allUsers = [
{
data: () => ({ roles: { archived: false }, discordId: "123" }),
ref: { update: sinon.spy() },
},
];
const discordMembers = [
{
user: { id: "123" },
joined_at: "2022-05-01T00:00:00.000Z",
},
];

usersUtils.mapDiscordMembersDataAndSyncRole(allUsers, discordMembers);

sinon.assert.calledWithExactly(allUsers[0].ref.update, {
roles: { archived: false, inDiscord: true },
joined_discord: discordMembers[0].joined_at,
});
});

it("should update roles field to inDiscord: false for users with no matching Discord ID", function () {
const allUsers = [
{
data: () => ({ roles: { archived: false }, discordId: "123" }),
ref: { update: sinon.spy() },
},
];
const discordMembers = [];

usersUtils.mapDiscordMembersDataAndSyncRole(allUsers, discordMembers);

sinon.assert.calledWithExactly(allUsers[0].ref.update, {
roles: { archived: false, inDiscord: false },
});
});

it("should update roles field to inDiscord: false for users with archived roles", function () {
const allUsers = [
{
data: () => ({ roles: { archived: true }, discordId: "123" }),
ref: { update: () => sinon.spy() },
},
];
const discordMembers = [];

usersUtils.mapDiscordMembersDataAndSyncRole(allUsers, discordMembers);

expect(allUsers[0].ref.update).to.have.been.calledWith({
roles: { archived: true, inDiscord: false },
});
});
});
});
30 changes: 30 additions & 0 deletions utils/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,35 @@ function getUsernamesFromPRs(allPRs) {

return usernames;
}
/**
*
* @param allUsers{Array} - list of total users from firebase
* @param discordMembers{Array} - list of all members in discord server
*
*/
function mapDiscordMembersDataAndSyncRole(allUsers, discordMembers) {
try {
allUsers.forEach((doc) => {
const user = doc.data();

if (user.roles.archived) {
const roles = user.roles ? { ...user.roles, inDiscord: false } : { inDiscord: false };
doc.ref.update({ roles });
} else if (user.discordId) {
const discordUserData = discordMembers.find((item) => item.user.id === user.discordId);
if (discordUserData) {
const roles = user.roles ? { ...user.roles, inDiscord: true } : { inDiscord: true };
doc.ref.update({ roles, joined_discord: discordUserData.joined_at });
} else {
const roles = user.roles ? { ...user.roles, inDiscord: false } : { inDiscord: false };
doc.ref.update({ roles });
}
}
});
} catch (err) {
logger.error(err);
}
}

module.exports = {
addUserToDBForTest,
Expand All @@ -152,4 +181,5 @@ module.exports = {
getLowestLevelSkill,
getPaginationLink,
getUsernamesFromPRs,
mapDiscordMembersDataAndSyncRole,
};