From e0650acac5531334462d1486e00e5b128e76cf56 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 17 Nov 2023 15:35:03 +0900 Subject: [PATCH] feat: add addGroupMember, leaveGroup --- .../group/request/GroupLeaderRequestDto.java | 16 -------- ...estDto.java => GroupMemberRequestDto.java} | 2 +- .../uspray/controller/GroupController.java | 29 +++++++++++--- .../java/com/uspray/uspray/domain/Group.java | 4 ++ .../java/com/uspray/uspray/domain/Member.java | 4 ++ .../uspray/uspray/exception/ErrorStatus.java | 2 + .../uspray/exception/SuccessStatus.java | 4 +- .../uspray/uspray/service/GroupService.java | 39 ++++++++++++++++--- 8 files changed, 72 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/com/uspray/uspray/DTO/group/request/GroupLeaderRequestDto.java rename src/main/java/com/uspray/uspray/DTO/group/request/{GroupKickRequestDto.java => GroupMemberRequestDto.java} (88%) diff --git a/src/main/java/com/uspray/uspray/DTO/group/request/GroupLeaderRequestDto.java b/src/main/java/com/uspray/uspray/DTO/group/request/GroupLeaderRequestDto.java deleted file mode 100644 index 28b9881d..00000000 --- a/src/main/java/com/uspray/uspray/DTO/group/request/GroupLeaderRequestDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.uspray.uspray.DTO.group.request; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class GroupLeaderRequestDto { - - @NotNull - private String username; -} diff --git a/src/main/java/com/uspray/uspray/DTO/group/request/GroupKickRequestDto.java b/src/main/java/com/uspray/uspray/DTO/group/request/GroupMemberRequestDto.java similarity index 88% rename from src/main/java/com/uspray/uspray/DTO/group/request/GroupKickRequestDto.java rename to src/main/java/com/uspray/uspray/DTO/group/request/GroupMemberRequestDto.java index 06e9e2a1..bfd22c02 100644 --- a/src/main/java/com/uspray/uspray/DTO/group/request/GroupKickRequestDto.java +++ b/src/main/java/com/uspray/uspray/DTO/group/request/GroupMemberRequestDto.java @@ -9,7 +9,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class GroupKickRequestDto { +public class GroupMemberRequestDto { @NotNull private String username; diff --git a/src/main/java/com/uspray/uspray/controller/GroupController.java b/src/main/java/com/uspray/uspray/controller/GroupController.java index 32ceef47..3d85a8e0 100644 --- a/src/main/java/com/uspray/uspray/controller/GroupController.java +++ b/src/main/java/com/uspray/uspray/controller/GroupController.java @@ -1,8 +1,7 @@ package com.uspray.uspray.controller; import com.uspray.uspray.DTO.ApiResponseDto; -import com.uspray.uspray.DTO.group.request.GroupKickRequestDto; -import com.uspray.uspray.DTO.group.request.GroupLeaderRequestDto; +import com.uspray.uspray.DTO.group.request.GroupMemberRequestDto; import com.uspray.uspray.DTO.group.request.GroupRequestDto; import com.uspray.uspray.DTO.group.response.GroupListResponseDto; import com.uspray.uspray.exception.SuccessStatus; @@ -11,6 +10,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.repository.query.Param; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.annotation.*; @@ -56,7 +56,7 @@ public ApiResponseDto changeGroupName( public ApiResponseDto changeGroupLeader( @Parameter(hidden = true) @AuthenticationPrincipal User user, @PathVariable Long groupId, - @Valid @RequestBody GroupLeaderRequestDto groupLeaderRequestDto) { + @Valid @RequestBody GroupMemberRequestDto groupLeaderRequestDto) { groupService.changeGroupLeader(user.getUsername(), groupId, groupLeaderRequestDto); return ApiResponseDto.success(SuccessStatus.CHANGE_GROUP_LEADER_SUCCESS, SuccessStatus.CHANGE_GROUP_LEADER_SUCCESS.getMessage()); @@ -66,12 +66,31 @@ public ApiResponseDto changeGroupLeader( public ApiResponseDto kickGroupMember( @Parameter(hidden = true) @AuthenticationPrincipal User user, @PathVariable Long groupId, - @Valid @RequestBody GroupKickRequestDto groupKickRequestDto) { - groupService.kickGroupMember(user.getUsername(), groupId, groupKickRequestDto); + @Valid @RequestBody GroupMemberRequestDto groupMemberRequestDto) { + groupService.kickGroupMember(user.getUsername(), groupId, groupMemberRequestDto); return ApiResponseDto.success(SuccessStatus.KICK_GROUP_MEMBER_SUCCESS, SuccessStatus.KICK_GROUP_MEMBER_SUCCESS.getMessage()); } + @PostMapping("/{groupId}/member") + public ApiResponseDto addGroupMember( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @PathVariable Long groupId, + @Valid @RequestBody GroupMemberRequestDto groupMemberRequestDto) { + groupService.addGroupMember(user.getUsername(), groupId, groupMemberRequestDto); + return ApiResponseDto.success(SuccessStatus.ADD_GROUP_MEMBER_SUCCESS, + SuccessStatus.ADD_GROUP_MEMBER_SUCCESS.getMessage()); + } + + @DeleteMapping("/{groupId}/leave") + public ApiResponseDto leaveGroup( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @PathVariable Long groupId) { + groupService.leaveGroup(user.getUsername(), groupId); + return ApiResponseDto.success(SuccessStatus.LEAVE_GROUP_SUCCESS, + SuccessStatus.LEAVE_GROUP_SUCCESS.getMessage()); + } + @DeleteMapping("/{groupId}") public ApiResponseDto deleteGroup( @Parameter(hidden = true) @AuthenticationPrincipal User user, diff --git a/src/main/java/com/uspray/uspray/domain/Group.java b/src/main/java/com/uspray/uspray/domain/Group.java index a1716ab1..8b168f10 100644 --- a/src/main/java/com/uspray/uspray/domain/Group.java +++ b/src/main/java/com/uspray/uspray/domain/Group.java @@ -50,6 +50,10 @@ public void changeLeader(Member leader) { this.leader = leader; } + public void addMember(Member member) { + this.members.add(member); + } + public void kickMember(Member member) { this.members.remove(member); } diff --git a/src/main/java/com/uspray/uspray/domain/Member.java b/src/main/java/com/uspray/uspray/domain/Member.java index 39741154..b8364ac2 100644 --- a/src/main/java/com/uspray/uspray/domain/Member.java +++ b/src/main/java/com/uspray/uspray/domain/Member.java @@ -67,6 +67,10 @@ public void changePw(String pw) { this.password = pw; } + public void joinGroup(Group group) { + this.groups.add(group); + } + public void leaveGroup(Group group) { this.groups.remove(group); } diff --git a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java index 370577e3..08f1db75 100644 --- a/src/main/java/com/uspray/uspray/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/exception/ErrorStatus.java @@ -21,6 +21,8 @@ public enum ErrorStatus { ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘 이미 기도한 기도제목입니다."), CATEGORY_DUPLICATE_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."), ALREADY_EXIST_GROUP_NAME_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 이름입니다."), + ALREADY_EXIST_GROUP_MEMBER_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 회원입니다."), + LEADER_CANNOT_LEAVE_GROUP_EXCEPTION(HttpStatus.BAD_REQUEST, "모임장은 모임을 떠날 수 없습니다."), /* * 401 UNAUTHORIZED diff --git a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java index c51fc5e9..41db1657 100644 --- a/src/main/java/com/uspray/uspray/exception/SuccessStatus.java +++ b/src/main/java/com/uspray/uspray/exception/SuccessStatus.java @@ -38,6 +38,7 @@ public enum SuccessStatus { CHANGE_GROUP_NAME_SUCCESS(HttpStatus.OK, "모임 이름 변경에 성공했습니다."), CHANGE_GROUP_LEADER_SUCCESS(HttpStatus.OK, "모임 리더 위임에 성공했습니다."), KICK_GROUP_MEMBER_SUCCESS(HttpStatus.OK, "모임 멤버 내보내기에 성공했습니다."), + ADD_GROUP_MEMBER_SUCCESS(HttpStatus.OK, "모임 멤버 추가하기에 성공했습니다."), /* * 201 created @@ -57,7 +58,8 @@ public enum SuccessStatus { DELETE_GROUP_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "모임 기도제목 삭제에 성공했습니다."), WITHDRAWAL_SUCCESS(HttpStatus.NO_CONTENT, "회원 탈퇴에 성공했습니다."), DELETE_CATEGORY_SUCCESS(HttpStatus.NO_CONTENT, "카테고리 삭제에 성공했습니다."), - DELETE_GROUP_SUCCESS(HttpStatus.NO_CONTENT, "모임 삭제에 성공했습니다."); + DELETE_GROUP_SUCCESS(HttpStatus.NO_CONTENT, "모임 삭제에 성공했습니다."), + LEAVE_GROUP_SUCCESS(HttpStatus.NO_CONTENT, "모임 탈퇴에 성공했습니다."); private final HttpStatus httpStatus; diff --git a/src/main/java/com/uspray/uspray/service/GroupService.java b/src/main/java/com/uspray/uspray/service/GroupService.java index 91b3d5c6..a5343dc3 100644 --- a/src/main/java/com/uspray/uspray/service/GroupService.java +++ b/src/main/java/com/uspray/uspray/service/GroupService.java @@ -1,7 +1,6 @@ package com.uspray.uspray.service; -import com.uspray.uspray.DTO.group.request.GroupKickRequestDto; -import com.uspray.uspray.DTO.group.request.GroupLeaderRequestDto; +import com.uspray.uspray.DTO.group.request.GroupMemberRequestDto; import com.uspray.uspray.DTO.group.request.GroupRequestDto; import com.uspray.uspray.DTO.group.response.GroupListResponseDto; import com.uspray.uspray.DTO.group.response.GroupResponseDto; @@ -61,7 +60,7 @@ public void changeGroupName(String username, Long groupId, GroupRequestDto group } @Transactional - public void changeGroupLeader(String username, Long groupId, GroupLeaderRequestDto groupLeaderRequestDto) { + public void changeGroupLeader(String username, Long groupId, GroupMemberRequestDto groupLeaderRequestDto) { Member member = memberRepository.getMemberByUserId(username); Group group = groupRepository.getGroupById(groupId); @@ -75,7 +74,7 @@ public void changeGroupLeader(String username, Long groupId, GroupLeaderRequestD } @Transactional - public void kickGroupMember(String username, Long groupId, GroupKickRequestDto groupKickRequestDto) { + public void kickGroupMember(String username, Long groupId, GroupMemberRequestDto groupKickRequestDto) { Member leader = memberRepository.getMemberByUserId(username); Group group = groupRepository.getGroupById(groupId); Member kickedMember = memberRepository.getMemberByUserId(groupKickRequestDto.getUsername()); @@ -86,8 +85,38 @@ public void kickGroupMember(String username, Long groupId, GroupKickRequestDto g if (!group.getMembers().contains(kickedMember)) { throw new NotFoundException(ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION, ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION.getMessage()); } - group.kickMember(memberRepository.getMemberByUserId(groupKickRequestDto.getUsername())); kickedMember.leaveGroup(group); + group.kickMember(kickedMember); + } + + // 일단은 관리자만 회원을 추가할 수 있게끔 설정해두었습니다 + // 추후 수정될 수 있음 -> 초대 링크 생성하고 링크 방문시 수락으로 변경 예정 + @Transactional + public void addGroupMember(String username, Long groupId, GroupMemberRequestDto groupAddRequestDto) { + Member member = memberRepository.getMemberByUserId(username); + Group group = groupRepository.getGroupById(groupId); + Member addedMember = memberRepository.getMemberByUserId(groupAddRequestDto.getUsername()); + + if (!group.getMembers().contains(member)) { + throw new CustomException(ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION, ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION.getMessage()); + } + if (group.getMembers().contains(addedMember)) { + throw new CustomException(ErrorStatus.ALREADY_EXIST_GROUP_MEMBER_EXCEPTION, ErrorStatus.ALREADY_EXIST_GROUP_MEMBER_EXCEPTION.getMessage()); + } + addedMember.joinGroup(group); + group.addMember(addedMember); + } + + @Transactional + public void leaveGroup(String username, Long groupId) { + Member member = memberRepository.getMemberByUserId(username); + Group group = groupRepository.getGroupById(groupId); + + if (group.getLeader().equals(member)) { + throw new CustomException(ErrorStatus.LEADER_CANNOT_LEAVE_GROUP_EXCEPTION, ErrorStatus.LEADER_CANNOT_LEAVE_GROUP_EXCEPTION.getMessage()); + } + member.leaveGroup(group); + group.kickMember(member); } @Transactional