From 9ee911aaf78914a206804191e5b410494669c467 Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Sat, 29 Nov 2025 18:47:52 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B7=B8=EB=A3=B9=20=ED=83=88=ED=87=B4?= =?UTF-8?q?=20=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20=ED=9A=8C=EC=9B=90=EC=9D=B4?= =?UTF-8?q?=20=EA=B7=B8=EB=A3=B9=EC=9E=A5=EC=9D=B4=EB=9D=BC=EB=A9=B4=20?= =?UTF-8?q?=EC=83=88=EB=A1=9C=EC=9A=B4=20=EA=B7=B8=EB=A3=B9=EC=9E=A5?= =?UTF-8?q?=EC=9D=84=20=EB=BD=91=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=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 --- .../petgroup/entity/PetGroupMember.java | 4 ++ .../repository/PetGroupMemberRepository.java | 2 + .../petgroup/service/PetGroupService.java | 45 +++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/petlog/petgroup/entity/PetGroupMember.java b/src/main/java/com/petlog/petgroup/entity/PetGroupMember.java index 9facb3e..a748c10 100644 --- a/src/main/java/com/petlog/petgroup/entity/PetGroupMember.java +++ b/src/main/java/com/petlog/petgroup/entity/PetGroupMember.java @@ -45,4 +45,8 @@ public PetGroupMember( this.petGroup = petGroup; this.isGroupOwner = isGroupOwner; } + + public void updateIsGroupOwner(final boolean isGroupOwner) { + this.isGroupOwner = isGroupOwner; + } } diff --git a/src/main/java/com/petlog/petgroup/repository/PetGroupMemberRepository.java b/src/main/java/com/petlog/petgroup/repository/PetGroupMemberRepository.java index efaa19f..e76e001 100644 --- a/src/main/java/com/petlog/petgroup/repository/PetGroupMemberRepository.java +++ b/src/main/java/com/petlog/petgroup/repository/PetGroupMemberRepository.java @@ -30,4 +30,6 @@ public interface PetGroupMemberRepository extends JpaRepository findByMemberAndPetGroup(final Member member, final PetGroup group); + + Optional> findAllByPetGroup(final PetGroup group); } diff --git a/src/main/java/com/petlog/petgroup/service/PetGroupService.java b/src/main/java/com/petlog/petgroup/service/PetGroupService.java index 572fc02..aa351e8 100644 --- a/src/main/java/com/petlog/petgroup/service/PetGroupService.java +++ b/src/main/java/com/petlog/petgroup/service/PetGroupService.java @@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; @RequiredArgsConstructor @Service @@ -114,7 +115,11 @@ public GetMyPetGroupDto getMyPetGroups(final Long memberId) { public void leavePetGroup(final Long memberId, final Long groupId) { final Member member = getMember(memberId); final PetGroup petGroup = getPetGroup(groupId); - validateMemberInPetGroup(member, petGroup); + final PetGroupMember petGroupMember = getPetGroupMember(member, petGroup); + + if(petGroupMember.isGroupOwner()) { + updatePetGroupOwner(petGroupMember, petGroup); + } petGroupMemberRepository.deleteByMemberIdAndGroupId(memberId, groupId); } @@ -124,10 +129,31 @@ private PetGroup getPetGroup(final Long petGroupId) { .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 그룹입니다.")); } - private void validateMemberInPetGroup(final Member member, final PetGroup petGroup) { - if(!petGroupMemberRepository.existsByMemberAndPetGroup(member, petGroup)) { - throw new IllegalArgumentException("그룹에 존재하지 않는 회원입니다."); + private PetGroupMember getPetGroupMember(final Member member, final PetGroup petGroup) { + return petGroupMemberRepository.findByMemberAndPetGroup(member, petGroup) + .orElseThrow(() -> new IllegalArgumentException("그룹에 존재하지 않는 회원입니다.")); + } + + private void updatePetGroupOwner(final PetGroupMember currentOwner, final PetGroup petGroup) { + List petGroupMembers = getPetGroupMembers(petGroup); + + final List candidates = petGroupMembers.stream() + .filter(member -> !member.equals(currentOwner)) + .toList(); + + if (candidates.isEmpty()) { + return; } + + final int index = ThreadLocalRandom.current().nextInt(candidates.size()); + final PetGroupMember newOwner = candidates.get(index); + + newOwner.updateIsGroupOwner(true); + } + + private List getPetGroupMembers(final PetGroup petGroup) { + return petGroupMemberRepository.findAllByPetGroup(petGroup) + .orElseThrow(() -> new IllegalArgumentException("해당 그룹에는 회원이 존재하지 않습니다.")); } @Transactional(readOnly = true) @@ -139,6 +165,12 @@ public GetJoinCodeDto getJoinCode(final Long memberId, final Long groupId) { return new GetJoinCodeDto(petGroup.getJoinCode()); } + private void validateMemberInPetGroup(final Member member, final PetGroup petGroup) { + if(!petGroupMemberRepository.existsByMemberAndPetGroup(member, petGroup)) { + throw new IllegalArgumentException("그룹에 존재하지 않는 회원입니다."); + } + } + @Transactional(readOnly = true) public GetNoteDto getNote(final Long memberId, final Long groupId) { final Member member = getMember(memberId); @@ -159,11 +191,6 @@ public void updateNote(final Long memberId, final Long groupId, final String not petGroup.updateNote(note); } - private PetGroupMember getPetGroupMember(final Member member, final PetGroup petGroup) { - return petGroupMemberRepository.findByMemberAndPetGroup(member, petGroup) - .orElseThrow(() -> new IllegalArgumentException("그룹에 존재하지 않는 회원입니다.")); - } - private void validateMemberIsGroupOwner(final PetGroupMember petGroupMember) { if(!petGroupMember.isGroupOwner()) { throw new IllegalArgumentException("참고사항 수정은 그룹장만 할 수 있습니다.");