diff --git a/src/controllers/task.controller.js b/src/controllers/task.controller.js index 67a0fa9..e6b7e85 100644 --- a/src/controllers/task.controller.js +++ b/src/controllers/task.controller.js @@ -5,7 +5,23 @@ import { taskDetailResponseDTO } from "../dtos/task.dto.js"; import { taskListResponseDTO } from "../dtos/task.dto.js"; class TaskController { - // 과제 생성 + // 완료된 과제 조회 + async getCompletedTasks(req, res, next) { + try { + const userId = req.user.id; + + const result = await taskService.getCompletedTasks(userId); + + res.status(200).json({ + resultType: "SUCCESS", + message: "완료된 과제 조회에 성공하였습니다.", + data: result + }); + } catch (error) { + next(error); + } + } + async createTask(req, res, next) { try { const taskRequest = createTaskRequestDTO(req.body); @@ -242,4 +258,6 @@ class TaskController { } } + + export default new TaskController(); diff --git a/src/dtos/task.dto.js b/src/dtos/task.dto.js index 6c8aabc..cea44cb 100644 --- a/src/dtos/task.dto.js +++ b/src/dtos/task.dto.js @@ -92,4 +92,22 @@ export const taskListResponseDTO = (tasks) => { progressRate: task.progressRate // 서비스에서 계산된 값 사용 }; }); +}; + +export const responseFromCompletedTasks = (tasks) => { + return { + tasks: tasks.map((task) => ({ + taskId: task.id, + title: task.title, + deadline: task.deadline ? new Date(task.deadline).toISOString().split('T')[0] : null, + + type: task.type === "TEAM" ? "팀" : "개인", + + status: task.status === 'COMPLETED' ? '완료' : task.status, + + folderId: task.folder ? task.folder.id : null, + folderTitle: task.folder ? task.folder.folderTitle : null, + color: task.folder ? task.folder.color : null, + })), + }; }; \ No newline at end of file diff --git a/src/repositories/task.repository.js b/src/repositories/task.repository.js index 222857e..01dd4f2 100644 --- a/src/repositories/task.repository.js +++ b/src/repositories/task.repository.js @@ -1,6 +1,24 @@ import { prisma } from "../db.config.js"; class TaskRepository { + async getCompletedTasks(userId) { + return await prisma.task.findMany({ + where: { + folder: { + userId: userId, + }, + + status: 'COMPLETED', + }, + include: { + folder: true, + }, + orderBy: { + deadline: 'asc', + }, + }); + } + // 폴더 찾기 async findFolderById(id) { return await prisma.folder.findUnique({ where: { id } }); diff --git a/src/routes/task.route.js b/src/routes/task.route.js index cc6237f..d370779 100644 --- a/src/routes/task.route.js +++ b/src/routes/task.route.js @@ -1,9 +1,12 @@ import express from "express"; import taskController from "../controllers/task.controller.js"; -import authenticate from '../middlewares/authenticate.middleware.js'; +import authenticate from "../middlewares/authenticate.middleware.js"; const router = express.Router(); +// 완료된 과제 +router.get("/completed", authenticate, taskController.getCompletedTasks); + // POST /api/v1/task -- 과제 생성 router.post("/", authenticate, taskController.createTask); @@ -29,6 +32,7 @@ router.patch("/:taskId/member/:memberId", authenticate, taskController.updateTea // 세부 TASK 상태 업데이트 router.patch( '/subtask/:subTaskId/status', + authenticate, taskController.updateSubTaskStatus ); diff --git a/src/services/task.service.js b/src/services/task.service.js index 2e95e6c..cd3aa01 100644 --- a/src/services/task.service.js +++ b/src/services/task.service.js @@ -1,8 +1,21 @@ import taskRepository from "../repositories/task.repository.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 { + async getCompletedTasks(userId) { + const user = await getUserData(userId); + if (!user) { + throw new NotFoundError("USER_NOT_FOUND", "해당 사용자를 찾을 수 없습니다."); + } + + const tasks = await taskRepository.getCompletedTasks(userId); + + return responseFromCompletedTasks(tasks); + } + // 과제 등록 async registerTask(data) { const { subTasks, references, folderId, ...taskData } = data;