diff --git a/src/controllers/member.controller.js b/src/controllers/member.controller.js new file mode 100644 index 0000000..5cc16ac --- /dev/null +++ b/src/controllers/member.controller.js @@ -0,0 +1,19 @@ +import { getTaskMembersService } from '../services/member.service.js'; + +export const getTaskMembers = async (req, res, next) => { + try { + const { taskId } = req.params; + const members = await getTaskMembersService(taskId); + + return res.status(200).json({ + resultType: "SUCCESS", + error: null, + success: { + members: members, + count: members.length + } + }); + } catch (error) { + next(error); // 에러 핸들러로 전달 + } +}; diff --git a/src/routes/index.js b/src/routes/index.js index 3fe6c80..f480236 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -5,7 +5,8 @@ import commentRouter from "./comment.route.js"; import taskRouter from "./task.route.js"; import modalRouter from "./modal.route.js"; import folderRouter from "./folder.route.js"; -import kakaoAuthRouter from "./auth.route.js" +import kakaoAuthRouter from "./auth.route.js"; +import memberRouter from "./member.route.js"; const router = express.Router(); // 각 도메인별 라우터 등록 @@ -16,6 +17,7 @@ router.use("/alarm", alarmRouter); router.use(commentRouter); router.use("/task", taskRouter); router.use("/reference", modalRouter); +router.use("/task", memberRouter); // health check용 기본 라우트 router.get("/health", (req, res) => { diff --git a/src/routes/member.route.js b/src/routes/member.route.js new file mode 100644 index 0000000..07a5855 --- /dev/null +++ b/src/routes/member.route.js @@ -0,0 +1,10 @@ +import express from 'express'; +import { getTaskMembers } from '../controllers/member.controller.js'; +import authenticate from '../middlewares/authenticate.middleware.js'; + +const router = express.Router(); + +// GET /api/v1/task/:taskId/members +router.get('/:taskId/members', authenticate, getTaskMembers); + +export default router; diff --git a/src/services/member.service.js b/src/services/member.service.js new file mode 100644 index 0000000..0d0cfec --- /dev/null +++ b/src/services/member.service.js @@ -0,0 +1,27 @@ +import { prisma } from '../db.config.js'; + +export const getTaskMembersService = async (taskId) => { + // 1. 해당 taskId를 가진 모든 멤버를 조회 + const members = await prisma.member.findMany({ + where: { + taskId: parseInt(taskId), // URL 파라미터는 문자열이므로 숫자로 변환 + }, + include: { + user: { // 유저 테이블의 상세 정보를 포함 + select: { + id: true, + nickname: true, + email: true, + profileImage: true, + }, + }, + }, + }); + + // 2. 화면에 필요한 필드만 반환 (프로필이미지, 닉네임, 역할) + return members.map((m) => ({ + profileImage: m.user.profileImage, + nickname: m.user.nickname, + role: m.role === 0 ? 'owner' : 'member' // 0: owner, 1: member + })); +};