Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/petlog/petgroup/entity/PetGroupMember.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ public PetGroupMember(
this.petGroup = petGroup;
this.isGroupOwner = isGroupOwner;
}

public void updateIsGroupOwner(final boolean isGroupOwner) {
this.isGroupOwner = isGroupOwner;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,6 @@ public interface PetGroupMemberRepository extends JpaRepository<PetGroupMember,
boolean existsByMemberAndPetGroup(final Member member, final PetGroup group);

Optional<PetGroupMember> findByMemberAndPetGroup(final Member member, final PetGroup group);

Optional<List<PetGroupMember>> findAllByPetGroup(final PetGroup group);
}
45 changes: 36 additions & 9 deletions src/main/java/com/petlog/petgroup/service/PetGroupService.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

@RequiredArgsConstructor
@Service
Expand Down Expand Up @@ -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);
}
Expand All @@ -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<PetGroupMember> petGroupMembers = getPetGroupMembers(petGroup);

final List<PetGroupMember> 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<PetGroupMember> getPetGroupMembers(final PetGroup petGroup) {
return petGroupMemberRepository.findAllByPetGroup(petGroup)
.orElseThrow(() -> new IllegalArgumentException("해당 그룹에는 회원이 존재하지 않습니다."));
}

@Transactional(readOnly = true)
Expand All @@ -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);
Expand All @@ -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("참고사항 수정은 그룹장만 할 수 있습니다.");
Expand Down
Loading