From e07f789d47326699c7cf9068a3d9901494a2e96f Mon Sep 17 00:00:00 2001 From: Hyun Date: Sat, 18 May 2024 14:58:35 +0900 Subject: [PATCH 1/4] =?UTF-8?q?modify:=20VideoSyncInfoMessage=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20SKIP=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/site/youtogether/playlist/PlayerState.java | 2 +- src/main/java/site/youtogether/playlist/PlayingVideo.java | 8 ++------ .../playlist/application/PlayingVideoService.java | 6 ++---- .../playlist/infrastructure/PlayingVideoStorage.java | 2 +- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/site/youtogether/playlist/PlayerState.java b/src/main/java/site/youtogether/playlist/PlayerState.java index b2dacbe..b8ff336 100644 --- a/src/main/java/site/youtogether/playlist/PlayerState.java +++ b/src/main/java/site/youtogether/playlist/PlayerState.java @@ -2,6 +2,6 @@ public enum PlayerState { - PLAY, PAUSE, END, SKIP, RATE + PLAY, PAUSE, END, RATE } diff --git a/src/main/java/site/youtogether/playlist/PlayingVideo.java b/src/main/java/site/youtogether/playlist/PlayingVideo.java index c1ec1ff..a590e79 100644 --- a/src/main/java/site/youtogether/playlist/PlayingVideo.java +++ b/src/main/java/site/youtogether/playlist/PlayingVideo.java @@ -41,14 +41,14 @@ public PlayingVideo(String roomCode, Video video, MessageService messageService, this.playlistService = playlistService; } - public void start(double time) { + public void startAt(double time) { timer.cancel(); timer.purge(); currentTime = Math.round(time * 100) / 100.0; createTimer(playerRate); } - public void pause(double time) { + public void pauseAt(double time) { timer.cancel(); timer.purge(); currentTime = Math.round(time * 100) / 100.0; @@ -75,10 +75,6 @@ public void changeRate(double playerRate) { createTimer(playerRate); } - public void changeCurrentTime(double time) { - this.currentTime = time; - } - private void createTimer(double playerRate) { timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { diff --git a/src/main/java/site/youtogether/playlist/application/PlayingVideoService.java b/src/main/java/site/youtogether/playlist/application/PlayingVideoService.java index d31bcb1..908c711 100644 --- a/src/main/java/site/youtogether/playlist/application/PlayingVideoService.java +++ b/src/main/java/site/youtogether/playlist/application/PlayingVideoService.java @@ -21,13 +21,11 @@ public void manageVideo(VideoSyncInfoMessage videoSyncInfoMessage) { PlayerState playerState = videoSyncInfoMessage.getPlayerState(); if (playerState == PlayerState.PAUSE) { - playingVideo.pause(videoSyncInfoMessage.getPlayerCurrentTime()); + playingVideo.pauseAt(videoSyncInfoMessage.getPlayerCurrentTime()); } else if (playerState == PlayerState.RATE) { playingVideo.changeRate(videoSyncInfoMessage.getPlayerRate()); } else if (playerState == PlayerState.PLAY) { - playingVideo.start(videoSyncInfoMessage.getPlayerCurrentTime()); - } else if (playerState == PlayerState.SKIP) { - playingVideo.changeCurrentTime(videoSyncInfoMessage.getPlayerCurrentTime()); + playingVideo.startAt(videoSyncInfoMessage.getPlayerCurrentTime()); } } diff --git a/src/main/java/site/youtogether/playlist/infrastructure/PlayingVideoStorage.java b/src/main/java/site/youtogether/playlist/infrastructure/PlayingVideoStorage.java index 13626fb..6c90ecf 100644 --- a/src/main/java/site/youtogether/playlist/infrastructure/PlayingVideoStorage.java +++ b/src/main/java/site/youtogether/playlist/infrastructure/PlayingVideoStorage.java @@ -23,7 +23,7 @@ public Optional findById(String roomCode) { public void saveAndPlay(PlayingVideo playingVideo) { storage.put(playingVideo.getRoomCode(), playingVideo); - playingVideo.start(0); + playingVideo.startAt(0); } public void delete(String roomCode) { From 426efde39305018b13b44c546846e48d5700cea0 Mon Sep 17 00:00:00 2001 From: yeonise Date: Sat, 18 May 2024 15:38:23 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=82=AC=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - method: GET - param: nickname --- .../site/youtogether/user/application/UserService.java | 7 +++++++ .../youtogether/user/presentation/UserController.java | 10 ++++++++++ .../java/site/youtogether/util/api/ResponseResult.java | 1 + 3 files changed, 18 insertions(+) diff --git a/src/main/java/site/youtogether/user/application/UserService.java b/src/main/java/site/youtogether/user/application/UserService.java index 1d7cda9..b44da72 100644 --- a/src/main/java/site/youtogether/user/application/UserService.java +++ b/src/main/java/site/youtogether/user/application/UserService.java @@ -3,6 +3,7 @@ import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; +import site.youtogether.exception.user.UserNicknameDuplicateException; import site.youtogether.exception.user.UserNoExistenceException; import site.youtogether.message.AlarmMessage; import site.youtogether.message.application.MessageService; @@ -54,4 +55,10 @@ public Participant changeUserRole(Long userId, UserRoleChangeForm form) { return new Participant(targetUser); } + public void checkUserNicknameDuplication(String nickname) { + if (uniqueNicknameStorage.exist(nickname)) { + throw new UserNicknameDuplicateException(); + } + } + } diff --git a/src/main/java/site/youtogether/user/presentation/UserController.java b/src/main/java/site/youtogether/user/presentation/UserController.java index f2313fa..35db16a 100644 --- a/src/main/java/site/youtogether/user/presentation/UserController.java +++ b/src/main/java/site/youtogether/user/presentation/UserController.java @@ -1,8 +1,10 @@ package site.youtogether.user.presentation; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.validation.Valid; @@ -21,6 +23,14 @@ public class UserController { private final UserService userService; + @GetMapping("/users/nicknames/check") + public ResponseEntity> checkUserNicknameDuplication(@RequestParam @Valid NicknameInput nickname) { + userService.checkUserNicknameDuplication(nickname.getNewNickname()); + + return ResponseEntity.ok() + .body(ApiResponse.ok(ResponseResult.USER_NICKNAME_IS_UNIQUE, null)); + } + @PatchMapping("/users") public ResponseEntity> changeUserNickname(@UserTracking Long userId, @RequestBody @Valid NicknameInput form) { Participant participantInfo = userService.changeUserNickname(userId, form.getNewNickname()); diff --git a/src/main/java/site/youtogether/util/api/ResponseResult.java b/src/main/java/site/youtogether/util/api/ResponseResult.java index 5fbe903..aa42836 100644 --- a/src/main/java/site/youtogether/util/api/ResponseResult.java +++ b/src/main/java/site/youtogether/util/api/ResponseResult.java @@ -17,6 +17,7 @@ public enum ResponseResult { // User USER_NICKNAME_CHANGE_SUCCESS("유저 닉네임 변경에 성공했습니다"), USER_ROLE_CHANGE_SUCCESS("유저의 역할 변경에 성공했습니다"), + USER_NICKNAME_IS_UNIQUE("사용 가능한 닉네임입니다"), // Playlist PLAYLIST_ADD_SUCCESS("플레이리스트에 비디오 추가를 성공했습니다"), From 840ece922c5f258b637268fae357dd1e7ad0ae98 Mon Sep 17 00:00:00 2001 From: yeonise Date: Sat, 18 May 2024 15:38:35 +0900 Subject: [PATCH 3/4] =?UTF-8?q?test:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=82=AC=20API=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/presentation/UserControllerTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/test/java/site/youtogether/user/presentation/UserControllerTest.java b/src/test/java/site/youtogether/user/presentation/UserControllerTest.java index 8a0b498..b31f6e7 100644 --- a/src/test/java/site/youtogether/user/presentation/UserControllerTest.java +++ b/src/test/java/site/youtogether/user/presentation/UserControllerTest.java @@ -30,6 +30,84 @@ class UserControllerTest extends RestDocsSupport { + @Test + @DisplayName("닉네임 중복 검사 성공") + void checkNicknameDuplication() throws Exception { + // Setting session cookie for request + String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NSJ9.XJHPNpgWMty0iKr1FQKCBeOapvlqk1RjcPQUzT2dFlA"; + Cookie sessionCookie = new Cookie(cookieProperties.getName(), token); + + // Setting new user nickname for request + String newNickname = "new nickname"; + + given(jwtService.parse(eq(token))) + .willReturn(1L); + given(userStorage.existsById(eq(1L))) + .willReturn(true); + + // when // then + mockMvc.perform(get("/users/nicknames/check") + .param("nickname", newNickname) + .cookie(sessionCookie)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(HttpStatus.OK.value())) + .andExpect(jsonPath("$.status").value(HttpStatus.OK.getReasonPhrase())) + .andExpect(jsonPath("$.result").value(ResponseResult.USER_NICKNAME_IS_UNIQUE.getDescription())) + .andDo(document("check-nickname-success", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("code").type(JsonFieldType.NUMBER).description("코드"), + fieldWithPath("status").type(JsonFieldType.STRING).description("상태"), + fieldWithPath("result").type(JsonFieldType.STRING).description("결과"), + fieldWithPath("data").type(JsonFieldType.NULL).description("응답 데이터") + ) + )); + } + + @Test + @DisplayName("닉네임 중복 검사 실패") + void checkNicknameDuplicationFail() throws Exception { + // Setting session cookie for request + String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NSJ9.XJHPNpgWMty0iKr1FQKCBeOapvlqk1RjcPQUzT2dFlA"; + Cookie sessionCookie = new Cookie(cookieProperties.getName(), token); + + // Setting new user nickname for request + String newNickname = "new nickname"; + + given(jwtService.parse(eq(token))) + .willReturn(1L); + given(userStorage.existsById(eq(1L))) + .willReturn(true); + doThrow(new UserNicknameDuplicateException()) + .when(userService).checkUserNicknameDuplication(any()); + + // when // then + mockMvc.perform(get("/users/nicknames/check") + .param("nickname", newNickname) + .cookie(sessionCookie)) + .andDo(print()) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(HttpStatus.BAD_REQUEST.value())) + .andExpect(jsonPath("$.status").value(HttpStatus.BAD_REQUEST.getReasonPhrase())) + .andExpect(jsonPath("$.result").value(ResponseResult.EXCEPTION_OCCURRED.getDescription())) + .andExpect(jsonPath("$.data[0].type").value(UserNicknameDuplicateException.class.getSimpleName())) + .andExpect(jsonPath("$.data[0].message").value(ErrorType.USER_NICKNAME_DUPLICATE.getMessage())) + .andDo(document("check-nickname-fail", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + responseFields( + fieldWithPath("code").type(JsonFieldType.NUMBER).description("코드"), + fieldWithPath("status").type(JsonFieldType.STRING).description("상태"), + fieldWithPath("result").type(JsonFieldType.STRING).description("결과"), + fieldWithPath("data").type(JsonFieldType.ARRAY).description("응답 데이터"), + fieldWithPath("data[].type").type(JsonFieldType.STRING).description("오류 타입"), + fieldWithPath("data[].message").type(JsonFieldType.STRING).description("오류 메시지") + ) + )); + } + @Test @DisplayName("닉네임 변경 성공") void changeNickname() throws Exception { From 1a8d5b8c15ec8ce9f247e671f4b4bd6d7d9c7096 Mon Sep 17 00:00:00 2001 From: yeonise Date: Sat, 18 May 2024 15:38:46 +0900 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EA=B2=80=EC=82=AC=20API=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api/user.adoc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/docs/asciidoc/api/user.adoc b/src/docs/asciidoc/api/user.adoc index f159daa..fabf06e 100644 --- a/src/docs/asciidoc/api/user.adoc +++ b/src/docs/asciidoc/api/user.adoc @@ -1,6 +1,34 @@ [[User-API]] == User API +[[check-nickname-success]] +=== 닉네임 중복 검사 성공 + +==== HTTP Request + +include::{snippets}/check-nickname-success/http-request.adoc[] + +==== HTTP Response + +include::{snippets}/check-nickname-success/http-response.adoc[] +include::{snippets}/check-nickname-success/response-fields.adoc[] + +{nbsp} + +[[check-nickname-fail]] +=== 닉네임 중복 검사 실패 + +==== HTTP Request + +include::{snippets}/check-nickname-fail/http-request.adoc[] + +==== HTTP Response + +include::{snippets}/check-nickname-fail/http-response.adoc[] +include::{snippets}/check-nickname-fail/response-fields.adoc[] + +{nbsp} + [[change-nickname-success]] === 닉네임 변경 성공