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

refactor: Meeting 관련 기능 재사용 가능하도록 controller-service 구조로 변경

parent 693fe0dd
No related branches found
No related tags found
No related merge requests found
const bcrypt = require('bcrypt');
const { Meeting, Participant, Schedule } = require('../models');
const meetingRepositotry = require('../repository/meeting');
const { sendMeetingVoteEndNotificationEmail } = require('../services/mail');
const { Meeting, Participant } = require('../models');
const meetingRepository = require('../repository/meeting');
const {
getMeetingById,
getMeetingWithParticipantsById,
getMeetingWithParticipantsAndSchedulesById,
closeMeetingById,
} = require('../services/meeting');
const {
createMeetingNotFoundError,
createMeetingIsAlreadyClosedError,
createPasswordNotMatchedError,
createPasswordIsNullError,
} = require('../errors/meetingErrors');
......@@ -28,51 +31,6 @@ async function encryptPassword(password, next) {
}
}
async function getMeetingById(meetingId) {
const meeting = await Meeting.findOne({
where: { id: meetingId },
});
if (!meeting) {
throw createMeetingNotFoundError();
}
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) {
const meeting = await Meeting.findOne({
where: { id: meetingId },
include: [
{
model: Participant,
include: [
{
model: Schedule,
},
],
},
],
});
if (!meeting) {
throw createMeetingNotFoundError();
}
return meeting;
}
async function getParticipantByNameAndMeetingId(name, meetingId) {
const participant = await Participant.findOne({
where: {
......@@ -218,7 +176,7 @@ exports.getTopThreeConfirmedTimes = async (req, res, next) => {
return res.status(400).json({ message: 'Purpose is required' });
}
try {
const results = await meetingRepositotry.getTopThreeConfirmedTimes(purpose);
const results = await meetingRepository.getTopThreeConfirmedTimes(purpose);
return res.json({
topThreeConfirmedTimes: results,
});
......@@ -227,31 +185,20 @@ exports.getTopThreeConfirmedTimes = async (req, res, next) => {
}
};
function validateMeetingIsNotClosed(meeting) {
if (meeting.isClosed === true) {
throw createMeetingIsAlreadyClosedError();
}
}
exports.closeMeeting = async (req, res, next) => {
try {
// TODO: query 최적화 필요
const { meetingId } = req.params;
const meeting = await getMeetingWithParticipantsById(meetingId);
let meeting = await getMeetingById(meetingId);
await validatePasswordIsMatched(
req.body.adminPassword,
meeting.adminPassword,
);
validateMeetingIsNotClosed(meeting);
meeting.isClosed = true;
await meeting.save();
await closeMeetingById(meetingId);
await Promise.all(
meeting.Participants.filter((participant) => participant.email).map(
(participant) =>
sendMeetingVoteEndNotificationEmail(participant.email, meetingId),
),
);
meeting = await getMeetingWithParticipantsById(meetingId);
return res.json(MeetingResponse.from(meeting));
} catch (error) {
return next(error);
......
const { sendMeetingVoteEndNotificationEmail } = require('./mail');
const { Meeting, Participant, Schedule } = require('../models');
const {
createMeetingNotFoundError,
createMeetingIsAlreadyClosedError,
} = require('../errors/meetingErrors');
const getMeetingById = async (meetingId) => {
const meeting = await Meeting.findOne({
where: { id: meetingId },
});
if (!meeting) {
throw createMeetingNotFoundError();
}
return meeting;
};
const getMeetingWithParticipantsById = async (meetingId) => {
const meeting = await Meeting.findOne({
where: { id: meetingId },
include: [
{
model: Participant,
},
],
});
if (!meeting) {
throw createMeetingNotFoundError();
}
return meeting;
};
const getMeetingWithParticipantsAndSchedulesById = async (meetingId) => {
const meeting = await Meeting.findOne({
where: { id: meetingId },
include: [
{
model: Participant,
include: [
{
model: Schedule,
},
],
},
],
});
if (!meeting) {
throw createMeetingNotFoundError();
}
return meeting;
};
function validateMeetingIsNotClosed(meeting) {
if (meeting.isClosed === true) {
throw createMeetingIsAlreadyClosedError();
}
}
const closeMeetingById = async (meetingId) => {
const meeting = getMeetingById(meetingId);
validateMeetingIsNotClosed(meeting);
meeting.isClosed = true;
await meeting.save();
await Promise.all(
meeting.Participants.filter((participant) => participant.email).map(
(participant) =>
sendMeetingVoteEndNotificationEmail(participant.email, meetingId),
),
);
};
module.exports = {
getMeetingById,
getMeetingWithParticipantsById,
getMeetingWithParticipantsAndSchedulesById,
closeMeetingById,
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment