Skip to content
Snippets Groups Projects
scheduleController.js 5.82 KiB
Newer Older
// controllers/scheduleController.js
const ScheduleService = require('../services/scheduleService');
const ScheduleRequestDTO = require('../dtos/ScheduleRequestDTO');

class scheduleController {
    /**
     * 스케줄 생성
     * POST /api/schedule
     * 해당 사용자 id는 auth 미들웨어에서 설정된 사용자 정보 이용
     * req.user = User 모델의 인스턴스
     * 요청 본문 예시:
     * {
     *   title: 'Schedule Title',
     *   is_fixed: true,
     *   events: [
     *     { time_idx: 36 },
     *     { time_idx: 37 },
     *     // ...
     *   ]
     * }
     */
    async createSchedule(req, res) {
        try {
            const userId = req.user.id;
            const scheduleRequestDTO = new ScheduleRequestDTO(req.body);
            const validatedData = scheduleRequestDTO.validate('create'); // 'create' 타입 검증
            const { title, is_fixed, events } = validatedData;

            const schedules = await ScheduleService.createSchedules({
            });

            return res.status(201).json({
                success: true,
            });
        } catch (error) {
            return res.status(400).json({
                success: false,
                error: {
                    message: error.message,
                    code: 'SCHEDULE_CREATE_ERROR'

    /**
     * 스케줄 수정
     * PUT /api/schedule
     * Bulk update 지원
     * 요청 본문 예시:
     * {
     *   updates: [
     *     { time_idx: 36, title: 'New Title', is_fixed: true },
     *     { time_idx: 44, title: 'Another Title' },
     *     // ...
     *   ]
     * }
    async updateSchedules(req, res) {
        try {
            const userId = req.user.id;
            const scheduleRequestDTO = new ScheduleRequestDTO(req.body);
            const validatedData = scheduleRequestDTO.validate('bulk_update'); // 'bulk_update' 타입 검증

            const { updates } = validatedData;
            const updatedSchedules = await ScheduleService.updateSchedules(userId, updates);
            return res.status(200).json({
                success: true,
                data: {
                    schedules: updatedSchedules
                }
            });
        } catch (error) {
            if (error.code === 'SCHEDULE_NOT_FOUND') {
                return res.status(404).json({
                    success: false,
                    error: {
                        message: error.message,
                        code: 'SCHEDULE_NOT_FOUND'
                    }
                });
            }
            return res.status(400).json({
                success: false,
                error: {
                    message: error.message,
                    code: 'SCHEDULE_UPDATE_ERROR'
                }
            });
     * DELETE /api/schedule
     * Bulk delete 지원
     * 요청 본문 예시:
     * {
     *   time_idxs: [36, 44, ...]
     * }
    async deleteSchedules(req, res) {
        try {
            const userId = req.user.id;
            const scheduleRequestDTO = new ScheduleRequestDTO(req.body);
            const validatedData = scheduleRequestDTO.validate('bulk_delete'); // 'bulk_delete' 타입 검증

            const { time_idxs } = validatedData;
            const result = await ScheduleService.deleteSchedules(userId, time_idxs);

            return res.status(200).json({
                success: true,
                data: {
                    message: 'Schedules successfully deleted',
                    deleted_time_idxs: result.deleted_time_idxs
                }
            });
        } catch (error) {
            return res.status(404).json({
                success: false,
                error: {
                    message: error.message,
                    code: 'SCHEDULE_DELETE_ERROR'
    /**
     * 해당 사용자 전체 스케줄 조회
     * GET /api/schedule/all
     */
    async getAllSchedules(req, res) {
        try {
            const userId = req.user.id;
            const schedules = await ScheduleService.getAllSchedules(userId);

            return res.status(200).json({
                success: true,
            });
        } catch (error) {
            return res.status(500).json({
                success: false,
                error: {
                    message: 'Failed to fetch schedules',
                    code: 'FETCH_ERROR'
                }
            });
        }
    }

    /**
     * 해당 사용자 특정 스케줄 조회
     * GET /api/schedule/:time_idx
     * 예: GET /api/schedule/36
    async getScheduleByTimeIdx(req, res) {
            const { time_idx } = req.params;
            const userId = req.user.id;

            const schedule = await ScheduleService.getScheduleByTimeIdx(userId, parseInt(time_idx, 10));

            return res.status(200).json({
                success: true,
            });
        } catch (error) {
            if (error.message === 'Schedule not found') {
                return res.status(404).json({
                    success: false,
                    error: {
                        message: error.message,
                        code: 'SCHEDULE_NOT_FOUND'
                    }
                });
            }

            return res.status(500).json({
                success: false,
                error: {
                    message: 'Failed to fetch schedule',
                    code: 'FETCH_ERROR'
                }
            });
        }
    }
}

module.exports = new scheduleController();