Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
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: 3 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ const AppMiddlewares = require("./middlewares");
// import routes
const indexRouter = require("./routes/index");

// processors
require("./processors/index");

const app = express();

// Add Middlewares, routes
Expand Down
73 changes: 72 additions & 1 deletion controllers/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ const logsQuery = require("../models/logs");
const imageService = require("../services/imageService");
const { profileDiffStatus } = require("../constants/profileDiff");
const { logType } = require("../constants/logs");

const logger = require("../utils/logger");
const obfuscate = require("../utils/obfuscate");
const { getPaginationLink, getUsernamesFromPRs } = 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 Queue = require("bull");
const { REDIS_PORT, REDIS_URI } = require("../redisCredentials");

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

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

// wroker queue created with Bull
const syncQueue = new Queue("syncQueue", {
redis: {
port: REDIS_PORT,
host: REDIS_URI,
},
});

/*
* Sync user data with the data present in our discord server
*
*/

const syncInDiscordRole = async (req, res) => {
try {
// create a authToken to verify on discord bot
const authToken = jwt.sign({}, config.get("rdsServerlessBot.rdsServerLessPrivateKey"), {
algorithm: "RS256",
expiresIn: config.get("rdsServerlessBot.ttl"),
});

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

// get the data of the users from our database
const allUsers = await userQuery.getAllUsers();

allUsers.forEach((doc) => {
const user = { id: doc.id, ...doc.data() };

if (user.roles.archived) {
// Update: If the user is archived change the role in_discord: false
user.roles = { ...user.roles, in_discord: false };
syncQueue.add({ user });

// If the user has verified them self and has discordId in the database
} else if (user.discordId) {
// find that users data from the discord members data we have
const discordUserData = discordMembers.find((item) => item.user.id === user.discordId);

// if data exists that means the user is present in our discord derver
if (discordUserData) {
// Update: the user role in_dicord: true and the joined_discord date
user.roles = { ...user.roles, in_discord: true };
user.joined_discord = discordUserData.joined_at;
syncQueue.add({ user });
} else {
user.roles = { ...user.roles, in_discord: false };
syncQueue.add({ user });
}
}
});

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 @@ -485,4 +555,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 @@ -450,6 +450,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 @@ -465,4 +481,5 @@ module.exports = {
getRdsUserInfoByGitHubUsername,
fetchUsers,
getUsersBasedOnFilter,
getAllUsers,
};
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
},
"dependencies": {
"axios": "^1.0.0",
"bull": "^4.10.4",
"cloudinary": "^1.25.1",
"config": "^3.3.6",
"cookie-parser": "~1.4.5",
Expand Down
12 changes: 12 additions & 0 deletions processors/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const Queue = require("bull");
const path = require("path");
const { REDIS_PORT, REDIS_URI } = require("../redisCredentials");

const syncQueue = new Queue("syncQueue", {
redis: {
port: REDIS_PORT,
host: REDIS_URI,
},
});

syncQueue.process(path.join(__dirname, "syncQueue.js"));
8 changes: 8 additions & 0 deletions processors/syncQueue.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const userQuery = require("../models/users");

const syncQueueProcessor = (job, done) => {
userQuery.addOrUpdate(job.data.user, job.data.user.id);
done();
};

module.exports = syncQueueProcessor;
4 changes: 4 additions & 0 deletions redisCredentials.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const REDIS_PORT = 6379;
const REDIS_URI = "127.0.0.1";

module.exports = { REDIS_PORT, REDIS_URI };
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
Loading