From 83c37c5bfe12a32ca2cea443d5cef084930f8e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Sun, 22 Feb 2026 00:04:58 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Chore:=20=ED=8A=B9=EC=A0=95=20=EA=B7=B8?= =?UTF-8?q?=EB=A3=B9=20=EB=82=B4=20=EA=B6=8C=ED=95=9C=20=ED=95=A0=EC=9D=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/adapter/in/web/MemberController.java | 5 ++--- .../adapter/in/web/PermissionController.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/main/java/flipnote/group/adapter/in/web/PermissionController.java diff --git a/src/main/java/flipnote/group/adapter/in/web/MemberController.java b/src/main/java/flipnote/group/adapter/in/web/MemberController.java index 1e69012..2c0573f 100644 --- a/src/main/java/flipnote/group/adapter/in/web/MemberController.java +++ b/src/main/java/flipnote/group/adapter/in/web/MemberController.java @@ -1,7 +1,9 @@ package flipnote.group.adapter.in.web; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestHeader; @@ -41,7 +43,4 @@ public ResponseEntity findGroupMembers( return ResponseEntity.ok(res); } - //todo 하위 권한 수정 - - //todo 그룹 멤버 추방 } diff --git a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java new file mode 100644 index 0000000..131d695 --- /dev/null +++ b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java @@ -0,0 +1,17 @@ +package flipnote.group.adapter.in.web; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/v1/groups/{groupId}") +public class PermissionController { + //todo 하위 권한 수정 -> 유저 아이디, 하위 그거, 하위 권한 + + //todo 그룹 멤버 추방 + + //todo 특정 그룹의 내 권한 확인 +} From 38a7bb634a78da03cffe26b16e5fb6d53dd52ec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Mon, 23 Feb 2026 00:21:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Feat:=20=ED=8A=B9=EC=A0=95=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=EC=97=90=20=EA=B6=8C=ED=95=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/PermissionController.java | 41 ++++++++++++- .../GroupRoleRepositoryAdapter.java | 40 +++++++++++++ .../dto/request/AddPermissionRequestDto.java | 11 ++++ .../response/AddPermissionResponseDto.java | 15 +++++ .../port/in/AddPermissionUseCase.java | 8 +++ .../port/in/command/AddPermissionCommand.java | 13 ++++ .../port/in/result/AddPermissionResult.java | 10 ++++ .../port/out/GroupRoleRepositoryPort.java | 6 ++ .../service/AddPermissionService.java | 60 +++++++++++++++++++ .../domain/model/member/GroupMemberRole.java | 26 +++++++- .../jpa/GroupRolePermissionRepository.java | 6 ++ 11 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java create mode 100644 src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java create mode 100644 src/main/java/flipnote/group/application/port/in/AddPermissionUseCase.java create mode 100644 src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java create mode 100644 src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java create mode 100644 src/main/java/flipnote/group/application/service/AddPermissionService.java diff --git a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java index 131d695..9bfde65 100644 --- a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java +++ b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java @@ -1,15 +1,54 @@ package flipnote.group.adapter.in.web; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import flipnote.group.api.dto.request.AddPermissionRequestDto; +import flipnote.group.api.dto.response.AddPermissionResponseDto; +import flipnote.group.application.port.in.AddPermissionUseCase; +import flipnote.group.application.port.in.command.AddPermissionCommand; +import flipnote.group.application.port.in.result.AddPermissionResult; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @RestController @RequestMapping("/v1/groups/{groupId}") public class PermissionController { - //todo 하위 권한 수정 -> 유저 아이디, 하위 그거, 하위 권한 + + private final AddPermissionUseCase addPermissionUseCase; + + /** + * 하위 권한 추가 + */ + @PostMapping("/permissions") + public ResponseEntity addDownPermission( + @RequestHeader("X-USER-ID") Long userId, + @PathVariable("groupId") Long groupId, + @Valid @RequestBody AddPermissionRequestDto req) { + + AddPermissionCommand cmd = new AddPermissionCommand(userId, groupId, req.hostRole(), req.changeRole(), req.permission()); + + AddPermissionResult result = addPermissionUseCase.addPermission(cmd); + + AddPermissionResponseDto res = AddPermissionResponseDto.from(result); + + } + + // //todo 하위 권한 삭제 -> 유저 아이디, 하위 그거, 하위 권한 + // @DeleteMapping("/permissions") + // public ResponseEntity changeDownPermission( + // @RequestHeader("X-USER-ID") Long userId, + // @PathVariable("groupId") Long groupId, + // @Valid @RequestBody DeletePermissionRequestDto req) { + // + // } //todo 그룹 멤버 추방 diff --git a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java index d4a127b..e357abc 100644 --- a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java +++ b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java @@ -103,4 +103,44 @@ public boolean checkRole(Long userId, Long groupId, GroupMemberRole groupMemberR public boolean checkPermission(Long userId, Long groupId, GroupPermission permission) { return groupRolePermissionRepository.existsUserInGroupPermission(groupId, userId, permission); } + + /** + * 권한 추가 + * @param groupId + * @param role + * @param permission + */ + @Override + public List addPermission(Long groupId, GroupMemberRole role, GroupPermission permission) { + + RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role); + + PermissionEntity permissionEntity = PermissionEntity.builder() + .groupRoleId(roleEntity.getId()) + .permission(permission) + .build(); + + groupRolePermissionRepository.save(permissionEntity); + + List permissions = groupRolePermissionRepository.findAllByGroupRoleId(roleEntity.getId()); + + return permissions.stream() + .map(PermissionEntity::getPermission) + .toList(); + } + + /** + * 역할에 권한 체크 + * @param role + * @param groupId + * @param permission + * @return + */ + @Override + public boolean existPermission(GroupMemberRole role, Long groupId, GroupPermission permission) { + + RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role); + + return groupRolePermissionRepository.existsByGroupRoleIdAndPermission(roleEntity.getId(), permission); + } } diff --git a/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java b/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java new file mode 100644 index 0000000..477f7d1 --- /dev/null +++ b/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java @@ -0,0 +1,11 @@ +package flipnote.group.api.dto.request; + +import flipnote.group.domain.model.member.GroupMemberRole; +import flipnote.group.domain.model.permission.GroupPermission; + +public record AddPermissionRequestDto( + GroupMemberRole hostRole, + GroupMemberRole changeRole, + GroupPermission permission +) { +} diff --git a/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java b/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java new file mode 100644 index 0000000..eb87e79 --- /dev/null +++ b/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java @@ -0,0 +1,15 @@ +package flipnote.group.api.dto.response; + +import java.util.List; + +import flipnote.group.application.port.in.result.AddPermissionResult; +import flipnote.group.domain.model.permission.GroupPermission; + +public record AddPermissionResponseDto( + List permissions +) { + + public static AddPermissionResponseDto from(AddPermissionResult result) { + return new AddPermissionResponseDto(result.groupPermissions()); + } +} diff --git a/src/main/java/flipnote/group/application/port/in/AddPermissionUseCase.java b/src/main/java/flipnote/group/application/port/in/AddPermissionUseCase.java new file mode 100644 index 0000000..5972e27 --- /dev/null +++ b/src/main/java/flipnote/group/application/port/in/AddPermissionUseCase.java @@ -0,0 +1,8 @@ +package flipnote.group.application.port.in; + +import flipnote.group.application.port.in.command.AddPermissionCommand; +import flipnote.group.application.port.in.result.AddPermissionResult; + +public interface AddPermissionUseCase { + AddPermissionResult addPermission(AddPermissionCommand cmd); +} diff --git a/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java b/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java new file mode 100644 index 0000000..729d473 --- /dev/null +++ b/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java @@ -0,0 +1,13 @@ +package flipnote.group.application.port.in.command; + +import flipnote.group.domain.model.member.GroupMemberRole; +import flipnote.group.domain.model.permission.GroupPermission; + +public record AddPermissionCommand( + Long userId, + Long groupId, + GroupMemberRole hostRole, + GroupMemberRole changeRole, + GroupPermission permission) { + +} diff --git a/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java b/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java new file mode 100644 index 0000000..cd86842 --- /dev/null +++ b/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java @@ -0,0 +1,10 @@ +package flipnote.group.application.port.in.result; + +import java.util.List; + +import flipnote.group.domain.model.permission.GroupPermission; + +public record AddPermissionResult( + List groupPermissions +) { +} diff --git a/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java b/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java index 4647ecc..9db1e4c 100644 --- a/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java +++ b/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java @@ -1,5 +1,7 @@ package flipnote.group.application.port.out; +import java.util.List; + import flipnote.group.adapter.out.entity.RoleEntity; import flipnote.group.domain.model.member.GroupMemberRole; import flipnote.group.domain.model.permission.GroupPermission; @@ -10,4 +12,8 @@ public interface GroupRoleRepositoryPort { boolean checkRole(Long userId, Long groupId, GroupMemberRole groupMemberRole); boolean checkPermission(Long userId, Long groupId, GroupPermission permission); + + List addPermission(Long groupId, GroupMemberRole role, GroupPermission permission); + + boolean existPermission(GroupMemberRole groupMemberRole, Long aLong, GroupPermission permission); } diff --git a/src/main/java/flipnote/group/application/service/AddPermissionService.java b/src/main/java/flipnote/group/application/service/AddPermissionService.java new file mode 100644 index 0000000..ced6a5d --- /dev/null +++ b/src/main/java/flipnote/group/application/service/AddPermissionService.java @@ -0,0 +1,60 @@ +package flipnote.group.application.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import flipnote.group.application.port.in.AddPermissionUseCase; +import flipnote.group.application.port.in.command.AddPermissionCommand; +import flipnote.group.application.port.in.result.AddPermissionResult; +import flipnote.group.application.port.out.GroupRoleRepositoryPort; +import flipnote.group.domain.model.permission.GroupPermission; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class AddPermissionService implements AddPermissionUseCase { + + private final GroupRoleRepositoryPort groupRoleRepository; + + /** + * 권한 추가 + * @param cmd + * @return + */ + @Override + @Transactional + public AddPermissionResult addPermission(AddPermissionCommand cmd) { + + boolean isRole = groupRoleRepository.checkRole(cmd.userId(), cmd.groupId(), cmd.hostRole()); + + //호스트의 역할이 일치 한지 + if(!isRole) { + throw new IllegalArgumentException("not equals role"); + } + + //호스트의 권한이 있는지 + boolean existHostPermission = groupRoleRepository.checkPermission(cmd.userId(), cmd.groupId(), cmd.permission()); + + if(!existHostPermission) { + throw new IllegalArgumentException("host not exist permission"); + } + + boolean existPermission = groupRoleRepository.existPermission(cmd.changeRole(), cmd.groupId(), cmd.permission()); + + if(existPermission) { + throw new IllegalArgumentException("already exist permission"); + } + + //권한이 낮을 경우 + if(!cmd.hostRole().isHigherThan(cmd.changeRole())) { + throw new IllegalArgumentException("host lower than changeRole"); + } + + List groupPermissions = groupRoleRepository.addPermission(cmd.groupId(), cmd.changeRole(), + cmd.permission()); + + return new AddPermissionResult(groupPermissions); + } +} diff --git a/src/main/java/flipnote/group/domain/model/member/GroupMemberRole.java b/src/main/java/flipnote/group/domain/model/member/GroupMemberRole.java index e707111..deae380 100644 --- a/src/main/java/flipnote/group/domain/model/member/GroupMemberRole.java +++ b/src/main/java/flipnote/group/domain/model/member/GroupMemberRole.java @@ -1,5 +1,29 @@ package flipnote.group.domain.model.member; public enum GroupMemberRole { - OWNER, HEAD_MANAGER, MANAGER, MEMBER + + OWNER(4), + HEAD_MANAGER(3), + MANAGER(2), + MEMBER(1); + + private final int priority; + + GroupMemberRole(int priority) { + this.priority = priority; + } + + public int getPriority() { + return priority; + } + + //권한 초과 + public boolean isHigherThan(GroupMemberRole other) { + return this.priority > other.priority; + } + + //권한 이상 + public boolean isAtLeast(GroupMemberRole other) { + return this.priority >= other.priority; + } } diff --git a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRolePermissionRepository.java b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRolePermissionRepository.java index f34e9a3..a0d411f 100644 --- a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRolePermissionRepository.java +++ b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRolePermissionRepository.java @@ -1,10 +1,16 @@ package flipnote.group.infrastructure.persistence.jpa; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import flipnote.group.adapter.out.entity.PermissionEntity; +import flipnote.group.domain.model.permission.GroupPermission; import flipnote.group.infrastructure.persistence.querydsl.GroupRolePermissionCustom; public interface GroupRolePermissionRepository extends JpaRepository, GroupRolePermissionCustom { + boolean existsByGroupRoleIdAndPermission(Long id, GroupPermission permission); + + List findAllByGroupRoleId(Long id); } From 7fff37b2e3af5024e2239244ab3245c4abe9071e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Sun, 1 Mar 2026 17:57:25 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Merge:=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/adapter/in/web/PermissionController.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java index 9bfde65..ff3068b 100644 --- a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java +++ b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java @@ -38,17 +38,10 @@ public ResponseEntity addDownPermission( AddPermissionResult result = addPermissionUseCase.addPermission(cmd); AddPermissionResponseDto res = AddPermissionResponseDto.from(result); - + + return ResponseEntity.ok(res); } - // //todo 하위 권한 삭제 -> 유저 아이디, 하위 그거, 하위 권한 - // @DeleteMapping("/permissions") - // public ResponseEntity changeDownPermission( - // @RequestHeader("X-USER-ID") Long userId, - // @PathVariable("groupId") Long groupId, - // @Valid @RequestBody DeletePermissionRequestDto req) { - // - // } //todo 그룹 멤버 추방 From 84fc87daf1384fd5cb6b9c73fc1cb896f66de713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Sun, 1 Mar 2026 18:22:50 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Fix:=20=EA=B6=8C=ED=95=9C=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=97=90=20=EC=97=AD=ED=95=A0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/PermissionController.java | 2 +- .../GroupRoleRepositoryAdapter.java | 13 +++++++++++- .../dto/request/AddPermissionRequestDto.java | 1 - .../response/AddPermissionResponseDto.java | 4 +++- .../port/in/command/AddPermissionCommand.java | 1 - .../port/in/result/AddPermissionResult.java | 7 ++++++- .../port/out/GroupRoleRepositoryPort.java | 2 ++ .../service/AddPermissionService.java | 20 ++++++++----------- .../jpa/GroupMemberRepository.java | 4 ++-- 9 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java index ff3068b..e10dcde 100644 --- a/src/main/java/flipnote/group/adapter/in/web/PermissionController.java +++ b/src/main/java/flipnote/group/adapter/in/web/PermissionController.java @@ -33,7 +33,7 @@ public ResponseEntity addDownPermission( @PathVariable("groupId") Long groupId, @Valid @RequestBody AddPermissionRequestDto req) { - AddPermissionCommand cmd = new AddPermissionCommand(userId, groupId, req.hostRole(), req.changeRole(), req.permission()); + AddPermissionCommand cmd = new AddPermissionCommand(userId, groupId, req.changeRole(), req.permission()); AddPermissionResult result = addPermissionUseCase.addPermission(cmd); diff --git a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java index 27bffab..add11b2 100644 --- a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java +++ b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java @@ -3,10 +3,12 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import org.springframework.stereotype.Repository; +import flipnote.group.adapter.out.entity.GroupMemberEntity; import flipnote.group.adapter.out.entity.PermissionEntity; import flipnote.group.adapter.out.entity.RoleEntity; import flipnote.group.application.port.out.GroupRoleRepositoryPort; @@ -88,7 +90,6 @@ public RoleEntity create(Long groupId) { @Override public boolean checkRole(Long userId, Long groupId, GroupMemberRole groupMemberRole) { RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, groupMemberRole); - return groupMemberRepository.existsByUserIdAndRole_Id(userId, roleEntity.getId()); } @@ -148,4 +149,14 @@ public boolean existPermission(GroupMemberRole role, Long groupId, GroupPermissi public RoleEntity findByIdAndRole(Long id, GroupMemberRole groupMemberRole) { return groupRoleRepository.findByGroupIdAndRole(id, groupMemberRole); } + + @Override + public GroupMemberRole findRole(Long userId, Long groupId) { + + GroupMemberEntity groupMember = groupMemberRepository.findByGroupIdAndUserId(groupId, userId).orElseThrow( + () -> new IllegalArgumentException("not exists member") + ); + + return groupMember.getRole().getRole(); + } } diff --git a/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java b/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java index 477f7d1..bd4b4af 100644 --- a/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java +++ b/src/main/java/flipnote/group/api/dto/request/AddPermissionRequestDto.java @@ -4,7 +4,6 @@ import flipnote.group.domain.model.permission.GroupPermission; public record AddPermissionRequestDto( - GroupMemberRole hostRole, GroupMemberRole changeRole, GroupPermission permission ) { diff --git a/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java b/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java index eb87e79..843f20b 100644 --- a/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java +++ b/src/main/java/flipnote/group/api/dto/response/AddPermissionResponseDto.java @@ -3,13 +3,15 @@ import java.util.List; import flipnote.group.application.port.in.result.AddPermissionResult; +import flipnote.group.domain.model.member.GroupMemberRole; import flipnote.group.domain.model.permission.GroupPermission; public record AddPermissionResponseDto( + GroupMemberRole role, List permissions ) { public static AddPermissionResponseDto from(AddPermissionResult result) { - return new AddPermissionResponseDto(result.groupPermissions()); + return new AddPermissionResponseDto(result.role(), result.groupPermissions()); } } diff --git a/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java b/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java index 729d473..e1aac53 100644 --- a/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java +++ b/src/main/java/flipnote/group/application/port/in/command/AddPermissionCommand.java @@ -6,7 +6,6 @@ public record AddPermissionCommand( Long userId, Long groupId, - GroupMemberRole hostRole, GroupMemberRole changeRole, GroupPermission permission) { diff --git a/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java b/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java index cd86842..9ede24c 100644 --- a/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java +++ b/src/main/java/flipnote/group/application/port/in/result/AddPermissionResult.java @@ -2,9 +2,14 @@ import java.util.List; +import flipnote.group.domain.model.member.GroupMemberRole; import flipnote.group.domain.model.permission.GroupPermission; public record AddPermissionResult( - List groupPermissions + List groupPermissions, + GroupMemberRole role ) { + public static AddPermissionResult of(List groupPermissions, GroupMemberRole role) { + return new AddPermissionResult(groupPermissions, role); + } } diff --git a/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java b/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java index b7d9263..b58433c 100644 --- a/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java +++ b/src/main/java/flipnote/group/application/port/out/GroupRoleRepositoryPort.java @@ -18,4 +18,6 @@ public interface GroupRoleRepositoryPort { boolean existPermission(GroupMemberRole groupMemberRole, Long aLong, GroupPermission permission); RoleEntity findByIdAndRole(Long id, GroupMemberRole groupMemberRole); + + GroupMemberRole findRole(Long userId, Long groupId); } diff --git a/src/main/java/flipnote/group/application/service/AddPermissionService.java b/src/main/java/flipnote/group/application/service/AddPermissionService.java index ced6a5d..4884ab6 100644 --- a/src/main/java/flipnote/group/application/service/AddPermissionService.java +++ b/src/main/java/flipnote/group/application/service/AddPermissionService.java @@ -9,6 +9,7 @@ import flipnote.group.application.port.in.command.AddPermissionCommand; import flipnote.group.application.port.in.result.AddPermissionResult; import flipnote.group.application.port.out.GroupRoleRepositoryPort; +import flipnote.group.domain.model.member.GroupMemberRole; import flipnote.group.domain.model.permission.GroupPermission; import lombok.RequiredArgsConstructor; @@ -27,12 +28,7 @@ public class AddPermissionService implements AddPermissionUseCase { @Transactional public AddPermissionResult addPermission(AddPermissionCommand cmd) { - boolean isRole = groupRoleRepository.checkRole(cmd.userId(), cmd.groupId(), cmd.hostRole()); - - //호스트의 역할이 일치 한지 - if(!isRole) { - throw new IllegalArgumentException("not equals role"); - } + GroupMemberRole role = groupRoleRepository.findRole(cmd.userId(), cmd.groupId()); //호스트의 권한이 있는지 boolean existHostPermission = groupRoleRepository.checkPermission(cmd.userId(), cmd.groupId(), cmd.permission()); @@ -41,20 +37,20 @@ public AddPermissionResult addPermission(AddPermissionCommand cmd) { throw new IllegalArgumentException("host not exist permission"); } + //권한이 낮을 경우 + if(!role.isHigherThan(cmd.changeRole())) { + throw new IllegalArgumentException("host lower than changeRole"); + } + boolean existPermission = groupRoleRepository.existPermission(cmd.changeRole(), cmd.groupId(), cmd.permission()); if(existPermission) { throw new IllegalArgumentException("already exist permission"); } - //권한이 낮을 경우 - if(!cmd.hostRole().isHigherThan(cmd.changeRole())) { - throw new IllegalArgumentException("host lower than changeRole"); - } - List groupPermissions = groupRoleRepository.addPermission(cmd.groupId(), cmd.changeRole(), cmd.permission()); - return new AddPermissionResult(groupPermissions); + return AddPermissionResult.of(groupPermissions, cmd.changeRole()); } } diff --git a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupMemberRepository.java b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupMemberRepository.java index 8a59ea6..1e7ba7e 100644 --- a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupMemberRepository.java +++ b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupMemberRepository.java @@ -11,8 +11,6 @@ public interface GroupMemberRepository extends JpaRepository { - boolean existsByUserIdAndRole_Id(Long userId, Long roleId); - boolean existsByGroupIdAndUserId(Long groupId, Long userId); @Query(""" @@ -24,4 +22,6 @@ public interface GroupMemberRepository List findAllByGroupId(Long groupId); Optional findByGroupIdAndUserId(Long groupId, Long userId); + + boolean existsByUserIdAndRole_Id(Long userId, Long id); } From b6483bf2712d4f8b6791dcf2925f9431b4501aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=84=9D=EB=B2=94?= Date: Sun, 1 Mar 2026 18:30:46 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Fix:=20=EC=98=B5=EC=85=94=EB=84=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/GroupRoleRepositoryAdapter.java | 17 ++++++++++++----- .../persistence/jpa/GroupRoleRepository.java | 4 +++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java index add11b2..cbb048f 100644 --- a/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java +++ b/src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java @@ -89,7 +89,9 @@ public RoleEntity create(Long groupId) { */ @Override public boolean checkRole(Long userId, Long groupId, GroupMemberRole groupMemberRole) { - RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, groupMemberRole); + RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, groupMemberRole).orElseThrow( + () -> new IllegalArgumentException("not exist role") + ); return groupMemberRepository.existsByUserIdAndRole_Id(userId, roleEntity.getId()); } @@ -114,7 +116,9 @@ public boolean checkPermission(Long userId, Long groupId, GroupPermission permis @Override public List addPermission(Long groupId, GroupMemberRole role, GroupPermission permission) { - RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role); + RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role).orElseThrow( + () -> new IllegalArgumentException("not exist role") + ); PermissionEntity permissionEntity = PermissionEntity.builder() .groupRoleId(roleEntity.getId()) @@ -140,19 +144,22 @@ public List addPermission(Long groupId, GroupMemberRole role, G @Override public boolean existPermission(GroupMemberRole role, Long groupId, GroupPermission permission) { - RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role); + RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, role).orElseThrow( + () -> new IllegalArgumentException("not exist role") + ); return groupRolePermissionRepository.existsByGroupRoleIdAndPermission(roleEntity.getId(), permission); } @Override public RoleEntity findByIdAndRole(Long id, GroupMemberRole groupMemberRole) { - return groupRoleRepository.findByGroupIdAndRole(id, groupMemberRole); + return groupRoleRepository.findByGroupIdAndRole(id, groupMemberRole).orElseThrow( + () -> new IllegalArgumentException("not exist role") + ); } @Override public GroupMemberRole findRole(Long userId, Long groupId) { - GroupMemberEntity groupMember = groupMemberRepository.findByGroupIdAndUserId(groupId, userId).orElseThrow( () -> new IllegalArgumentException("not exists member") ); diff --git a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRoleRepository.java b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRoleRepository.java index 7f774b5..1996b3b 100644 --- a/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRoleRepository.java +++ b/src/main/java/flipnote/group/infrastructure/persistence/jpa/GroupRoleRepository.java @@ -1,11 +1,13 @@ package flipnote.group.infrastructure.persistence.jpa; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import flipnote.group.adapter.out.entity.RoleEntity; import flipnote.group.domain.model.member.GroupMemberRole; public interface GroupRoleRepository extends JpaRepository { - RoleEntity findByGroupIdAndRole(Long groupId, GroupMemberRole groupMemberRole); + Optional findByGroupIdAndRole(Long groupId, GroupMemberRole groupMemberRole); }