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
20 changes: 19 additions & 1 deletion src/controllers/task.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -242,4 +258,6 @@ class TaskController {
}
}



export default new TaskController();
18 changes: 18 additions & 0 deletions src/dtos/task.dto.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
})),
};
};
18 changes: 18 additions & 0 deletions src/repositories/task.repository.js
Original file line number Diff line number Diff line change
@@ -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 } });
Expand Down
6 changes: 5 additions & 1 deletion src/routes/task.route.js
Original file line number Diff line number Diff line change
@@ -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);

Expand All @@ -29,6 +32,7 @@ router.patch("/:taskId/member/:memberId", authenticate, taskController.updateTea
// 세부 TASK 상태 업데이트
router.patch(
'/subtask/:subTaskId/status',
authenticate,
taskController.updateSubTaskStatus
);

Expand Down
13 changes: 13 additions & 0 deletions src/services/task.service.js
Original file line number Diff line number Diff line change
@@ -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;
Expand Down