diff --git a/server/src/main/java/server/haengdong/application/MemberActionService.java b/server/src/main/java/server/haengdong/application/MemberActionService.java index 64858d8d4..749771259 100644 --- a/server/src/main/java/server/haengdong/application/MemberActionService.java +++ b/server/src/main/java/server/haengdong/application/MemberActionService.java @@ -59,6 +59,13 @@ private Event findEvent(String token) { .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.NOT_FOUND_EVENT)); } + public void deleteMember(String token, String memberName) { + Event event = eventRepository.findByToken(token) + .orElseThrow(() -> new HaengdongException(HaengdongErrorCode.NOT_FOUND_EVENT)); + + memberActionRepository.deleteAllByEventAndMemberName(event, memberName); + } + @Transactional public void deleteMemberAction(String token, Long actionId) { Event event = eventRepository.findByToken(token) 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 51248f305..ebc2ffc2b 100644 --- a/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java +++ b/server/src/main/java/server/haengdong/domain/action/MemberActionRepository.java @@ -15,6 +15,14 @@ public interface MemberActionRepository extends JpaRepository findAllByEvent(@Param("event") Event event); + @Modifying + @Query(""" + delete + from MemberAction m + where m.memberName = :memberName and m.action.event = :event + """) + void deleteAllByEventAndMemberName(Event event, String memberName); + Optional findByAction(Action action); @Modifying diff --git a/server/src/main/java/server/haengdong/presentation/MemberActionController.java b/server/src/main/java/server/haengdong/presentation/MemberActionController.java index e2c61b33f..3ac8028bf 100644 --- a/server/src/main/java/server/haengdong/presentation/MemberActionController.java +++ b/server/src/main/java/server/haengdong/presentation/MemberActionController.java @@ -38,6 +38,16 @@ public ResponseEntity getCurrentMembers(@PathVariable("e .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(); + } + @DeleteMapping("/api/events/{eventId}/actions/{actionId}/members") public ResponseEntity deleteMemberAction( @PathVariable("eventId") String token, diff --git a/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java b/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java index 9639f9570..d8b1334fc 100644 --- a/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java +++ b/server/src/test/java/server/haengdong/application/MemberActionServiceTest.java @@ -3,7 +3,7 @@ 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 org.assertj.core.groups.Tuple.tuple; import static server.haengdong.domain.action.MemberActionStatus.IN; import static server.haengdong.domain.action.MemberActionStatus.OUT; @@ -51,7 +51,7 @@ void tearDown() { void saveMemberActionTest() { Event event = eventRepository.save(new Event("test", "TOKEN")); Action action = new Action(event, 1L); - MemberAction memberAction = createMemberAction(action, "망쵸", IN, 1L); + MemberAction memberAction = new MemberAction(action, "망쵸", IN, 1L); memberActionRepository.save(memberAction); assertThatCode(() -> memberActionService.saveMemberAction("TOKEN", new MemberActionsSaveAppRequest( @@ -64,11 +64,11 @@ void saveMemberActionTest() { void saveMemberActionTest1() { Event event = eventRepository.save(new Event("test", "TOKEN")); Action actionOne = new Action(event, 1L); - MemberAction memberActionOne = createMemberAction(actionOne, "망쵸", IN, 1L); + MemberAction memberActionOne = new MemberAction(actionOne, "망쵸", IN, 1L); memberActionRepository.save(memberActionOne); Action actionTwo = new Action(event, 2L); - MemberAction memberActionTwo = createMemberAction(actionTwo, "망쵸", OUT, 1L); + MemberAction memberActionTwo = new MemberAction(actionTwo, "망쵸", OUT, 1L); memberActionRepository.save(memberActionTwo); assertThatCode(() -> memberActionService.saveMemberAction("TOKEN", new MemberActionsSaveAppRequest( @@ -93,6 +93,43 @@ void getCurrentMembers() { .isInstanceOf(HaengdongException.class); } + @DisplayName("행사의 전체 참여자 중에서 특정 참여자의 맴버 액션을 전부 삭제한다.") + @Test + void deleteMember() { + String token = "TOKEN"; + Event event = new Event("행동대장 회식", token); + eventRepository.save(event); + MemberAction memberAction1 = new MemberAction(new Action(event, 1L), "참여자", IN, 1L); + MemberAction memberAction2 = new MemberAction(new Action(event, 2L), "토다리", IN, 1L); + MemberAction memberAction3 = new MemberAction(new Action(event, 3L), "쿠키", IN, 1L); + MemberAction memberAction4 = new MemberAction(new Action(event, 4L), "소하", IN, 1L); + MemberAction memberAction5 = new MemberAction(new Action(event, 5L), "웨디", IN, 1L); + MemberAction memberAction6 = new MemberAction(new Action(event, 6L), "참여자", OUT, 1L); + memberActionRepository.saveAll( + List.of(memberAction1, memberAction2, memberAction3, memberAction4, memberAction5, memberAction6)); + + String token2 = "TOKEN2"; + Event event2 = new Event("옆동네 회식", token2); + eventRepository.save(event2); + Action action2 = Action.createFirst(event2); + MemberAction anotherMemberAction = new MemberAction(action2, "참여자", IN, 1L); + memberActionRepository.save(anotherMemberAction); + + memberActionService.deleteMember(token, "참여자"); + + List memberActions = memberActionRepository.findAll(); + + assertThat(memberActions).hasSize(5) + .extracting("memberName", "status") + .containsExactly( + tuple("토다리", IN), + tuple("쿠키", IN), + tuple("소하", IN), + tuple("웨디", IN), + tuple("참여자", IN) + ); + } + @DisplayName("이벤트에 속한 멤버 액션을 삭제하면 이후에 기록된 해당 참여자의 모든 멤버 액션을 삭제한다.") @Test void deleteMemberAction() { diff --git a/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java b/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java index 22840f091..8a2f5661d 100644 --- a/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java +++ b/server/src/test/java/server/haengdong/presentation/MemberActionControllerTest.java @@ -76,4 +76,15 @@ void deleteMemberAction() throws Exception { .andDo(print()) .andExpect(status().isOk()); } + + @DisplayName("행사의 전체 참여자 중에서 특정 참여자의 맴버 액션을 전부 삭제한다.") + @Test + void deleteMember() throws Exception { + String eventId = "TOKEN"; + String memberName = "행동대장"; + + mockMvc.perform(delete("/api/events/{eventId}/members/{memberName}", eventId, memberName)) + .andDo(print()) + .andExpect(status().isOk()); + } }