Skip to content

Commit 2e6dffc

Browse files
EpicFnEpicFn
andauthored
fix : 멤버 삭제 시 유령 스페이스 삭제 로직 구현 (#172)
Co-authored-by: EpicFn <[email protected]>
1 parent cdece57 commit 2e6dffc

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

src/main/java/org/tuna/zoopzoop/backend/domain/member/controller/ApiV1MemberController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import org.tuna.zoopzoop.backend.domain.member.dto.res.*;
1616
import org.tuna.zoopzoop.backend.domain.member.entity.Member;
1717
import org.tuna.zoopzoop.backend.domain.member.service.MemberService;
18+
import org.tuna.zoopzoop.backend.domain.space.membership.service.MembershipService;
19+
import org.tuna.zoopzoop.backend.domain.space.space.entity.Space;
20+
import org.tuna.zoopzoop.backend.domain.space.space.service.SpaceService;
1821
import org.tuna.zoopzoop.backend.global.rsData.RsData;
1922
import org.tuna.zoopzoop.backend.global.security.jwt.CustomUserDetails;
2023

@@ -27,6 +30,8 @@
2730
public class ApiV1MemberController {
2831
private final MemberService memberService;
2932
private final RefreshTokenService refreshTokenService;
33+
private final MembershipService membershipService;
34+
private final SpaceService spaceService;
3035
/// api/v1/member/me : 사용자 정보 조회 (GET)
3136
/// api/v1/member/edit : 사용자 닉네임 수정 (PUT)
3237
/// api/v1/member : 사용자 탈퇴 (DELETE)
@@ -147,6 +152,13 @@ public ResponseEntity<RsData<Void>> deleteMember(
147152
@AuthenticationPrincipal CustomUserDetails userDetails
148153
) {
149154
Member member = userDetails.getMember();
155+
156+
// 사용자가 유일한 어드민인 모든 스페이스 삭제
157+
List<Space> deletableSpaces = membershipService.findByOnlyAdmin(member);
158+
for (Space space : deletableSpaces) {
159+
spaceService.deleteSpace(space.getId());
160+
}
161+
150162
refreshTokenService.deleteByMember(member);
151163
memberService.hardDeleteMember(member);
152164
return ResponseEntity

src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/repository/MembershipRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,5 @@ public interface MembershipRepository extends JpaRepository<Membership, Integer>
5959
// 여러 Space에 속한 Member 목록 한번에 조회 (JOIN FETCH로 Member 정보까지)
6060
@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")
6161
List<Membership> findAllMembersInSpaces(@Param("spaces") List<Space> spaces);
62+
6263
}

src/main/java/org/tuna/zoopzoop/backend/domain/space/membership/service/MembershipService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,33 @@ public List<Membership> findByMember(Member member, String state) {
9393
}
9494
}
9595

96+
/**
97+
* 멤버가 ADMIN 권한을 가진 스페이스 목록 조회
98+
* @param member 조회할 멤버
99+
* @return 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록
100+
*/
101+
public List<Space> findByAdmin(Member member) {
102+
return membershipRepository.findAllByMemberAndAuthorityOrderById(member, Authority.ADMIN)
103+
.stream()
104+
.map(Membership::getSpace)
105+
.collect(Collectors.toList());
106+
}
107+
108+
/**
109+
* 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록 조회
110+
* @param member 조회할 멤버
111+
* @return 멤버가 유일한 ADMIN 권한을 가진 스페이스 목록
112+
*/
113+
public List<Space> findByOnlyAdmin(Member member) {
114+
// 1. 멤버가 ADMIN 권한을 가진 모든 스페이스 조회
115+
List<Space> adminSpaces = findByAdmin(member);
116+
117+
// 2. 각 스페이스에서 ADMIN 멤버 수가 1명인 스페이스만 필터링
118+
return adminSpaces.stream()
119+
.filter(space -> membershipRepository.countBySpaceAndAuthority(space, Authority.ADMIN) == 1)
120+
.collect(Collectors.toList());
121+
}
122+
96123
/**
97124
* 스페이스에 속한 멤버 중 초대 상태(PENDING)인 멤버십 목록 조회
98125
* @param space 조회할 스페이스

0 commit comments

Comments
 (0)