From c97619f2c76cc92de432a2dfbff8d0f00f295c2a Mon Sep 17 00:00:00 2001 From: Shoon Date: Wed, 27 Mar 2024 00:07:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=ED=83=88=ED=87=B4?= =?UTF-8?q?=20(DB=20=EC=A0=84=EB=B6=80=20=EC=82=AD=EC=A0=9C)=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/DeleteMemberController.java | 35 ++++++++++ .../out/persistence/MemberDeleteAdapter.java | 68 +++++++++++++++++++ .../port/in/usecase/DeleteMemberUseCase.java | 7 ++ .../port/out/DeleteMemberPort.java | 7 ++ .../application/service/MemberService.java | 17 +++-- .../repository/BookmarkRepository.java | 6 ++ 6 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/dnd/bbok/member/adapter/in/web/DeleteMemberController.java create mode 100644 src/main/java/com/dnd/bbok/member/adapter/out/persistence/MemberDeleteAdapter.java create mode 100644 src/main/java/com/dnd/bbok/member/application/port/in/usecase/DeleteMemberUseCase.java create mode 100644 src/main/java/com/dnd/bbok/member/application/port/out/DeleteMemberPort.java diff --git a/src/main/java/com/dnd/bbok/member/adapter/in/web/DeleteMemberController.java b/src/main/java/com/dnd/bbok/member/adapter/in/web/DeleteMemberController.java new file mode 100644 index 0000000..1e267d7 --- /dev/null +++ b/src/main/java/com/dnd/bbok/member/adapter/in/web/DeleteMemberController.java @@ -0,0 +1,35 @@ +package com.dnd.bbok.member.adapter.in.web; + +import com.dnd.bbok.global.response.MessageResponse; +import com.dnd.bbok.member.application.port.in.response.SessionUser; +import com.dnd.bbok.member.application.port.in.usecase.DeleteMemberUseCase; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequestMapping("/api/v1") +@Api(tags = "멤버 관련 컨트롤러") +@RequiredArgsConstructor +public class DeleteMemberController { + private final DeleteMemberUseCase deleteMemberUseCase; + + @ApiOperation(value = "회원 탈퇴") + @DeleteMapping("/member") + @PreAuthorize("isAuthenticated()") + public ResponseEntity getChecklist( + @AuthenticationPrincipal SessionUser sessionUser + ) { + log.info(String.valueOf(sessionUser.getUuid())); + String result = deleteMemberUseCase.deleteMember(sessionUser.getUuid()); + return new ResponseEntity<>( + MessageResponse.of(HttpStatus.CREATED, result), HttpStatus.CREATED); + } +} diff --git a/src/main/java/com/dnd/bbok/member/adapter/out/persistence/MemberDeleteAdapter.java b/src/main/java/com/dnd/bbok/member/adapter/out/persistence/MemberDeleteAdapter.java new file mode 100644 index 0000000..79709aa --- /dev/null +++ b/src/main/java/com/dnd/bbok/member/adapter/out/persistence/MemberDeleteAdapter.java @@ -0,0 +1,68 @@ +package com.dnd.bbok.member.adapter.out.persistence; + +import com.dnd.bbok.diary.adapter.out.persistence.entity.DiaryChecklistEntity; +import com.dnd.bbok.diary.adapter.out.persistence.entity.DiaryEntity; +import com.dnd.bbok.diary.adapter.out.persistence.entity.DiaryTagEntity; +import com.dnd.bbok.diary.adapter.out.persistence.repository.DiaryChecklistRepository; +import com.dnd.bbok.diary.adapter.out.persistence.repository.DiaryRepository; +import com.dnd.bbok.diary.adapter.out.persistence.repository.DiaryTagRepository; +import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendEntity; +import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendTagEntity; +import com.dnd.bbok.friend.adapter.out.persistence.repository.FriendRepository; +import com.dnd.bbok.friend.adapter.out.persistence.repository.FriendTagRepository; +import com.dnd.bbok.member.adapter.out.persistence.entity.MemberChecklistEntity; +import com.dnd.bbok.member.adapter.out.persistence.repository.MemberChecklistRepository; +import com.dnd.bbok.member.adapter.out.persistence.repository.MemberRepository; +import com.dnd.bbok.member.application.port.out.DeleteMemberPort; +import com.dnd.bbok.saying.adapter.out.persistence.repository.BookmarkRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Repository +@RequiredArgsConstructor +public class MemberDeleteAdapter implements DeleteMemberPort { + + private final MemberRepository memberRepository; + private final MemberChecklistRepository memberChecklistRepository; + private final FriendTagRepository friendTagRepository; + private final FriendRepository friendRepository; + private final DiaryRepository diaryRepository; + private final DiaryTagRepository diaryTagRepository; + private final DiaryChecklistRepository diaryChecklistRepository; + private final BookmarkRepository bookmarkRepository; + + @Override + public void deleteMember(UUID memberId) { + // 지워야 할 거 + // 1. bookmark + // 2. diary_tag + // 3. diary_checklist + // 4. diary + // 5. friend_tag + // 6. friend + // 7. member_checklist + // 8. member + bookmarkRepository.deleteByMemberId(memberId); + + List friends = friendRepository.findAllFriends(memberId); + for (FriendEntity friend : friends) { + List friendTags = friendTagRepository.findAllByFriendId(friend.getId()); + List diaries = diaryRepository.findAllByFriendId(friend.getId()); + List diaryTags = diaryTagRepository.findByDiaryIds(diaries.stream().map(DiaryEntity::getId).collect(Collectors.toList())); + List diaryChecklist = diaryChecklistRepository.getDiaryChecklistByDiaryIds(diaries.stream().map(DiaryEntity::getId).collect(Collectors.toList())); + diaryTagRepository.deleteAll(diaryTags); + diaryChecklistRepository.deleteAll(diaryChecklist); + diaryRepository.deleteAll(diaries); + friendTagRepository.deleteAll(friendTags); + } + friendRepository.deleteAll(friends); + List memberChecklist = memberChecklistRepository.findByMemberId(memberId); + memberChecklistRepository.deleteAll(memberChecklist); + + memberRepository.deleteById(memberId); + } +} diff --git a/src/main/java/com/dnd/bbok/member/application/port/in/usecase/DeleteMemberUseCase.java b/src/main/java/com/dnd/bbok/member/application/port/in/usecase/DeleteMemberUseCase.java new file mode 100644 index 0000000..c85cef4 --- /dev/null +++ b/src/main/java/com/dnd/bbok/member/application/port/in/usecase/DeleteMemberUseCase.java @@ -0,0 +1,7 @@ +package com.dnd.bbok.member.application.port.in.usecase; + +import java.util.UUID; + +public interface DeleteMemberUseCase { + String deleteMember(UUID string); +} diff --git a/src/main/java/com/dnd/bbok/member/application/port/out/DeleteMemberPort.java b/src/main/java/com/dnd/bbok/member/application/port/out/DeleteMemberPort.java new file mode 100644 index 0000000..9c15106 --- /dev/null +++ b/src/main/java/com/dnd/bbok/member/application/port/out/DeleteMemberPort.java @@ -0,0 +1,7 @@ +package com.dnd.bbok.member.application.port.out; + +import java.util.UUID; + +public interface DeleteMemberPort { + void deleteMember(UUID string); +} diff --git a/src/main/java/com/dnd/bbok/member/application/service/MemberService.java b/src/main/java/com/dnd/bbok/member/application/service/MemberService.java index 34c045a..103d7fc 100644 --- a/src/main/java/com/dnd/bbok/member/application/service/MemberService.java +++ b/src/main/java/com/dnd/bbok/member/application/service/MemberService.java @@ -7,11 +7,9 @@ import com.dnd.bbok.member.application.port.in.response.GetMemberChecklistResponse; import com.dnd.bbok.member.application.port.in.response.GetMemberInfoResponse; -import com.dnd.bbok.member.application.port.in.usecase.CreateMemberChecklistUseCase; -import com.dnd.bbok.member.application.port.in.usecase.EditMemberChecklistUseCase; -import com.dnd.bbok.member.application.port.in.usecase.GetMemberChecklistQuery; -import com.dnd.bbok.member.application.port.in.usecase.GetMemberQuery; +import com.dnd.bbok.member.application.port.in.usecase.*; +import com.dnd.bbok.member.application.port.out.DeleteMemberPort; import com.dnd.bbok.member.application.port.out.LoadMemberChecklistPort; import com.dnd.bbok.member.application.port.out.LoadMemberPort; import com.dnd.bbok.member.application.port.out.SaveMemberChecklistPort; @@ -37,11 +35,12 @@ @Slf4j public class MemberService implements GetMemberQuery, CreateMemberChecklistUseCase, GetMemberChecklistQuery, - EditMemberChecklistUseCase { + EditMemberChecklistUseCase, DeleteMemberUseCase { private final LoadMemberPort loadMemberPort; private final LoadMemberChecklistPort loadMemberChecklistPort; private final SaveMemberChecklistPort saveMemberChecklistPort; + private final DeleteMemberPort deleteMemberPort; @Override public GetMemberInfoResponse getMember(UUID memberId) { @@ -124,4 +123,12 @@ public void edit(UUID memberId, EditMemberChecklistRequest memberChecklistReques saveMemberChecklistPort.saveMemberChecklistWithCond(memberId, updateChecklist); } + + + @Override + public String deleteMember(UUID memberId) { + // TODO Transaction + deleteMemberPort.deleteMember(memberId); + return "success"; + } } diff --git a/src/main/java/com/dnd/bbok/saying/adapter/out/persistence/repository/BookmarkRepository.java b/src/main/java/com/dnd/bbok/saying/adapter/out/persistence/repository/BookmarkRepository.java index 6a67ffc..b8e865b 100644 --- a/src/main/java/com/dnd/bbok/saying/adapter/out/persistence/repository/BookmarkRepository.java +++ b/src/main/java/com/dnd/bbok/saying/adapter/out/persistence/repository/BookmarkRepository.java @@ -6,6 +6,8 @@ import java.util.Optional; import java.util.UUID; + +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -17,4 +19,8 @@ Optional findBookmark( @Query("select b from BookmarkEntity b where b.member.id = :memberId") List findMemberBookmark(@Param("memberId") UUID memberId); + + @Modifying + @Query("delete from BookmarkEntity b where b.member.id = :memberId") + void deleteByMemberId(@Param("memberId") UUID memberId); }