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("참고사항 수정은 그룹장만 할 수 있습니다.");