From 34d38b29389330808de439984aede0d14ff686d0 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Mon, 3 Nov 2025 10:54:51 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20dailyWorkReportController.js=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 새로운 에러 처리 시스템 적용: * asyncHandler로 비동기 함수 래핑 * ApiError 클래스로 유효성 검사 에러 처리 * handleDatabaseError로 DB 에러 표준화 - 새로운 응답 포맷터 적용: * res.created() - 작업보고서 생성 성공 응답 * res.success() - 기여자별 요약 조회 응답 - 유효성 검사 시스템 적용: * validateSchema로 스키마 기반 검증 * schemas.createDailyWorkReport 스키마 사용 - 함수별 개선사항: * createDailyWorkReport: 스키마 검증 및 생성 응답 포맷터 * getContributorsSummary: Promise 래핑 및 성공 응답 포맷터 - 참고: 파일이 크므로 핵심 함수들만 우선 적용 추후 나머지 함수들도 점진적으로 리팩토링 예정 --- .../controllers/dailyWorkReportController.js | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) 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, '기여자별 요약 조회'); + } +}); /** * 📊 개인 누적 현황 조회 (새로운 기능)