From 54452a0c9eba21bede97436936ee5d321cec683d Mon Sep 17 00:00:00 2001 From: JamesNg Date: Mon, 14 Jul 2025 23:13:13 -0400 Subject: [PATCH 1/4] remove misleading comment --- backend/controllers/user.controller.js | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/controllers/user.controller.js b/backend/controllers/user.controller.js index 7a612e65b..762155506 100644 --- a/backend/controllers/user.controller.js +++ b/backend/controllers/user.controller.js @@ -42,7 +42,6 @@ UserController.admin_list = async function (req, res) { } }; -// Get list of Users with accessLevel 'admin' or 'superadmin' and also managed projects with GET UserController.projectManager_list = async function (req, res) { const { headers } = req; From c19634c3d367cb41be1b7374311c6962623cdd5e Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 17 Jul 2025 10:21:34 -0700 Subject: [PATCH 2/4] fix: Add projectManager_list to users.router.js --- backend/routers/users.router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/routers/users.router.js b/backend/routers/users.router.js index 034c12dac..a20da8f5a 100644 --- a/backend/routers/users.router.js +++ b/backend/routers/users.router.js @@ -8,7 +8,7 @@ router.get('/', UserController.user_list); router.get('/admins', UserController.admin_list); -router.get('/projectManagers', UserController.projectLead_list); +router.get('/projectManagers', UserController.projectManager_list); router.post('/', UserController.create); From 3d1b065642366907d6f4ade016eb0823b7a6b779 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 17 Jul 2025 10:37:07 -0700 Subject: [PATCH 3/4] feat: Run single query for project IDs to database --- backend/controllers/user.controller.js | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/backend/controllers/user.controller.js b/backend/controllers/user.controller.js index 777f4628a..1046788db 100644 --- a/backend/controllers/user.controller.js +++ b/backend/controllers/user.controller.js @@ -57,25 +57,29 @@ UserController.projectManager_list = async function (req, res) { ], }); - const updatedProjectManagers = []; - - for (const projectManager of projectManagers) { - const projectManagerObj = projectManager.toObject(); - projectManagerObj.isProjectLead = true; - const projectNames = []; - - for (const projectId of projectManagerObj.managedProjects) { - const projectDetail = await Project.findById(projectId); - if (projectDetail && projectDetail.name) { - projectNames.push(projectDetail.name); - } else { - console.warn('Project detail is null, cannot access name'); - } - } - projectManagerObj.managedProjectNames = projectNames; - - updatedProjectManagers.push(projectManagerObj); + // Collect all unique project IDs + const allProjectIds = [ + ...new Set( + projectManagers.flatMap(pm => pm.managedProjects) + ), + ]; + + // Fetch all projects in one query + const projects = await Project.find({ _id: { $in: allProjectIds } }); + const projectIdToName = {}; + for (const project of projects) { + projectIdToName[project._id.toString()] = project.name; } + + const updatedProjectManagers = projectManagers.map(pm => { + const pmObj = pm.toObject(); + pmObj.isProjectLead = true; + pmObj.managedProjectNames = (pmObj.managedProjects || []).map( + pid => projectIdToName[pid.toString()] || null + ).filter(Boolean); + return pmObj; + }); + return res.status(200).send(updatedProjectManagers); } catch (err) { return res.sendStatus(400); From 78aca0c09afa30f66fc8d3961d24676637b92b60 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 17 Jul 2025 10:37:57 -0700 Subject: [PATCH 4/4] refactor: Add console log statements to resolve lint error --- backend/controllers/user.controller.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/controllers/user.controller.js b/backend/controllers/user.controller.js index 1046788db..d6bad1e1d 100644 --- a/backend/controllers/user.controller.js +++ b/backend/controllers/user.controller.js @@ -22,6 +22,7 @@ UserController.user_list = async function (req, res) { const user = await User.find(query); return res.status(200).send(user); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -38,6 +39,7 @@ UserController.admin_list = async function (req, res) { const admins = await User.find({ accessLevel: { $in: ['admin', 'superadmin'] } }); return res.status(200).send(admins); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -58,11 +60,7 @@ UserController.projectManager_list = async function (req, res) { }); // Collect all unique project IDs - const allProjectIds = [ - ...new Set( - projectManagers.flatMap(pm => pm.managedProjects) - ), - ]; + const allProjectIds = [...new Set(projectManagers.flatMap((pm) => pm.managedProjects))]; // Fetch all projects in one query const projects = await Project.find({ _id: { $in: allProjectIds } }); @@ -71,17 +69,18 @@ UserController.projectManager_list = async function (req, res) { projectIdToName[project._id.toString()] = project.name; } - const updatedProjectManagers = projectManagers.map(pm => { + const updatedProjectManagers = projectManagers.map((pm) => { const pmObj = pm.toObject(); pmObj.isProjectLead = true; - pmObj.managedProjectNames = (pmObj.managedProjects || []).map( - pid => projectIdToName[pid.toString()] || null - ).filter(Boolean); + pmObj.managedProjectNames = (pmObj.managedProjects || []) + .map((pid) => projectIdToName[pid.toString()] || null) + .filter(Boolean); return pmObj; }); return res.status(200).send(updatedProjectManagers); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -101,6 +100,7 @@ UserController.user_by_id = async function (req, res) { // and look downstream to see whether 404 would break anything return res.status(200).send(user); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -144,6 +144,7 @@ UserController.update = async function (req, res) { const user = await User.findOneAndUpdate({ _id: UserId }, req.body, { new: true }); return res.status(200).send(user); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -161,6 +162,7 @@ UserController.delete = async function (req, res) { const user = await User.findByIdAndDelete(UserId); return res.status(200).send(user); } catch (err) { + console.log(err); return res.sendStatus(400); } }; @@ -230,7 +232,7 @@ UserController.signin = function (req, res) { }; UserController.verifySignIn = async function (req, res) { - // eslint-disable-next-line dot-notation + let token = req.headers['x-access-token'] || req.headers['authorization']; if (token.startsWith('Bearer ')) { // Remove Bearer from string @@ -243,6 +245,7 @@ UserController.verifySignIn = async function (req, res) { res.cookie('token', token, { httpOnly: true }); return res.send(user); } catch (err) { + console.log(err); return res.status(403); } };