From ca9f1d6e519cbec996589ce42e190267a2586529 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 10:06:22 +0900 Subject: [PATCH 1/8] =?UTF-8?q?CLAP-255=20refactor:Pathvariable->RequestBo?= =?UTF-8?q?dy,=20dto=20validation=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin/DeleteMemberController.java | 10 +-- .../admin/request/DeleteMemberRequest.java | 11 ++++ .../service/admin/DeleteMemberService.java | 5 +- .../admin/DeleteMemberControllerTest.java | 62 +++++++++++++++++++ 4 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/admin/request/DeleteMemberRequest.java create mode 100644 src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java 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 index 91f89b1f..4186f72f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteMemberController.java @@ -1,13 +1,15 @@ package clap.server.adapter.inbound.web.admin; +import clap.server.adapter.inbound.web.dto.admin.request.DeleteMemberRequest; 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 jakarta.validation.Valid; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @Tag(name = "05. Admin") @@ -19,8 +21,8 @@ public class DeleteMemberController { @Operation(summary = "회원 삭제 API") @Secured("ROLE_ADMIN") - @PatchMapping("/members/{memberId}") - public void deleteMember(@PathVariable Long memberId) { - deleteMemberUsecase.deleteMember(memberId); + @PatchMapping("/members/delete") + public void deleteMember(@RequestBody @Valid DeleteMemberRequest deleteMemberRequest) { + deleteMemberUsecase.deleteMember(deleteMemberRequest.memberId()); } } diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/DeleteMemberRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/DeleteMemberRequest.java new file mode 100644 index 00000000..51c90eef --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/DeleteMemberRequest.java @@ -0,0 +1,11 @@ +package clap.server.adapter.inbound.web.dto.admin.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record DeleteMemberRequest( + @NotNull(message = "회원 ID는 필수 값입니다.") + @Schema(description = "삭제할 회원 ID", example = "1", required = true) + Long memberId +) { +} diff --git a/src/main/java/clap/server/application/service/admin/DeleteMemberService.java b/src/main/java/clap/server/application/service/admin/DeleteMemberService.java index 8a08105a..3117d3e3 100644 --- a/src/main/java/clap/server/application/service/admin/DeleteMemberService.java +++ b/src/main/java/clap/server/application/service/admin/DeleteMemberService.java @@ -1,7 +1,6 @@ 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; @@ -13,8 +12,8 @@ @Service @RequiredArgsConstructor public class DeleteMemberService implements DeleteMemberUsecase { - private final LoadMemberPort loadMemberPort; // 조회 작업용 Port - private final CommandMemberPort commandMemberPort; // 데이터 변경 작업용 Port + private final LoadMemberPort loadMemberPort; + private final CommandMemberPort commandMemberPort; @Override public void deleteMember(Long memberId) { diff --git a/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java b/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java new file mode 100644 index 00000000..6bfd0504 --- /dev/null +++ b/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java @@ -0,0 +1,62 @@ +package clap.server.application.service.admin; + +import clap.server.adapter.inbound.web.admin.DeleteMemberController; +import clap.server.adapter.inbound.web.dto.admin.request.DeleteMemberRequest; +import clap.server.application.port.inbound.admin.DeleteMemberUsecase; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(DeleteMemberController.class) +class DeleteMemberControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private DeleteMemberUsecase deleteMemberUsecase; + + @Test + void deleteMember_ShouldReturn200_WhenRequestIsValid() throws Exception { + // Given: 유효한 DeleteMemberRequest + DeleteMemberRequest request = new DeleteMemberRequest(1L); + + // When: Mock된 DeleteMemberUsecase의 호출 설정 + Mockito.doNothing().when(deleteMemberUsecase).deleteMember(1L); + + // Then: API 호출 및 결과 검증 + mockMvc.perform(patch("/api/managements/members/delete") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isOk()); + + // Verify: deleteMemberUsecase의 호출 확인 + Mockito.verify(deleteMemberUsecase, Mockito.times(1)).deleteMember(1L); + } + + @Test + void deleteMember_ShouldReturn400_WhenRequestIsInvalid() throws Exception { + // Given: 유효하지 않은 DeleteMemberRequest (memberId가 null) + DeleteMemberRequest invalidRequest = new DeleteMemberRequest(null); + + // Then: API 호출 및 결과 검증 + mockMvc.perform(patch("/api/managements/members/delete") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(invalidRequest))) + .andExpect(status().isBadRequest()); + + // Verify: deleteMemberUsecase가 호출되지 않음 + Mockito.verify(deleteMemberUsecase, Mockito.times(0)).deleteMember(Mockito.anyLong()); + } +} From 03b012a428395c1aa1bfcfeec1a4d101d6d81ba6 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 10:09:56 +0900 Subject: [PATCH 2/8] =?UTF-8?q?CLAP-255=20remove:=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20test=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/DeleteMemberControllerTest.java | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java diff --git a/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java b/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java deleted file mode 100644 index 6bfd0504..00000000 --- a/src/test/java/clap/server/application/service/admin/DeleteMemberControllerTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package clap.server.application.service.admin; - -import clap.server.adapter.inbound.web.admin.DeleteMemberController; -import clap.server.adapter.inbound.web.dto.admin.request.DeleteMemberRequest; -import clap.server.application.port.inbound.admin.DeleteMemberUsecase; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(DeleteMemberController.class) -class DeleteMemberControllerTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private DeleteMemberUsecase deleteMemberUsecase; - - @Test - void deleteMember_ShouldReturn200_WhenRequestIsValid() throws Exception { - // Given: 유효한 DeleteMemberRequest - DeleteMemberRequest request = new DeleteMemberRequest(1L); - - // When: Mock된 DeleteMemberUsecase의 호출 설정 - Mockito.doNothing().when(deleteMemberUsecase).deleteMember(1L); - - // Then: API 호출 및 결과 검증 - mockMvc.perform(patch("/api/managements/members/delete") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()); - - // Verify: deleteMemberUsecase의 호출 확인 - Mockito.verify(deleteMemberUsecase, Mockito.times(1)).deleteMember(1L); - } - - @Test - void deleteMember_ShouldReturn400_WhenRequestIsInvalid() throws Exception { - // Given: 유효하지 않은 DeleteMemberRequest (memberId가 null) - DeleteMemberRequest invalidRequest = new DeleteMemberRequest(null); - - // Then: API 호출 및 결과 검증 - mockMvc.perform(patch("/api/managements/members/delete") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(invalidRequest))) - .andExpect(status().isBadRequest()); - - // Verify: deleteMemberUsecase가 호출되지 않음 - Mockito.verify(deleteMemberUsecase, Mockito.times(0)).deleteMember(Mockito.anyLong()); - } -} From 1b894de09f21796131b8218a4ca378aa077ebadc Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Tue, 4 Feb 2025 09:57:07 +0900 Subject: [PATCH 3/8] =?UTF-8?q?CLAP-246=20Refactor:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20import=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/adapter/inbound/web/admin/FindMemberController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index b85c69f4..71114c38 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -7,8 +7,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; From ea659d3b1f6eace3d39582d5cdaaf6cce960dfa2 Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 13:51:38 +0900 Subject: [PATCH 4/8] =?UTF-8?q?CLAP-259=20fix:=EA=B0=80=EC=9E=85=EC=9D=BC?= =?UTF-8?q?=20=EA=B8=B0=EC=A4=80=20=EB=8F=99=EC=A0=81=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/adapter/inbound/web/admin/FindMemberController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index 71114c38..18d1afe7 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -4,6 +4,7 @@ import clap.server.adapter.inbound.web.dto.admin.response.RetrieveAllMemberResponse; import clap.server.adapter.inbound.web.dto.common.PageResponse; import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; From b50e87a7cf1f5afdfe0cf927285241d8d8204c37 Mon Sep 17 00:00:00 2001 From: joowojr Date: Tue, 4 Feb 2025 11:15:09 +0900 Subject: [PATCH 5/8] =?UTF-8?q?CLAP-241=20Refactor:=20=EA=B0=99=EC=9D=80?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=EC=97=90=20=EB=8C=80=ED=95=B4=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9D=B4=20=EC=9D=BC=EC=96=B4=EB=82=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit