Skip to content
Snippets Groups Projects
Commit 9a8fa72a authored by Wo-ogie's avatar Wo-ogie
Browse files

feat: 투표 종료 시 알림 메일 발송 기능 구현

parent 0d997171
Branches
No related tags found
No related merge requests found
const bcrypt = require('bcrypt'); const bcrypt = require('bcrypt');
const { Meeting, Participant, Schedule } = require('../models'); const { Meeting, Participant, Schedule } = require('../models');
const meetingRepositotry = require('../repository/meeting'); const meetingRepositotry = require('../repository/meeting');
const { sendMeetingVoteEndNotificationEmail } = require('../services/mail');
const { const {
createMeetingNotFoundError, createMeetingNotFoundError,
createMeetingIsAlreadyClosedError, createMeetingIsAlreadyClosedError,
...@@ -37,6 +38,21 @@ async function getMeetingById(meetingId) { ...@@ -37,6 +38,21 @@ async function getMeetingById(meetingId) {
return meeting; return meeting;
} }
async function getMeetingWithParticipantsById(meetingId) {
const meeting = await Meeting.findOne({
where: { id: meetingId },
include: [
{
model: Participant,
},
],
});
if (!meeting) {
throw createMeetingNotFoundError();
}
return meeting;
}
async function getMeetingWithParticipantsAndSchedulesById(meetingId) { async function getMeetingWithParticipantsAndSchedulesById(meetingId) {
const meeting = await Meeting.findOne({ const meeting = await Meeting.findOne({
where: { id: meetingId }, where: { id: meetingId },
...@@ -219,7 +235,8 @@ function validateMeetingIsNotClosed(meeting) { ...@@ -219,7 +235,8 @@ function validateMeetingIsNotClosed(meeting) {
exports.closeMeeting = async (req, res, next) => { exports.closeMeeting = async (req, res, next) => {
try { try {
const meeting = await getMeetingById(req.params.meetingId); const { meetingId } = req.params;
const meeting = await getMeetingWithParticipantsById(meetingId);
await validatePasswordIsMatched( await validatePasswordIsMatched(
req.body.adminPassword, req.body.adminPassword,
meeting.adminPassword, meeting.adminPassword,
...@@ -229,6 +246,12 @@ exports.closeMeeting = async (req, res, next) => { ...@@ -229,6 +246,12 @@ exports.closeMeeting = async (req, res, next) => {
meeting.isClosed = true; meeting.isClosed = true;
await meeting.save(); await meeting.save();
await Promise.all(
meeting.Participants.filter((participant) => participant.email).map(
(participant) =>
sendMeetingVoteEndNotificationEmail(participant.email, meetingId),
),
);
return res.json(MeetingResponse.from(meeting)); return res.json(MeetingResponse.from(meeting));
} catch (error) { } catch (error) {
return next(error); return next(error);
......
This diff is collapsed.
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"author": "JaeUk", "author": "JaeUk",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@aws-sdk/client-ses": "^3.468.0",
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
...@@ -18,6 +19,7 @@ ...@@ -18,6 +19,7 @@
"express-session": "^1.17.3", "express-session": "^1.17.3",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"mysql2": "^3.6.3", "mysql2": "^3.6.3",
"nodemailer": "^6.9.7",
"sequelize": "^6.35.0", "sequelize": "^6.35.0",
"sequelize-cli": "^6.6.2", "sequelize-cli": "^6.6.2",
"uuid": "^9.0.1" "uuid": "^9.0.1"
......
const nodemailer = require('nodemailer');
const aws = require('@aws-sdk/client-ses');
const ses = new aws.SES({
region: 'ap-northeast-2',
});
exports.sendMeetingVoteEndNotificationEmail = async (
destMailAddress,
meetingId,
) => {
const title = '[언제모임] 약속 일정 투표가 종료되었습니다.';
const meetingResultPageUrl = `${process.env.SERVICE_URL}/resultend/${meetingId}`;
const content = `
<h1>약속 일정 투표 종료 알림</h1>
<p>약속 일정 투표가 종료되었습니다.</p>
<p>다음 링크에 접속하여 참가자들의 일정을 확인해보고, 약속 일정을 확정해주세요.</p>
<a href="${meetingResultPageUrl}">${meetingResultPageUrl}</a>
`;
const transporter = nodemailer.createTransport({
SES: { ses, aws },
});
await transporter.sendMail(
{
from: process.env.SERVICE_MAIL_ADDRESS,
to: destMailAddress,
subject: title,
html: content,
},
(err, info) => {
if (err) {
throw err;
}
},
);
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment