/** * 스케줄 자동 생성 컨트롤러 * * 스케줄 미리보기, 적용, 조회 API를 제공합니다. */ import { Request, Response } from "express"; import { ScheduleService } from "../services/scheduleService"; export class ScheduleController { private scheduleService: ScheduleService; constructor() { this.scheduleService = new ScheduleService(); } /** * 스케줄 미리보기 * POST /api/schedule/preview * * 선택한 소스 데이터를 기반으로 생성될 스케줄을 미리보기합니다. * 실제 저장은 하지 않습니다. */ preview = async (req: Request, res: Response): Promise => { try { const { config, sourceData, period } = req.body; const userId = (req as any).user?.userId || "system"; const companyCode = (req as any).user?.companyCode || "*"; console.log("[ScheduleController] preview 호출:", { scheduleType: config?.scheduleType, sourceDataCount: sourceData?.length, period, userId, companyCode, }); // 필수 파라미터 검증 if (!config || !config.scheduleType) { res.status(400).json({ success: false, message: "스케줄 설정(config)이 필요합니다.", }); return; } if (!sourceData || sourceData.length === 0) { res.status(400).json({ success: false, message: "소스 데이터가 필요합니다.", }); return; } // 미리보기 생성 const preview = await this.scheduleService.generatePreview( config, sourceData, period, companyCode ); res.json({ success: true, preview, }); } catch (error: any) { console.error("[ScheduleController] preview 오류:", error); res.status(500).json({ success: false, message: error.message || "스케줄 미리보기 중 오류가 발생했습니다.", }); } }; /** * 스케줄 적용 * POST /api/schedule/apply * * 미리보기 결과를 실제로 저장합니다. */ apply = async (req: Request, res: Response): Promise => { try { const { config, preview, options } = req.body; const userId = (req as any).user?.userId || "system"; const companyCode = (req as any).user?.companyCode || "*"; console.log("[ScheduleController] apply 호출:", { scheduleType: config?.scheduleType, createCount: preview?.summary?.createCount, deleteCount: preview?.summary?.deleteCount, options, userId, companyCode, }); // 필수 파라미터 검증 if (!config || !preview) { res.status(400).json({ success: false, message: "설정(config)과 미리보기(preview)가 필요합니다.", }); return; } // 적용 const applied = await this.scheduleService.applySchedules( config, preview, options || { deleteExisting: true, updateMode: "replace" }, companyCode, userId ); res.json({ success: true, applied, message: `${applied.created}건 생성, ${applied.deleted}건 삭제, ${applied.updated}건 수정되었습니다.`, }); } catch (error: any) { console.error("[ScheduleController] apply 오류:", error); res.status(500).json({ success: false, message: error.message || "스케줄 적용 중 오류가 발생했습니다.", }); } }; /** * 스케줄 목록 조회 * GET /api/schedule/list * * 타임라인 표시용 스케줄 목록을 조회합니다. */ list = async (req: Request, res: Response): Promise => { try { const { scheduleType, resourceType, resourceId, startDate, endDate, status, } = req.query; const companyCode = (req as any).user?.companyCode || "*"; console.log("[ScheduleController] list 호출:", { scheduleType, resourceType, resourceId, startDate, endDate, status, companyCode, }); const result = await this.scheduleService.getScheduleList({ scheduleType: scheduleType as string, resourceType: resourceType as string, resourceId: resourceId as string, startDate: startDate as string, endDate: endDate as string, status: status as string, companyCode, }); res.json({ success: true, data: result.data, total: result.total, }); } catch (error: any) { console.error("[ScheduleController] list 오류:", error); res.status(500).json({ success: false, message: error.message || "스케줄 조회 중 오류가 발생했습니다.", }); } }; /** * 스케줄 삭제 * DELETE /api/schedule/:scheduleId */ delete = async (req: Request, res: Response): Promise => { try { const { scheduleId } = req.params; const userId = (req as any).user?.userId || "system"; const companyCode = (req as any).user?.companyCode || "*"; console.log("[ScheduleController] delete 호출:", { scheduleId, userId, companyCode, }); const result = await this.scheduleService.deleteSchedule( parseInt(scheduleId, 10), companyCode, userId ); if (!result.success) { res.status(404).json({ success: false, message: result.message || "스케줄을 찾을 수 없습니다.", }); return; } res.json({ success: true, message: "스케줄이 삭제되었습니다.", }); } catch (error: any) { console.error("[ScheduleController] delete 오류:", error); res.status(500).json({ success: false, message: error.message || "스케줄 삭제 중 오류가 발생했습니다.", }); } }; }