From 9eeff20d2070765d83ecd99a41f70012ee32adcd Mon Sep 17 00:00:00 2001 From: soyun0318 Date: Fri, 13 Feb 2026 00:12:59 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A9=A4=EB=B2=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/task.controller.js | 11 +++++------ src/repositories/task.repository.js | 30 ++++++++++++++--------------- src/services/task.service.js | 24 +++++++++++++---------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/controllers/task.controller.js b/src/controllers/task.controller.js index e1d2ffc..dfea01c 100644 --- a/src/controllers/task.controller.js +++ b/src/controllers/task.controller.js @@ -186,12 +186,10 @@ class TaskController { } } - // 팀원 정보 수정 (역할 변경) async updateTeamMember(req, res, next) { try { - const taskId = req.body.taskId || req.params.taskId; - const userId = req.body.userId || req.params.userId; - const { role } = req.body; + const { taskId, userId } = req.params; + const { role } = req.body; // 프론트에서 0(Owner) 또는 1(Member)이 옴 const result = await taskService.modifyMemberRole( parseInt(taskId), @@ -201,12 +199,13 @@ class TaskController { res.status(200).json({ resultType: "SUCCESS", - message: "요청이 성공적으로 처리되었습니다.", + message: "멤버 권한이 변경되었습니다.", data: { memberId: result.id, userId: result.userId, taskId: result.taskId, - role: result.role ? 1 : 0, + // 📍 DB가 false(0)면 0(Owner), true(1)면 1(Member) 반환 + role: result.role ? 1 : 0 } }); } catch (error) { diff --git a/src/repositories/task.repository.js b/src/repositories/task.repository.js index ed1b82e..28b4eab 100644 --- a/src/repositories/task.repository.js +++ b/src/repositories/task.repository.js @@ -177,17 +177,7 @@ class TaskRepository { }); } - // 멤버 존재 여부 확인 - async findMemberInTask(taskId, userId) { - return await prisma.member.findFirst({ - where: { - taskId: parseInt(taskId), - userId: parseInt(userId) - } - }); - } - - // 나머지 멤버 역할 리셋 + // 나머지 멤버 역할 리셋 (방장 한 명을 제외하고 모두 멤버로) async resetOtherMembersRole(taskId, userId, tx) { return await tx.member.updateMany({ where: { @@ -195,16 +185,26 @@ class TaskRepository { userId: { not: parseInt(userId) }, }, data: { - role: false, + role: true, }, }); } // 대상 멤버 역할 업데이트 - async updateMemberRole(memberId, isAdmin, tx) { + async updateMemberRole(memberId, dbRoleValue, tx) { return await tx.member.update({ - where: { id: memberId }, // userId는 중복될 수 있으므로(다른 과제 등) id(PK) 사용 - data: { role: isAdmin }, + where: { id: memberId }, + data: { role: dbRoleValue }, + }); + } + + // 멤버 존재 여부 확인 + async findMemberInTask(taskId, userId) { + return await prisma.member.findFirst({ + where: { + taskId: parseInt(taskId), + userId: parseInt(userId) + } }); } diff --git a/src/services/task.service.js b/src/services/task.service.js index 21b9c16..b12c12d 100644 --- a/src/services/task.service.js +++ b/src/services/task.service.js @@ -744,21 +744,25 @@ class TaskService { }); } - // 팀원 정보 수정 + // 멤버 역할 수정 async modifyMemberRole(taskId, userId, role) { const member = await taskRepository.findMemberInTask(taskId, userId); - - if (!member) throw new NotFoundError("해당 과제에서 해당 유저를 찾을 수 없음"); + if (!member) throw new NotFoundError("해당 과제에서 해당 유저를 찾을 수 없음"); - const isAdmin = role === 1; + // 📍 0이 들어오면 방장(Owner)이 되려는 것 + const isTargetBecomingOwner = (role === 0); - return await prisma.$transaction(async (tx) => { - if (isAdmin) { - await taskRepository.resetOtherMembersRole(taskId, userId, tx); - } + return await prisma.$transaction(async (tx) => { + if (isTargetBecomingOwner) { + // 1. 새로운 방장을 제외한 나머지는 모두 '일반 멤버(true)'로 변경 + await taskRepository.resetOtherMembersRole(taskId, userId, tx); + } - return await taskRepository.updateMemberRole(member.id, isAdmin, tx); - }); + // 2. 📍 핵심: 방장(Owner)이면 false를, 아니면 true를 DB에 저장 + const dbRoleValue = isTargetBecomingOwner ? false : true; + + return await taskRepository.updateMemberRole(member.id, dbRoleValue, tx); + }); } // 단일 세부 과제 생성 서비스