diff --git a/src/controllers/task.controller.js b/src/controllers/task.controller.js index e6b7e85..8655309 100644 --- a/src/controllers/task.controller.js +++ b/src/controllers/task.controller.js @@ -184,7 +184,7 @@ class TaskController { } // 세부task 날짜 변경 API - async updateSubTaskDeadline(req, res, next){ + async updateSubTaskDeadline(req, res, next) { try { const { subTaskId } = req.params; const { endDate } = req.body; @@ -197,13 +197,26 @@ class TaskController { resultType: 'SUCCESS', message: '마감 기한이 변경되었습니다.', data: { - sub_task_id: updatedTask.id, + sub_task_id: updatedTask.id, end_date: updatedTask.endDate.toISOString().split('T')[0] } }; return res.status(200).json(responseData); } catch (error) { + console.error('Error in updateSubTaskDeadline:', { + message: error.message, + stack: error.stack, + status: error.status, + errorCode: error.errorCode + }); + + // 에러 객체에 상태 코드가 없으면 500으로 설정 + if (!error.status) { + error.status = 500; + error.errorCode = 'INTERNAL_SERVER_ERROR'; + } + next(error); } } @@ -231,7 +244,22 @@ class TaskController { return res.status(200).json(responseData); } catch (error) { - console.error('Error in setSubTaskAssignee:', error); + console.error('Error in setSubTaskAssignee:', { + message: error.message, + stack: error.stack, + statusCode: error.statusCode || error.status, + errorCode: error.errorCode + }); + + // 에러 객체에 상태 코드가 없으면 500으로 설정 + if (!error.statusCode && !error.status) { + error.statusCode = 500; + error.errorCode = 'INTERNAL_SERVER_ERROR'; + } else if (error.status) { + // 이전 버전과의 호환성을 위해 status가 있으면 statusCode로 복사 + error.statusCode = error.status; + } + next(error); } } diff --git a/src/routes/task.route.js b/src/routes/task.route.js index d370779..3ae135e 100644 --- a/src/routes/task.route.js +++ b/src/routes/task.route.js @@ -40,12 +40,14 @@ router.patch( // 세부 TASK 마감일 변경 router.patch( '/subtask/:subTaskId/deadline', + authenticate, taskController.updateSubTaskDeadline ); // 세부 TASK 담당자 설정 API router.patch( '/subtask/:subTaskId/assignee', + authenticate, taskController.setSubTaskAssignee ); diff --git a/src/services/task.service.js b/src/services/task.service.js index cd3aa01..d4294b7 100644 --- a/src/services/task.service.js +++ b/src/services/task.service.js @@ -1,7 +1,7 @@ import taskRepository from "../repositories/task.repository.js"; +import { BadRequestError, NotFoundError, ForbiddenError } from "../errors/custom.error.js"; import { getUserData } from "../repositories/user.repository.js"; import { responseFromCompletedTasks } from "../dtos/task.dto.js"; -import { BadRequestError, NotFoundError } from "../errors/custom.error.js"; import { prisma } from "../db.config.js"; class TaskService { @@ -124,7 +124,8 @@ class TaskService { if (!existingTask) { const error = new Error('해당하는 세부 태스크를 찾을 수 없습니다.'); - error.status = 404; + error.statusCode = 404; + error.errorCode = 'SUBTASK_NOT_FOUND'; throw error; } @@ -144,35 +145,7 @@ class TaskService { } } - // 세부 TASK 완료 처리 API - async updateSubTaskStatus(subTaskId, status) { - try { - // 서브태스크 존재 여부 확인 - const existingTask = await prisma.SubTask.findUnique({ - where: { id: parseInt(subTaskId) }, - }); - - if (!existingTask) { - const error = new Error('해당하는 세부 태스크를 찾을 수 없습니다.'); - error.status = 404; - throw error; - } - - // 상태 업데이트(프리지마 모델명은 대소문자 구분!) - const updatedTask = await prisma.SubTask.update({ - where: { id: parseInt(subTaskId) }, - data: { - status: status === 'COMPLETE' ? 'COMPLETED' : 'PENDING', - updatedAt: new Date() - }, - }); - - return updatedTask; - } catch (error) { - console.error('Error updating subtask status:', error); - throw error; - } - } + // 세부task 날짜 변경 API async updateSubTaskDeadline(subTaskId, deadline) { @@ -191,7 +164,8 @@ class TaskService { if (!existingTask) { const error = new Error('해당하는 세부 태스크를 찾을 수 없습니다.'); - error.status = 404; + error.statusCode = 404; + error.errorCode = 'SUBTASK_NOT_FOUND'; throw error; } @@ -201,7 +175,7 @@ class TaskService { // 부모 태스크의 마감일을 초과하는지 확인 if (newDeadline > parentEndDate) { const error = new Error('부모 Task의 마감일을 초과할 수 없습니다.'); - error.status = 400; + error.statusCode = 400; throw error; } @@ -230,7 +204,7 @@ class TaskService { const parsedSubTaskId = parseInt(subTaskId); if (isNaN(parsedSubTaskId)) { const error = new Error('유효하지 않은 세부 태스크 ID입니다.'); - error.status = 400; + error.statusCode = 400; throw error; } @@ -256,7 +230,8 @@ class TaskService { if (!existingTask) { const error = new Error('해당하는 세부 태스크를 찾을 수 없습니다.'); - error.status = 404; + error.statusCode = 404; + error.errorCode = 'SUBTASK_NOT_FOUND'; throw error; } @@ -268,7 +243,7 @@ class TaskService { const parsedAssigneeId = parseInt(assigneeId); if (isNaN(parsedAssigneeId)) { const error = new Error('유효하지 않은 담당자 ID입니다.'); - error.status = 400; + error.statusCode = 400; throw error; } @@ -282,7 +257,7 @@ class TaskService { if (!isTeamMember) { const error = new Error('팀원만 담당자로 지정할 수 있습니다.'); - error.status = 400; + error.statusCode = 400; throw error; } } else { @@ -290,7 +265,7 @@ class TaskService { const taskOwner = task.members.find(member => member.role === false)?.user; if (taskOwner && taskOwner.id !== parsedAssigneeId) { const error = new Error('개인 과제는 본인만 담당자로 지정할 수 있습니다.'); - error.status = 400; + error.statusCode = 400; throw error; } } @@ -319,13 +294,21 @@ class TaskService { console.error('Error in setSubTaskAssignee service:', { message: error.message, stack: error.stack, - status: error.status + statusCode: error.statusCode }); - if (error.status) { + // 상태 코드가 이미 설정된 에러는 그대로 전파 + if (error.statusCode) { + // 404 에러의 경우 errorCode가 없으면 추가 + if (error.statusCode === 404 && !error.errorCode) { + error.errorCode = 'NOT_FOUND'; + } throw error; } - error.status = 500; + + // 그 외의 에러는 500 에러로 처리 + error.statusCode = 500; + error.errorCode = 'INTERNAL_SERVER_ERROR'; error.message = '서버 내부 오류가 발생했습니다.'; throw error; }