refactor: dailyWorkReportController.js 부분 리팩토링 적용

- 새로운 에러 처리 시스템 적용:
  * asyncHandler로 비동기 함수 래핑
  * ApiError 클래스로 유효성 검사 에러 처리
  * handleDatabaseError로 DB 에러 표준화

- 새로운 응답 포맷터 적용:
  * res.created() - 작업보고서 생성 성공 응답
  * res.success() - 기여자별 요약 조회 응답

- 유효성 검사 시스템 적용:
  * validateSchema로 스키마 기반 검증
  * schemas.createDailyWorkReport 스키마 사용

- 함수별 개선사항:
  * createDailyWorkReport: 스키마 검증 및 생성 응답 포맷터
  * getContributorsSummary: Promise 래핑 및 성공 응답 포맷터

- 참고: 파일이 크므로 핵심 함수들만 우선 적용
  추후 나머지 함수들도 점진적으로 리팩토링 예정
This commit is contained in:
Hyungi Ahn
2025-11-03 10:54:51 +09:00
parent 99210fec1b
commit 34d38b2938

View File

@@ -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, '기여자별 요약 조회');
}
});
/**
* 📊 개인 누적 현황 조회 (새로운 기능)