Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 31 additions & 3 deletions src/controllers/task.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -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);
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/routes/task.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
);

Expand Down
65 changes: 24 additions & 41 deletions src/services/task.service.js
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -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;
}

Expand All @@ -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) {
Expand All @@ -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;
}

Expand All @@ -201,7 +175,7 @@ class TaskService {
// 부모 태스크의 마감일을 초과하는지 확인
if (newDeadline > parentEndDate) {
const error = new Error('부모 Task의 마감일을 초과할 수 없습니다.');
error.status = 400;
error.statusCode = 400;
throw error;
}

Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -282,15 +257,15 @@ class TaskService {

if (!isTeamMember) {
const error = new Error('팀원만 담당자로 지정할 수 있습니다.');
error.status = 400;
error.statusCode = 400;
throw error;
}
} else {
// 개인 과제인 경우: 본인만 담당자로 지정 가능
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;
}
}
Expand Down Expand Up @@ -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;
}
Expand Down