fix: Prevent sending notifications to deactivated users

This commit is contained in:
Maksim Eltyshev
2026-01-23 17:20:12 +01:00
parent b2c4c530c6
commit 6ec0bafecb
3 changed files with 89 additions and 71 deletions
+45 -42
View File
@@ -296,57 +296,60 @@ module.exports = {
}); });
const notificationsByUserId = _.groupBy(notifications, 'userId'); const notificationsByUserId = _.groupBy(notifications, 'userId');
const userIds = Object.keys(notificationsByUserId);
const notificationServices = await NotificationService.qm.getByUserIds(userIds); const notifiableUsers = await User.qm.getByIds(Object.keys(notificationsByUserId), {
const { transporter } = await sails.helpers.utils.makeSmtpTransporter(); withDeactivated: false,
});
if (notificationServices.length > 0 || transporter) { if (notifiableUsers.length > 0) {
const users = await User.qm.getByIds(userIds); const notifiableUserIds = sails.helpers.utils.mapRecords(notifiableUsers);
const userById = _.keyBy(users, 'id');
const notificationServicesByUserId = _.groupBy(notificationServices, 'userId'); const notificationServices = await NotificationService.qm.getByUserIds(notifiableUserIds);
const { transporter } = await sails.helpers.utils.makeSmtpTransporter();
Object.keys(notificationsByUserId).forEach(async (userId) => { if (notificationServices.length > 0 || transporter) {
const notifiableUser = userById[userId]; const notificationServicesByUserId = _.groupBy(notificationServices, 'userId');
const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
const emails = notificationsByUserId[userId].flatMap((notification) => { notifiableUsers.forEach(async (notifiableUser) => {
const values = valuesById[notification.id]; const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
if (notificationServicesByUserId[userId]) { const emails = notificationsByUserId[notifiableUser.id].flatMap((notification) => {
const services = notificationServicesByUserId[userId].map((notificationService) => const values = valuesById[notification.id];
_.pick(notificationService, ['url', 'format']),
);
buildAndSendNotifications( if (notificationServicesByUserId[notifiableUser.id]) {
services, const services = notificationServicesByUserId[notifiableUser.id].map(
inputs.board, (notificationService) => _.pick(notificationService, ['url', 'format']),
values.card, );
notification,
values.creatorUser, buildAndSendNotifications(
t, services,
); inputs.board,
values.card,
notification,
values.creatorUser,
t,
);
}
if (transporter) {
return buildEmail(
inputs.board,
values.card,
notification,
values.creatorUser,
notifiableUser,
t,
);
}
return [];
});
if (emails.length > 0) {
sendEmails(transporter, emails);
} }
if (transporter) {
return buildEmail(
inputs.board,
values.card,
notification,
values.creatorUser,
notifiableUser,
t,
);
}
return [];
}); });
}
if (emails.length > 0) {
sendEmails(transporter, emails);
}
});
} }
return notifications; return notifications;
+33 -28
View File
@@ -277,38 +277,43 @@ module.exports = {
user: values.creatorUser, user: values.creatorUser,
}); });
const notificationServices = await NotificationService.qm.getByUserId(notification.userId); const notifiableUser = await User.qm.getOneById(notification.userId, {
const { transporter } = await sails.helpers.utils.makeSmtpTransporter(); withDeactivated: false,
});
if (notificationServices.length > 0 || transporter) { if (notifiableUser) {
const notifiableUser = await User.qm.getOneById(notification.userId); const notificationServices = await NotificationService.qm.getByUserId(notification.userId);
const t = sails.helpers.utils.makeTranslator(notifiableUser.language); const { transporter } = await sails.helpers.utils.makeSmtpTransporter();
if (notificationServices.length > 0) { if (notificationServices.length > 0 || transporter) {
const services = notificationServices.map((notificationService) => const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
_.pick(notificationService, ['url', 'format']),
);
buildAndSendNotifications( if (notificationServices.length > 0) {
services, const services = notificationServices.map((notificationService) =>
inputs.board, _.pick(notificationService, ['url', 'format']),
values.card, );
notification,
values.creatorUser,
t,
);
}
if (transporter) { buildAndSendNotifications(
buildAndSendEmail( services,
transporter, inputs.board,
inputs.board, values.card,
values.card, notification,
notification, values.creatorUser,
values.creatorUser, t,
notifiableUser, );
t, }
);
if (transporter) {
buildAndSendEmail(
transporter,
inputs.board,
values.card,
notification,
values.creatorUser,
notifiableUser,
t,
);
}
} }
} }
+11 -1
View File
@@ -48,7 +48,17 @@ const createOne = async (values) => {
return User.create({ ...values }).fetch(); return User.create({ ...values }).fetch();
}; };
const getByIds = (ids) => defaultFind(ids); const getByIds = (ids, { withDeactivated = true } = {}) => {
const criteria = {
id: ids,
};
if (!withDeactivated) {
criteria.isDeactivated = false;
}
return defaultFind(criteria);
};
const getAll = ({ roleOrRoles } = {}) => const getAll = ({ roleOrRoles } = {}) =>
defaultFind({ defaultFind({