refactor: dailyWorkReportController.js 부분 리팩토링 적용
- 새로운 에러 처리 시스템 적용: * asyncHandler로 비동기 함수 래핑 * ApiError 클래스로 유효성 검사 에러 처리 * handleDatabaseError로 DB 에러 표준화 - 새로운 응답 포맷터 적용: * res.created() - 작업보고서 생성 성공 응답 * res.success() - 기여자별 요약 조회 응답 - 유효성 검사 시스템 적용: * validateSchema로 스키마 기반 검증 * schemas.createDailyWorkReport 스키마 사용 - 함수별 개선사항: * createDailyWorkReport: 스키마 검증 및 생성 응답 포맷터 * getContributorsSummary: Promise 래핑 및 성공 응답 포맷터 - 참고: 파일이 크므로 핵심 함수들만 우선 적용 추후 나머지 함수들도 점진적으로 리팩토링 예정
This commit is contained in:
@@ -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, '기여자별 요약 조회');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 📊 개인 누적 현황 조회 (새로운 기능)
|
||||
|
||||
Reference in New Issue
Block a user