From 16fc78901c77069e932e14c243a468f2ed05b8c3 Mon Sep 17 00:00:00 2001 From: WikiRik Date: Fri, 5 Apr 2024 09:32:08 +0000 Subject: [PATCH 1/3] fix: fetch all notification_emails together --- lib/applications.js | 82 ++++++++++++++++++++++++++++++--------------- lib/middlewares.js | 8 +++-- lib/positions.js | 22 ++++++++---- 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/lib/applications.js b/lib/applications.js index 58d048fe..026bf0ab 100644 --- a/lib/applications.js +++ b/lib/applications.js @@ -9,6 +9,7 @@ const { Application, VotesPerAntenna, PaxLimit } = require('../models'); const constants = require('./constants'); const helpers = require('./helpers'); const { sequelize } = require('./sequelize'); +const logger = require('./logger'); exports.listAllApplications = async (req, res) => { if (!req.permissions.see_applications) { @@ -20,14 +21,19 @@ exports.listAllApplications = async (req, res) => { query: req.query }); - applications.rows = await Promise.all(applications.rows - .map(async (application) => { - const user = await core.fetchApplicationUser(application.user_id); + const userIds = applications.rows.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - application.dataValues.notification_email = user.notification_email; + for (const application of applications.rows) { + const user = mails.find((m) => application.user_id === m.id); - return application; - })); + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } + + application.dataValues.notification_email = user.notification_email; + } return res.json({ success: true, @@ -49,14 +55,19 @@ exports.listIncomingApplications = async (req, res) => { query: req.query }); - applications.rows = await Promise.all(applications.rows - .map(async (application) => { - const user = await core.fetchApplicationUser(application.user_id); + const userIds = applications.rows.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); + + for (const application of applications.rows) { + const user = mails.find((m) => application.user_id === m.id); - application.dataValues.notification_email = user.notification_email; + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - return application; - })); + application.dataValues.notification_email = user.notification_email; + } return res.json({ success: true, @@ -208,18 +219,23 @@ exports.listBoardView = async (req, res) => { } // 'zzzzz' is used to be last, 'unset' won't do - let applications = await Application.findAll({ + const applications = await Application.findAll({ where: { event_id: req.event.id, body_id: parseInt(req.params.body_id, 10) }, }); - applications = await Promise.all(applications - .map(async (application) => { - const user = await core.fetchApplicationUser(application.user_id); + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); + + for (const application of applications) { + const user = mails.find((m) => application.user_id === m.id); - application.dataValues.notification_email = user.notification_email; + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - return application; - })); + application.dataValues.notification_email = user.notification_email; + } const sortedApplications = applications.sort((a, b) => { // first, comparing by participant type @@ -723,11 +739,18 @@ exports.exportOpenslides = async (req, res) => { 'Email' ]; + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); + const applicationsString = await Promise.all(applications.map(async (application) => { // Generating random pw for a user. const password = crypto.randomBytes(5).toString('hex'); - const user = await core.fetchApplicationUser(application.user_id); + const user = mails.find((m) => application.user_id === m.id); + + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + } return [ '', // Title @@ -788,16 +811,21 @@ exports.exportAll = async (req, res) => { const headersNames = helpers.getApplicationFields(req.event); const headers = req.query.select.map((field) => headersNames[field]); - let applications = await Application.findAll({ where: { event_id: req.event.id, ...applicationsFilter } }); + const applications = await Application.findAll({ where: { event_id: req.event.id, ...applicationsFilter } }); + + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - applications = await Promise.all(applications - .map(async (application) => { - const user = await core.fetchApplicationUser(application.user_id); + for (const application of applications) { + const user = mails.find((m) => application.user_id === m.id); - application.dataValues.notification_email = user.notification_email; + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - return application; - })); + application.dataValues.notification_email = user.notification_email; + } const resultArray = applications .map((application) => application.toJSON()) diff --git a/lib/middlewares.js b/lib/middlewares.js index 3d3a70b2..09d03605 100644 --- a/lib/middlewares.js +++ b/lib/middlewares.js @@ -177,9 +177,11 @@ exports.fetchSingleApplication = async (req, res, next) => { return errors.makeNotFoundError(res, userPrefix + ' haven\'t applied to this event yet.'); } - const user = await core.fetchApplicationUser(application.user_id); + const mail = await core.getMails(req, application.user_id); - application.dataValues.notification_email = user.notification_email; + if (mail) { + application.dataValues.notification_email = mail.notification_email; + } req.application = application; @@ -205,7 +207,7 @@ exports.fetchSingleApplication = async (req, res, next) => { return errors.makeNotFoundError(res, userPrefix + ' haven\'t applied to this event yet.'); } - incomingApplication.dataValues.notification_email = user.notification_email; + incomingApplication.dataValues.notification_email = mail.notification_email; req.application = incomingApplication; } diff --git a/lib/positions.js b/lib/positions.js index 61186fa0..2e4a821d 100644 --- a/lib/positions.js +++ b/lib/positions.js @@ -5,6 +5,7 @@ const errors = require('./errors'); const { Position, Candidate, Image } = require('../models'); const helpers = require('./helpers'); const constants = require('./constants'); +const logger = require('./logger'); exports.findPosition = async (req, res, next) => { if (Number.isNaN(Number(req.params.position_id))) { @@ -59,6 +60,7 @@ exports.listPositionsWithAllCandidates = async (req, res) => { }] }); + // TODO: use core.getMails for this, fetching the notification_email of the candidates of all positions together positions = await Promise.all(positions.map(async (position) => { position.candidates = await Promise.all(position.candidates .map(async (candidate) => { @@ -90,6 +92,7 @@ exports.listPositionsWithApprovedCandidates = async (req, res) => { }] }); + // TODO: use core.getMails for this, fetching the notification_email of the candidates of all positions together positions = await Promise.all(positions.map(async (position) => { position.candidates = await Promise.all(position.candidates .map(async (candidate) => { @@ -212,7 +215,7 @@ exports.exportAll = async (req, res) => { const headersNames = constants.CANDIDATE_FIELDS; const headers = req.query.select.map((field) => headersNames[field]); - let applications = await Candidate.findAll({ + const applications = await Candidate.findAll({ where: { '$position.event_id$': req.event.id, ...applicationsFilter, @@ -223,14 +226,19 @@ exports.exportAll = async (req, res) => { }] }); - applications = await Promise.all(applications - .map(async (application) => { - const user = await core.fetchApplicationUser(application.user_id); + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - application.dataValues.notification_email = user.notification_email; + for (const application of applications) { + const user = mails.find((m) => application.user_id === m.id); - return application; - })); + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } + + application.dataValues.notification_email = user.notification_email; + } const resultArray = applications .map((application) => application.toJSON()) From cfdbe1083c6f28c9b47c7cea8c3761775b5c94c3 Mon Sep 17 00:00:00 2001 From: WikiRik Date: Fri, 5 Apr 2024 09:45:14 +0000 Subject: [PATCH 2/3] chore: fix some tests --- lib/applications.js | 80 +++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/lib/applications.js b/lib/applications.js index 026bf0ab..61dfd53d 100644 --- a/lib/applications.js +++ b/lib/applications.js @@ -21,18 +21,20 @@ exports.listAllApplications = async (req, res) => { query: req.query }); - const userIds = applications.rows.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + if (applications.rows.length > 0) { + const userIds = applications.rows.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - for (const application of applications.rows) { - const user = mails.find((m) => application.user_id === m.id); + for (const application of applications.rows) { + const user = mails.find((m) => application.user_id === m.id); - if (!user) { - logger.warn({ user_id: application.user_id }, 'Could not find user'); - continue; - } + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - application.dataValues.notification_email = user.notification_email; + application.dataValues.notification_email = user.notification_email; + } } return res.json({ @@ -55,18 +57,20 @@ exports.listIncomingApplications = async (req, res) => { query: req.query }); - const userIds = applications.rows.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + if (applications.rows.length > 0) { + const userIds = applications.rows.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - for (const application of applications.rows) { - const user = mails.find((m) => application.user_id === m.id); + for (const application of applications.rows) { + const user = mails.find((m) => application.user_id === m.id); - if (!user) { - logger.warn({ user_id: application.user_id }, 'Could not find user'); - continue; - } + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - application.dataValues.notification_email = user.notification_email; + application.dataValues.notification_email = user.notification_email; + } } return res.json({ @@ -223,18 +227,20 @@ exports.listBoardView = async (req, res) => { where: { event_id: req.event.id, body_id: parseInt(req.params.body_id, 10) }, }); - const userIds = applications.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + if (applications.length > 0) { + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - for (const application of applications) { - const user = mails.find((m) => application.user_id === m.id); + for (const application of applications) { + const user = mails.find((m) => application.user_id === m.id); - if (!user) { - logger.warn({ user_id: application.user_id }, 'Could not find user'); - continue; - } + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - application.dataValues.notification_email = user.notification_email; + application.dataValues.notification_email = user.notification_email; + } } const sortedApplications = applications.sort((a, b) => { @@ -813,18 +819,20 @@ exports.exportAll = async (req, res) => { const applications = await Application.findAll({ where: { event_id: req.event.id, ...applicationsFilter } }); - const userIds = applications.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + if (applications.length > 0) { + const userIds = applications.map((application) => application.user_id).toString(); + const mails = await core.getMails(req, userIds); - for (const application of applications) { - const user = mails.find((m) => application.user_id === m.id); + for (const application of applications) { + const user = mails.find((m) => application.user_id === m.id); - if (!user) { - logger.warn({ user_id: application.user_id }, 'Could not find user'); - continue; - } + if (!user) { + logger.warn({ user_id: application.user_id }, 'Could not find user'); + continue; + } - application.dataValues.notification_email = user.notification_email; + application.dataValues.notification_email = user.notification_email; + } } const resultArray = applications From 5bc8f41b03af16285e5f165f1cc634e9246bed73 Mon Sep 17 00:00:00 2001 From: WikiRik Date: Fri, 5 Apr 2024 09:53:30 +0000 Subject: [PATCH 3/3] chore: fix more tests --- lib/applications.js | 8 ++++++-- lib/positions.js | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/applications.js b/lib/applications.js index 61dfd53d..35a5a3ae 100644 --- a/lib/applications.js +++ b/lib/applications.js @@ -745,8 +745,12 @@ exports.exportOpenslides = async (req, res) => { 'Email' ]; - const userIds = applications.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + let mails = []; + + if (applications.length > 0) { + const userIds = applications.map((application) => application.user_id).toString(); + mails = await core.getMails(req, userIds); + } const applicationsString = await Promise.all(applications.map(async (application) => { // Generating random pw for a user. diff --git a/lib/positions.js b/lib/positions.js index 2e4a821d..0c075c93 100644 --- a/lib/positions.js +++ b/lib/positions.js @@ -226,8 +226,12 @@ exports.exportAll = async (req, res) => { }] }); - const userIds = applications.map((application) => application.user_id).toString(); - const mails = await core.getMails(req, userIds); + let mails = []; + + if (applications.length > 0) { + const userIds = applications.map((application) => application.user_id).toString(); + mails = await core.getMails(req, userIds); + } for (const application of applications) { const user = mails.find((m) => application.user_id === m.id);