diff --git a/api.hyungi.net/controllers/dailyWorkReportController.js b/api.hyungi.net/controllers/dailyWorkReportController.js index 3973e7e..e174a91 100644 --- a/api.hyungi.net/controllers/dailyWorkReportController.js +++ b/api.hyungi.net/controllers/dailyWorkReportController.js @@ -1,73 +1,69 @@ // controllers/dailyWorkReportController.js - 권한별 전체 조회 지원 버전 const dailyWorkReportModel = require('../models/dailyWorkReportModel'); const dailyWorkReportService = require('../services/dailyWorkReportService'); +const { ApiError, asyncHandler, handleDatabaseError, handleNotFoundError } = require('../utils/errorHandler'); +const { validateSchema, schemas } = require('../utils/validator'); /** * 📝 작업보고서 생성 (V2 - Service Layer 사용) */ -const createDailyWorkReport = async (req, res) => { +const createDailyWorkReport = asyncHandler(async (req, res) => { + const reportData = { + ...req.body, + created_by: req.user?.user_id || req.user?.id, + created_by_name: req.user?.name || req.user?.username || '알 수 없는 사용자' + }; + + // 스키마 기반 유효성 검사 + validateSchema(reportData, schemas.createDailyWorkReport); + try { - const reportData = { - ...req.body, - created_by: req.user?.user_id || req.user?.id, - created_by_name: req.user?.name || req.user?.username || '알 수 없는 사용자' - }; - const result = await dailyWorkReportService.createDailyWorkReportService(reportData); - - res.status(201).json({ - success: true, - timestamp: new Date().toISOString(), - ...result - }); - + + res.created(result, '작업보고서가 성공적으로 생성되었습니다.'); } catch (error) { console.error('💥 작업보고서 생성 컨트롤러 오류:', error.message); - res.status(400).json({ - success: false, - error: '작업보고서 생성에 실패했습니다.', - details: error.message - }); + throw new ApiError('작업보고서 생성에 실패했습니다.', 400); } -}; +}); /** * 📊 기여자별 요약 조회 (새로운 기능) */ -const getContributorsSummary = (req, res) => { +const getContributorsSummary = asyncHandler(async (req, res) => { const { date, worker_id } = req.query; if (!date || !worker_id) { - return res.status(400).json({ - error: 'date와 worker_id가 필요합니다.', - example: 'date=2024-06-16&worker_id=1' - }); + throw new ApiError('date와 worker_id가 필요합니다.', 400); } console.log(`📊 기여자별 요약 조회: date=${date}, worker_id=${worker_id}`); - dailyWorkReportModel.getContributorsByDate(date, worker_id, (err, data) => { - if (err) { - console.error('기여자별 요약 조회 오류:', err); - return res.status(500).json({ - error: '기여자별 요약 조회 중 오류가 발생했습니다.', - details: err.message + try { + const data = await new Promise((resolve, reject) => { + dailyWorkReportModel.getContributorsByDate(date, worker_id, (err, data) => { + if (err) reject(err); + else resolve(data); }); - } + }); const totalHours = data.reduce((sum, contributor) => sum + parseFloat(contributor.total_hours || 0), 0); console.log(`📊 기여자별 요약: ${data.length}명, 총 ${totalHours}시간`); - res.json({ + + const result = { date, worker_id, contributors: data, total_contributors: data.length, - grand_total_hours: totalHours, - timestamp: new Date().toISOString() - }); - }); -}; + grand_total_hours: totalHours + }; + + res.success(result, '기여자별 요약 조회 성공'); + } catch (err) { + handleDatabaseError(err, '기여자별 요약 조회'); + } +}); /** * 📊 개인 누적 현황 조회 (새로운 기능)