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

feat: 가장 많이 선택한 시간 조회 API 구현

parent 70d6e075
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 {
createMeetingNotFoundError,
createMeetingIsAlreadyClosedError,
createPasswordNotMatchedError,
createPasswordIsNullError,
createMostConfirmedTimeNotFoundError,
} = require('../errors/meetingErrors');
const MeetingResponse = require('../dto/response/meetingResponse');
const MeetingWithParticipantsResponse = require('../dto/response/meetingWithParticipantsResponse');
......@@ -175,6 +177,19 @@ exports.getMeetingDetailById = async (req, res, next) => {
}
};
exports.getMostConfirmedTime = async (req, res, next) => {
const { purpose } = req.query;
if (!purpose) {
return res.status(400).json({ message: 'Purpose is required' });
}
try {
const result = await meetingRepositotry.getMostConfirmedTime(purpose);
return res.json(result);
} catch (error) {
return next(error);
}
};
function validateMeetingIsNotClosed(meeting) {
if (meeting.isClosed === true) {
throw createMeetingIsAlreadyClosedError();
......
......@@ -21,3 +21,11 @@ exports.createPasswordIsNullError = () => {
error.status = 400;
return error;
};
exports.createMostConfirmedTimeNotFoundError = () => {
const error = new Error(
'데이터가 충분하지 않아 통계 정보를 찾을 수 없습니다.',
);
error.status = 404;
return error;
};
const Sequelize = require('sequelize');
const { sequelize } = require('../models/index');
const {
createMostConfirmedTimeNotFoundError,
} = require('../errors/meetingErrors');
exports.getMostConfirmedTime = async (purpose) => {
const query = `
SELECT EXTRACT(HOUR FROM m.confirmed_time) AS confirmed_time_hour,
COUNT(1) AS confirmed_time_count
FROM meetings m
WHERE m.is_closed
AND m.purpose = :purpose
AND m.confirmed_time IS NOT NULL
GROUP BY confirmed_time_hour
ORDER BY confirmed_time_count DESC;
`;
const params = {
replacements: { purpose },
type: Sequelize.QueryTypes.SELECT,
plain: true,
};
const result = await sequelize.query(query, params);
if (!result) {
throw createMostConfirmedTimeNotFoundError();
}
return {
hour: result.confirmed_time_hour,
count: result.confirmed_time_count,
};
};
......@@ -5,6 +5,7 @@ const {
entry,
getMeetingById,
getMeetingDetailById,
getMostConfirmedTime,
closeMeeting,
confirmTime,
} = require('../controllers/meeting');
......@@ -13,6 +14,8 @@ const router = express.Router();
router.post('/', createMeeting);
router.get('/most-confirmed-time', getMostConfirmedTime);
router.post('/:meetingId/entry', entry);
router.get('/:meetingId', isAuthenticated, getMeetingById);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment