diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberController.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberController.java index b5a03287..8588951a 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberController.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberController.java @@ -15,6 +15,9 @@ import org.tuna.zoopzoop.backend.domain.member.dto.res.*; import org.tuna.zoopzoop.backend.domain.member.entity.Member; import org.tuna.zoopzoop.backend.domain.member.service.MemberService; +import org.tuna.zoopzoop.backend.domain.space.membership.service.MembershipService; +import org.tuna.zoopzoop.backend.domain.space.space.entity.Space; +import org.tuna.zoopzoop.backend.domain.space.space.service.SpaceService; import org.tuna.zoopzoop.backend.global.rsData.RsData; import org.tuna.zoopzoop.backend.global.security.jwt.CustomUserDetails; @@ -27,6 +30,8 @@ public class ApiV1MemberController { private final MemberService memberService; private final RefreshTokenService refreshTokenService; + private final MembershipService membershipService; + private final SpaceService spaceService; /// api/v1/member/me : 사용자 정보 조회 (GET) /// api/v1/member/edit : 사용자 닉네임 수정 (PUT) /// api/v1/member : 사용자 탈퇴 (DELETE) @@ -147,6 +152,13 @@ public ResponseEntity> deleteMember( @AuthenticationPrincipal CustomUserDetails userDetails ) { Member member = userDetails.getMember(); + + // 사용자가 유일한 어드민인 모든 스페이스 삭제 + List deletableSpaces = membershipService.findByOnlyAdmin(member); + for (Space space : deletableSpaces) { + spaceService.deleteSpace(space.getId()); + } + refreshTokenService.deleteByMember(member); memberService.hardDeleteMember(member); return ResponseEntity diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/repository/MembershipRepository.java b/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/repository/MembershipRepository.java index b92d8999..26ec89f1 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/repository/MembershipRepository.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/repository/MembershipRepository.java @@ -59,4 +59,5 @@ public interface MembershipRepository extends JpaRepository // 여러 Space에 속한 Member 목록 한번에 조회 (JOIN FETCH로 Member 정보까지) @Query("SELECT m FROM Membership m JOIN FETCH m.member WHERE m.space IN :spaces AND m.authority <> org.tuna.zoopzoop.backend.domain.space.membership.enums.Authority.PENDING") List findAllMembersInSpaces(@Param("spaces") List spaces); + } diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/service/MembershipService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/service/MembershipService.java index 733979ee..51d4366b 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/service/MembershipService.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/service/MembershipService.java @@ -93,6 +93,33 @@ public List findByMember(Member member, String state) { } } + /** + * 멤버가 ADMIN 권한을 가진 스페이스 목록 조회 + * @param member 조회할 멤버 + * @return 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록 + */ + public List findByAdmin(Member member) { + return membershipRepository.findAllByMemberAndAuthorityOrderById(member, Authority.ADMIN) + .stream() + .map(Membership::getSpace) + .collect(Collectors.toList()); + } + + /** + * 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록 조회 + * @param member 조회할 멤버 + * @return 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록 + */ + public List findByOnlyAdmin(Member member) { + // 1. 멤버가 ADMIN 권한을 가진 모든 스페이스 조회 + List adminSpaces = findByAdmin(member); + + // 2. 각 스페이스에서 ADMIN 멤버 수가 1명인 스페이스만 필터링 + return adminSpaces.stream() + .filter(space -> membershipRepository.countBySpaceAndAuthority(space, Authority.ADMIN) == 1) + .collect(Collectors.toList()); + } + /** * 스페이스에 속한 멤버 중 초대 상태(PENDING)인 멤버십 목록 조회 * @param space 조회할 스페이스