From 2c33bb24daed8ce1e90cc7716f7165dc4035ca61 Mon Sep 17 00:00:00 2001 From: kunsanglee Date: Sat, 3 Aug 2024 18:22:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=96=89=EC=82=AC=EC=9D=98=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=A4=91=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EC=B0=B8=EC=97=AC=EC=9E=90=EC=9D=98=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EC=95=A1=EC=85=98=EC=9D=84=20=EB=AA=A8=EB=91=90=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MemberActionService.java | 6 ++++ .../domain/action/MemberActionRepository.java | 9 ++++++ .../presentation/MemberActionController.java | 9 ++++++ .../application/MemberActionServiceTest.java | 31 +++++++++++++++++++ .../MemberActionControllerTest.java | 12 +++++++ 5 files changed, 67 insertions(+) diff --git a/server/src/main/java/server/haengdong/application/MemberActionService.java b/server/src/main/java/server/haengdong/application/MemberActionService.java index f893bd08d..640995755 100644 --- a/server/src/main/java/server/haengdong/application/MemberActionService.java +++ b/server/src/main/java/server/haengdong/application/MemberActionService.java @@ -58,4 +58,10 @@ private Event findEvent(String token) { return eventRepository.findByToken(token) .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.NOT_FOUND_EVENT)); } + + public void deleteMember(String token, String memberName) { + eventRepository.findByToken(token) + .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.NOT_FOUND_EVENT)); + memberActionRepository.deleteAllByMemberName(memberName); + } } diff --git a/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java b/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java index 6c4769e61..c320be6b9 100644 --- a/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java +++ b/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java @@ -2,6 +2,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -12,4 +13,12 @@ public interface MemberActionRepository extends JpaRepository findAllByEvent(@Param("event") Event event); + + @Modifying + @Query(""" + delete + from MemberAction m + where m.memberName = :memberName + """) + void deleteAllByMemberName(String memberName); } diff --git a/server/src/main/java/server/haengdong/presentation/MemberActionController.java b/server/src/main/java/server/haengdong/presentation/MemberActionController.java index c12370d86..983935641 100644 --- a/server/src/main/java/server/haengdong/presentation/MemberActionController.java +++ b/server/src/main/java/server/haengdong/presentation/MemberActionController.java @@ -3,6 +3,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -36,4 +37,12 @@ public ResponseEntity getCurrentMembers(@PathVariable("e return ResponseEntity.ok() .body(CurrentMembersResponse.of(currentMembers)); } + + @DeleteMapping("/api/events/{eventId}/members/{memberName}") + public ResponseEntity deleteMember(@PathVariable("eventId") String token, + @PathVariable("memberName") String memberName) { + memberActionService.deleteMember(token, memberName); + + return ResponseEntity.ok().build(); + } } diff --git a/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java b/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java index 7212e300d..e0362d97d 100644 --- a/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java +++ b/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java @@ -1,7 +1,9 @@ package server.haengdong.application; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.tuple; import static server.haengdong.domain.action.MemberActionStatus.IN; import static server.haengdong.domain.action.MemberActionStatus.OUT; @@ -89,4 +91,33 @@ void getCurrentMembers() { assertThatThrownBy(() -> memberActionService.getCurrentMembers("token")) .isInstanceOf(HaengdongException.class); } + + @DisplayName("행사의 전체 참여자 중에서 특정 참여자의 맴버 액션을 전부 삭제한다.") + @Test + void deleteMember() { + String token = "TOKEN"; + Event event = new Event("행동대장 회식", token); + eventRepository.save(event); + Action action = Action.createFirst(event); + MemberAction memberAction1 = new MemberAction(action, "참여자", IN, 1L); + MemberAction memberAction2 = new MemberAction(action.next(), "토다리", IN, 1L); + MemberAction memberAction3 = new MemberAction(action.next(), "쿠키", IN, 1L); + MemberAction memberAction4 = new MemberAction(action.next(), "소하", IN, 1L); + MemberAction memberAction5 = new MemberAction(action.next(), "웨디", IN, 1L); + MemberAction memberAction6 = new MemberAction(action.next(), "참여자", OUT, 1L); + memberActionRepository.saveAll( + List.of(memberAction1, memberAction2, memberAction3, memberAction4, memberAction5, memberAction6)); + + memberActionService.deleteMember(token, "참여자"); + + List memberActions = memberActionRepository.findAll(); + assertThat(memberActions).hasSize(4) + .extracting("memberName", "status") + .containsExactly( + tuple("토다리", IN), + tuple("쿠키", IN), + tuple("소하", IN), + tuple("웨디", IN) + ); + } } diff --git a/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java b/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java index ad8787cc6..c69aa5a43 100644 --- a/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java +++ b/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -64,4 +65,15 @@ void getCurrentMembers() throws Exception { .andExpect(MockMvcResultMatchers.jsonPath("$.members[0].name").value(equalTo("소하"))) .andExpect(MockMvcResultMatchers.jsonPath("$.members[1].name").value(equalTo("토다리"))); } + + @DisplayName("행사의 전체 참여자 중에서 특정 참여자의 맴버 액션을 전부 삭제한다.") + @Test + void deleteMember() throws Exception { + Long eventId = 1L; + String memberName = "행동대장"; + + mockMvc.perform(delete("/api/events/{eventId}/members/{memberName}", eventId, memberName)) + .andDo(print()) + .andExpect(status().isOk()); + } }