diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java new file mode 100644 index 00000000..91f89b1f --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java @@ -0,0 +1,26 @@ +package clap.server.adapter.inbound.web.admin; + +import clap.server.application.port.inbound.admin.DeleteMemberUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.annotation.Secured; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Tag(name = "05. Admin") +@WebAdapter +@RequiredArgsConstructor +@RequestMapping("/api/managements") +public class DeleteMemberController { + private final DeleteMemberUsecase deleteMemberUsecase; + + @Operation(summary = "회원 삭제 API") + @Secured("ROLE_ADMIN") + @PatchMapping("/members/{memberId}") + public void deleteMember(@PathVariable Long memberId) { + deleteMemberUsecase.deleteMember(memberId); + } +} diff --git a/src/main/java/clap/server/application/port/inbound/admin/DeleteMemberUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/DeleteMemberUsecase.java new file mode 100644 index 00000000..b28091da --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/DeleteMemberUsecase.java @@ -0,0 +1,5 @@ +package clap.server.application.port.inbound.admin; + +public interface DeleteMemberUsecase { + void deleteMember(Long memberId); +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index ac2fb651..7a6684c9 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -1,5 +1,6 @@ package clap.server.application.port.inbound.domain; +import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.domain.model.member.Member; import clap.server.exception.ApplicationException; @@ -13,6 +14,8 @@ @RequiredArgsConstructor public class MemberService { private final LoadMemberPort loadMemberPort; + private final CommandMemberPort commandMemberPort; + public Member findById(Long memberId) { return loadMemberPort.findById(memberId).orElseThrow( @@ -27,4 +30,5 @@ public Member findActiveMember(Long memberId) { public List findReviewers() { return loadMemberPort.findReviewers(); } + } diff --git a/src/main/java/clap/server/application/service/admin/DeleteMemberService.java b/src/main/java/clap/server/application/service/admin/DeleteMemberService.java new file mode 100644 index 00000000..8a08105a --- /dev/null +++ b/src/main/java/clap/server/application/service/admin/DeleteMemberService.java @@ -0,0 +1,28 @@ +package clap.server.application.service.admin; + +import clap.server.application.port.inbound.admin.DeleteMemberUsecase; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.outbound.member.CommandMemberPort; +import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.domain.model.member.Member; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.MemberErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DeleteMemberService implements DeleteMemberUsecase { + private final LoadMemberPort loadMemberPort; // 조회 작업용 Port + private final CommandMemberPort commandMemberPort; // 데이터 변경 작업용 Port + + @Override + public void deleteMember(Long memberId) { + Member member = loadMemberPort.findById(memberId) + .orElseThrow(() -> new ApplicationException(MemberErrorCode.MEMBER_NOT_FOUND)); + + member.setStatusDeleted(); + + commandMemberPort.save(member); + } +} diff --git a/src/main/java/clap/server/domain/model/member/Member.java b/src/main/java/clap/server/domain/model/member/Member.java index f55b3fcc..62cd56b9 100644 --- a/src/main/java/clap/server/domain/model/member/Member.java +++ b/src/main/java/clap/server/domain/model/member/Member.java @@ -57,4 +57,8 @@ public String getNickname() { public boolean isReviewer() { return this.memberInfo != null && this.memberInfo.isReviewer(); } + + public void setStatusDeleted() { + this.status = MemberStatus.DELETED; + } }