From 622bc976b6f7f1ba8ee4bfd5479155f7d522e2e4 Mon Sep 17 00:00:00 2001 From: Youngmyung Kim <83266154+ymkim97@users.noreply.github.com> Date: Tue, 14 Nov 2023 16:25:45 +0900 Subject: [PATCH] =?UTF-8?q?=08feat:=20=EB=B0=A9=EC=9E=A5=20=EC=9C=84?= =?UTF-8?q?=EC=9E=84=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20(#81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 방장 위임 기능 구현 * test: 방장 위임 기능 테스트 작성 * test: 방장이 아닌 유저의 요청인 경우 추가 --- .../api/application/room/RoomService.java | 21 ++++++-- .../api/presentation/RoomController.java | 6 +++ .../api/application/RoomServiceTest.java | 53 +++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/moabam/api/application/room/RoomService.java b/src/main/java/com/moabam/api/application/room/RoomService.java index 4382fce5..8b98b936 100644 --- a/src/main/java/com/moabam/api/application/room/RoomService.java +++ b/src/main/java/com/moabam/api/application/room/RoomService.java @@ -63,10 +63,7 @@ public Long createRoom(Long memberId, CreateRoomRequest createRoomRequest) { @Transactional public void modifyRoom(Long memberId, Long roomId, ModifyRoomRequest modifyRoomRequest) { Participant participant = getParticipant(memberId, roomId); - - if (!participant.isManager()) { - throw new ForbiddenException(ROOM_MODIFY_UNAUTHORIZED_REQUEST); - } + validateManagerAuthorization(participant); Room room = participant.getRoom(); room.changeTitle(modifyRoomRequest.title()); @@ -119,6 +116,16 @@ public void exitRoom(Long memberId, Long roomId) { roomRepository.delete(room); } + @Transactional + public void mandateRoomManager(Long managerId, Long roomId, Long memberId) { + Participant managerParticipant = getParticipant(managerId, roomId); + Participant memberParticipant = getParticipant(memberId, roomId); + validateManagerAuthorization(managerParticipant); + + managerParticipant.disableManager(); + memberParticipant.enableManager(); + } + public void validateRoomById(Long roomId) { if (!roomRepository.existsById(roomId)) { throw new NotFoundException(ROOM_NOT_FOUND); @@ -130,6 +137,12 @@ private Participant getParticipant(Long memberId, Long roomId) { .orElseThrow(() -> new NotFoundException(PARTICIPANT_NOT_FOUND)); } + private void validateManagerAuthorization(Participant participant) { + if (!participant.isManager()) { + throw new ForbiddenException(ROOM_MODIFY_UNAUTHORIZED_REQUEST); + } + } + private void validateRoomEnter(Long memberId, String requestPassword, Room room) { if (!isEnterRoomAvailable(memberId, room.getRoomType())) { throw new BadRequestException(MEMBER_ROOM_EXCEED); diff --git a/src/main/java/com/moabam/api/presentation/RoomController.java b/src/main/java/com/moabam/api/presentation/RoomController.java index dd3e1a89..978d7c3f 100644 --- a/src/main/java/com/moabam/api/presentation/RoomController.java +++ b/src/main/java/com/moabam/api/presentation/RoomController.java @@ -71,4 +71,10 @@ public RoomDetailsResponse getRoomDetails(@PathVariable("roomId") Long roomId) { public void certifyRoom(@PathVariable("roomId") Long roomId, @RequestPart List multipartFiles) { roomCertificationService.certifyRoom(1L, roomId, multipartFiles); } + + @PutMapping("/{roomId}/members/{memberId}/mandate") + @ResponseStatus(HttpStatus.OK) + public void mandateManager(@PathVariable("roomId") Long roomId, @PathVariable("memberId") Long memberId) { + roomService.mandateRoomManager(1L, roomId, memberId); + } } diff --git a/src/test/java/com/moabam/api/application/RoomServiceTest.java b/src/test/java/com/moabam/api/application/RoomServiceTest.java index 77100f14..c0be712a 100644 --- a/src/test/java/com/moabam/api/application/RoomServiceTest.java +++ b/src/test/java/com/moabam/api/application/RoomServiceTest.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,6 +27,8 @@ import com.moabam.api.domain.room.repository.RoomRepository; import com.moabam.api.domain.room.repository.RoutineRepository; import com.moabam.api.dto.room.CreateRoomRequest; +import com.moabam.global.error.exception.ForbiddenException; +import com.moabam.support.fixture.RoomFixture; @ExtendWith(MockitoExtension.class) class RoomServiceTest { @@ -97,4 +100,54 @@ void create_room_with_password_success() { assertThat(result).isEqualTo(expectedRoom.getId()); assertThat(expectedRoom.getPassword()).isEqualTo("1234"); } + + @DisplayName("방장 위임 성공") + @Test + void room_manager_mandate_success() { + // given + Long managerId = 1L; + Long memberId = 2L; + + Room room = spy(RoomFixture.room()); + given(room.getId()).willReturn(1L); + + Participant memberParticipant = RoomFixture.participant(room, memberId); + Participant managerParticipant = RoomFixture.participant(room, managerId); + managerParticipant.enableManager(); + + given(participantSearchRepository.findOne(memberId, room.getId())).willReturn( + Optional.of(memberParticipant)); + given(participantSearchRepository.findOne(managerId, room.getId())).willReturn( + Optional.of(managerParticipant)); + + // when + roomService.mandateRoomManager(managerId, room.getId(), memberId); + + // then + assertThat(managerParticipant.isManager()).isFalse(); + assertThat(memberParticipant.isManager()).isTrue(); + } + + @DisplayName("방장 위임 실패 - 방장이 아닌 유저가 요청할때") + @Test + void room_manager_mandate_fail() { + // given + Long managerId = 1L; + Long memberId = 2L; + + Room room = spy(RoomFixture.room()); + given(room.getId()).willReturn(1L); + + Participant memberParticipant = RoomFixture.participant(room, memberId); + Participant managerParticipant = RoomFixture.participant(room, managerId); + + given(participantSearchRepository.findOne(memberId, room.getId())).willReturn( + Optional.of(memberParticipant)); + given(participantSearchRepository.findOne(managerId, room.getId())).willReturn( + Optional.of(managerParticipant)); + + // when, then + assertThatThrownBy(() -> roomService.mandateRoomManager(managerId, 1L, memberId)) + .isInstanceOf(ForbiddenException.class); + } }