diff --git a/src/main/java/site/youtogether/room/dto/RoomList.java b/src/main/java/site/youtogether/room/dto/RoomList.java index 42b090d..6d3b9c7 100644 --- a/src/main/java/site/youtogether/room/dto/RoomList.java +++ b/src/main/java/site/youtogether/room/dto/RoomList.java @@ -15,10 +15,10 @@ public class RoomList { private boolean hasPrevious; private boolean hasNext; - private List rooms; + private List rooms; @Builder - public RoomList(int pageNumber, int pageSize, int totalData, int totalPage, boolean hasPrevious, boolean hasNext, List rooms) { + public RoomList(int pageNumber, int pageSize, int totalData, int totalPage, boolean hasPrevious, boolean hasNext, List rooms) { this.pageNumber = pageNumber; this.pageSize = pageSize; this.totalData = totalData; diff --git a/src/main/java/site/youtogether/room/dto/RoomDetail.java b/src/main/java/site/youtogether/room/dto/RoomListDetail.java similarity index 64% rename from src/main/java/site/youtogether/room/dto/RoomDetail.java rename to src/main/java/site/youtogether/room/dto/RoomListDetail.java index 568485a..4c6ef6d 100644 --- a/src/main/java/site/youtogether/room/dto/RoomDetail.java +++ b/src/main/java/site/youtogether/room/dto/RoomListDetail.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter -public class RoomDetail { +public class RoomListDetail { private String roomCode; private String roomTitle; @@ -12,15 +12,18 @@ public class RoomDetail { private String videoThumbnail; private int capacity; private int currentParticipant; + private boolean passwordExist; @Builder - public RoomDetail(String roomCode, String roomTitle, String videoTitle, String videoThumbnail, int capacity, int currentParticipant) { + public RoomListDetail(String roomCode, String roomTitle, String videoTitle, String videoThumbnail, int capacity, int currentParticipant, + boolean passwordExist) { this.roomCode = roomCode; this.roomTitle = roomTitle; this.videoTitle = videoTitle; this.videoThumbnail = videoThumbnail; this.capacity = capacity; this.currentParticipant = currentParticipant; + this.passwordExist = passwordExist; } } diff --git a/src/main/java/site/youtogether/room/presentation/RoomController.java b/src/main/java/site/youtogether/room/presentation/RoomController.java index 0713554..787b458 100644 --- a/src/main/java/site/youtogether/room/presentation/RoomController.java +++ b/src/main/java/site/youtogether/room/presentation/RoomController.java @@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -26,6 +25,7 @@ import site.youtogether.room.dto.CreatedRoomInfo; import site.youtogether.room.dto.RoomList; import site.youtogether.room.dto.RoomSettings; +import site.youtogether.user.application.UserService; import site.youtogether.util.RandomUtil; import site.youtogether.util.api.ApiResponse; import site.youtogether.util.api.ResponseResult; @@ -36,12 +36,13 @@ public class RoomController { private final CookieProperties cookieProperties; private final RoomService roomService; + private final UserService userService; @PostMapping("/rooms") - public ResponseEntity> createRoom(@CookieValue(value = SESSION_COOKIE_NAME, required = false) Cookie sessionCookie, + public ResponseEntity> createRoom(@CookieValue(value = SESSION_COOKIE_NAME, required = false) String sessionCode, @Address String address, @Valid @RequestBody RoomSettings roomSettings, HttpServletResponse response) { // Check if a session cookie already exists. - if (sessionCookie != null) { + if (sessionCode != null && userService.isValidSession(sessionCode)) { throw new SingleRoomParticipationViolationException(); } diff --git a/src/main/java/site/youtogether/user/application/UserService.java b/src/main/java/site/youtogether/user/application/UserService.java new file mode 100644 index 0000000..76f7fa7 --- /dev/null +++ b/src/main/java/site/youtogether/user/application/UserService.java @@ -0,0 +1,18 @@ +package site.youtogether.user.application; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import site.youtogether.user.infrastructure.UserStorage; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserStorage userStorage; + + public boolean isValidSession(String sessionCode) { + return userStorage.existsById(sessionCode); + } + +} diff --git a/src/test/java/site/youtogether/RestDocsSupport.java b/src/test/java/site/youtogether/RestDocsSupport.java index ff65587..b0bea92 100644 --- a/src/test/java/site/youtogether/RestDocsSupport.java +++ b/src/test/java/site/youtogether/RestDocsSupport.java @@ -13,6 +13,7 @@ import site.youtogether.config.property.CookieProperties; import site.youtogether.room.application.RoomService; import site.youtogether.room.presentation.RoomController; +import site.youtogether.user.application.UserService; @WebMvcTest(controllers = { RoomController.class @@ -33,4 +34,7 @@ public abstract class RestDocsSupport { @MockBean protected RoomService roomService; + @MockBean + protected UserService userService; + } diff --git a/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java b/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java index 3dc7971..18833f0 100644 --- a/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java +++ b/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java @@ -23,8 +23,8 @@ import site.youtogether.RestDocsSupport; import site.youtogether.exception.room.SingleRoomParticipationViolationException; import site.youtogether.room.dto.CreatedRoomInfo; -import site.youtogether.room.dto.RoomDetail; import site.youtogether.room.dto.RoomList; +import site.youtogether.room.dto.RoomListDetail; import site.youtogether.room.dto.RoomSettings; import site.youtogether.util.api.ResponseResult; @@ -93,7 +93,7 @@ void createRoomSuccess() throws Exception { fieldWithPath("data.hostNickname").type(JsonFieldType.STRING).description("호스트 닉네임"), fieldWithPath("data.capacity").type(JsonFieldType.NUMBER).description("정원"), fieldWithPath("data.currentParticipant").type(JsonFieldType.NUMBER).description("현재 참가자 수"), - fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("현재 참가자 수") + fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부") ) )); } @@ -151,6 +151,8 @@ void createRoomFail_SingleRoomParticipantViolation() throws Exception { .title("재밌는 쇼츠 같이 보기") .password(null) .build(); + given(userService.isValidSession(anyString())) + .willReturn(true); // when / then mockMvc.perform(post("/rooms") @@ -225,6 +227,7 @@ void fetchRoomListSuccess() throws Exception { .andExpect(jsonPath("$.data.rooms[0].videoThumbnail").value(roomList.getRooms().get(0).getVideoThumbnail())) .andExpect(jsonPath("$.data.rooms[0].capacity").value(roomList.getRooms().get(0).getCapacity())) .andExpect(jsonPath("$.data.rooms[0].currentParticipant").value(roomList.getRooms().get(0).getCurrentParticipant())) + .andExpect(jsonPath("$.data.rooms[0].passwordExist").value(roomList.getRooms().get(0).isPasswordExist())) .andDo(document("fetch-room-list-success", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), @@ -245,14 +248,15 @@ void fetchRoomListSuccess() throws Exception { fieldWithPath("data.rooms[].videoTitle").type(JsonFieldType.STRING).description("영상 제목"), fieldWithPath("data.rooms[].videoThumbnail").type(JsonFieldType.STRING).description("영상 썸네일 URL"), fieldWithPath("data.rooms[].capacity").type(JsonFieldType.NUMBER).description("정원"), - fieldWithPath("data.rooms[].currentParticipant").type(JsonFieldType.NUMBER).description("현재 참여자 수") + fieldWithPath("data.rooms[].currentParticipant").type(JsonFieldType.NUMBER).description("현재 참여자 수"), + fieldWithPath("data.rooms[].passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부") ) )); } - private List generateRoomDetails(int count) { + private List generateRoomDetails(int count) { return IntStream.rangeClosed(1, count) - .mapToObj(number -> RoomDetail.builder() + .mapToObj(number -> RoomListDetail.builder() .roomCode("1e7050f7d" + number) .roomTitle("2023년 침착맨 정주행 " + number) .videoTitle("궤도 '연애의 과학' 특강 " + number) @@ -260,6 +264,7 @@ private List generateRoomDetails(int count) { "https://i.ytimg.com/vi/sl7ih5rLfYM/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDbjCXvhBJSBKs9bX_XMy_EfUtvSw") .capacity(10) .currentParticipant(6) + .passwordExist(false) .build()) .toList(); }