refactor: API 서버 구조 개선 및 표준화

- 통합 에러 처리 시스템 구축:
  * utils/errorHandler.js: ApiError 클래스 및 에러 미들웨어
  * 데이터베이스, 유효성 검사, 권한 에러 표준화
  * 비동기 함수 래퍼 (asyncHandler) 추가

- 응답 포맷터 시스템 구축:
  * utils/responseFormatter.js: 일관된 API 응답 형식
  * 성공, 페이지네이션, 인증, 파일업로드 등 전용 포맷터
  * Express 응답 확장 미들웨어

- 유효성 검사 시스템 구축:
  * utils/validator.js: 스키마 기반 유효성 검사
  * 필수 필드, 타입, 길이, 형식 검사 함수들
  * 일반적인 스키마 정의 (사용자, 프로젝트, 작업보고서 등)

- 코드 정리 및 표준화:
  * 삭제된 테이블 참조 제거 (work_report_audit_log 등)
  * 대문자 테이블명을 소문자로 통일 (Users -> users)
  * authController.js에 새로운 유틸리티 적용 예시

- 미들웨어 통합:
  * index.js에 에러 핸들러 및 응답 포맷터 적용
  * 헬스체크 엔드포인트 개선
This commit is contained in:
Hyungi Ahn
2025-11-03 10:42:29 +09:00
parent 31e941cfbd
commit 4716434d65
8 changed files with 720 additions and 105 deletions

View File

@@ -2,38 +2,32 @@ const { getDb } = require('../dbPool');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const authService = require('../services/auth.service');
const { ApiError, asyncHandler } = require('../utils/errorHandler');
const { validateSchema, schemas } = require('../utils/validator');
const login = async (req, res) => {
try {
const { username, password } = req.body;
const ipAddress = req.ip || req.connection.remoteAddress;
const userAgent = req.headers['user-agent'];
const login = asyncHandler(async (req, res) => {
const { username, password } = req.body;
const ipAddress = req.ip || req.connection.remoteAddress;
const userAgent = req.headers['user-agent'];
if (!username || !password) {
return res.status(400).json({ error: '사용자명과 비밀번호를 입력해주세요.' });
}
const result = await authService.loginService(username, password, ipAddress, userAgent);
if (!result.success) {
return res.status(result.status || 400).json({ error: result.error });
}
// 로그인 성공 후, 모든 권한을 그룹장 대시보드로 통일
const user = result.data.user;
let redirectUrl = '/pages/dashboard/group-leader.html'; // 모든 사용자를 그룹장 대시보드로 리다이렉트
// 최종 응답에 redirectUrl을 포함하여 전달
res.json({
...result.data,
redirectUrl: redirectUrl
});
} catch (error) {
console.error('Login controller error:', error);
res.status(500).json({ error: error.message || '서버 오류가 발생했습니다.' });
// 유효성 검사
if (!username || !password) {
throw new ApiError('사용자명과 비밀번호를 입력해주세요.', 400);
}
};
const result = await authService.loginService(username, password, ipAddress, userAgent);
if (!result.success) {
throw new ApiError(result.error, result.status || 400);
}
// 로그인 성공 후, 모든 권한을 그룹장 대시보드로 통일
const user = result.data.user;
const redirectUrl = '/pages/dashboard/group-leader.html'; // 모든 사용자를 그룹장 대시보드로 리다이렉트
// 새로운 응답 포맷터 사용
res.auth(user, result.data.token, redirectUrl, '로그인 성공');
});
// ✅ 사용자 등록 기능 추가
exports.register = async (req, res) => {