From 359bcab92e1c924fbb612ffd3ce0e89b99d64551 Mon Sep 17 00:00:00 2001 From: sahyunjin Date: Mon, 20 May 2024 02:49:10 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[#43]=20File:=20Dto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devracebackend/controller/RoomController.java | 10 +++++----- .../devracebackend/controller/UserController.java | 8 ++++---- ...lemRequestDto.java => ProblemSaveRequestDto.java} | 2 +- ...omIdResponseDto.java => RoomSaveResponseDto.java} | 2 +- ...edResponseDto.java => UserSolvedResponseDto.java} | 4 ++-- .../sajang/devracebackend/service/RoomService.java | 6 +++--- .../sajang/devracebackend/service/UserService.java | 4 ++-- .../devracebackend/service/impl/AuthServiceImpl.java | 2 +- .../devracebackend/service/impl/RoomServiceImpl.java | 12 ++++++------ .../devracebackend/service/impl/UserServiceImpl.java | 12 ++++++------ 10 files changed, 31 insertions(+), 31 deletions(-) rename src/main/java/com/sajang/devracebackend/dto/problem/{ProblemRequestDto.java => ProblemSaveRequestDto.java} (83%) rename src/main/java/com/sajang/devracebackend/dto/room/{RoomIdResponseDto.java => RoomSaveResponseDto.java} (85%) rename src/main/java/com/sajang/devracebackend/dto/user/{SolvedResponseDto.java => UserSolvedResponseDto.java} (72%) diff --git a/src/main/java/com/sajang/devracebackend/controller/RoomController.java b/src/main/java/com/sajang/devracebackend/controller/RoomController.java index cf5137a..9f886a0 100644 --- a/src/main/java/com/sajang/devracebackend/controller/RoomController.java +++ b/src/main/java/com/sajang/devracebackend/controller/RoomController.java @@ -1,7 +1,7 @@ package com.sajang.devracebackend.controller; -import com.sajang.devracebackend.dto.problem.ProblemRequestDto; -import com.sajang.devracebackend.dto.room.RoomIdResponseDto; +import com.sajang.devracebackend.dto.problem.ProblemSaveRequestDto; +import com.sajang.devracebackend.dto.room.RoomSaveResponseDto; import com.sajang.devracebackend.response.ResponseCode; import com.sajang.devracebackend.response.ResponseData; import com.sajang.devracebackend.service.RoomService; @@ -25,8 +25,8 @@ public class RoomController { @PostMapping("/rooms") @Operation(summary = "방 생성 [jwt O]") - public ResponseEntity> createRoom(@RequestBody ProblemRequestDto problemRequestDto) throws IOException { - RoomIdResponseDto roomIdResponseDto = roomService.createRoom(problemRequestDto); - return ResponseData.toResponseEntity(ResponseCode.CREATED_ROOM, roomIdResponseDto); + public ResponseEntity> createRoom(@RequestBody ProblemSaveRequestDto problemSaveRequestDto) throws IOException { + RoomSaveResponseDto roomSaveResponseDto = roomService.createRoom(problemSaveRequestDto); + return ResponseData.toResponseEntity(ResponseCode.CREATED_ROOM, roomSaveResponseDto); } } diff --git a/src/main/java/com/sajang/devracebackend/controller/UserController.java b/src/main/java/com/sajang/devracebackend/controller/UserController.java index 4fa94f5..d2206a6 100644 --- a/src/main/java/com/sajang/devracebackend/controller/UserController.java +++ b/src/main/java/com/sajang/devracebackend/controller/UserController.java @@ -1,6 +1,6 @@ package com.sajang.devracebackend.controller; -import com.sajang.devracebackend.dto.user.SolvedResponseDto; +import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; import com.sajang.devracebackend.response.ResponseCode; import com.sajang.devracebackend.response.ResponseData; import com.sajang.devracebackend.service.UserService; @@ -21,8 +21,8 @@ public class UserController { @GetMapping("/users/solved-count") @Operation(summary = "백준 solvedCount값 조회 [jwt O]") - public ResponseEntity> checkUserSolvedCount() { - SolvedResponseDto solvedResponseDto = userService.checkUserSolvedCount(); - return ResponseData.toResponseEntity(ResponseCode.READ_SOLVEDCOUNT, solvedResponseDto); + public ResponseEntity> checkUserSolvedCount() { + UserSolvedResponseDto userSolvedResponseDto = userService.checkUserSolvedCount(); + return ResponseData.toResponseEntity(ResponseCode.READ_SOLVEDCOUNT, userSolvedResponseDto); } } diff --git a/src/main/java/com/sajang/devracebackend/dto/problem/ProblemRequestDto.java b/src/main/java/com/sajang/devracebackend/dto/problem/ProblemSaveRequestDto.java similarity index 83% rename from src/main/java/com/sajang/devracebackend/dto/problem/ProblemRequestDto.java rename to src/main/java/com/sajang/devracebackend/dto/problem/ProblemSaveRequestDto.java index 2b71c51..993c105 100644 --- a/src/main/java/com/sajang/devracebackend/dto/problem/ProblemRequestDto.java +++ b/src/main/java/com/sajang/devracebackend/dto/problem/ProblemSaveRequestDto.java @@ -5,7 +5,7 @@ @Getter @NoArgsConstructor -public class ProblemRequestDto { +public class ProblemSaveRequestDto { private Integer problemNumber; // 백준 문제 번호 } diff --git a/src/main/java/com/sajang/devracebackend/dto/room/RoomIdResponseDto.java b/src/main/java/com/sajang/devracebackend/dto/room/RoomSaveResponseDto.java similarity index 85% rename from src/main/java/com/sajang/devracebackend/dto/room/RoomIdResponseDto.java rename to src/main/java/com/sajang/devracebackend/dto/room/RoomSaveResponseDto.java index c6f8d02..66e81a9 100644 --- a/src/main/java/com/sajang/devracebackend/dto/room/RoomIdResponseDto.java +++ b/src/main/java/com/sajang/devracebackend/dto/room/RoomSaveResponseDto.java @@ -7,7 +7,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class RoomIdResponseDto { +public class RoomSaveResponseDto { private Long roomId; } diff --git a/src/main/java/com/sajang/devracebackend/dto/user/SolvedResponseDto.java b/src/main/java/com/sajang/devracebackend/dto/user/UserSolvedResponseDto.java similarity index 72% rename from src/main/java/com/sajang/devracebackend/dto/user/SolvedResponseDto.java rename to src/main/java/com/sajang/devracebackend/dto/user/UserSolvedResponseDto.java index 92667cf..a19eae9 100644 --- a/src/main/java/com/sajang/devracebackend/dto/user/SolvedResponseDto.java +++ b/src/main/java/com/sajang/devracebackend/dto/user/UserSolvedResponseDto.java @@ -6,12 +6,12 @@ @Getter @NoArgsConstructor -public class SolvedResponseDto { +public class UserSolvedResponseDto { private Integer solvedCount; @Builder - public SolvedResponseDto(Integer solvedCount){ + public UserSolvedResponseDto(Integer solvedCount){ this.solvedCount = solvedCount; } } diff --git a/src/main/java/com/sajang/devracebackend/service/RoomService.java b/src/main/java/com/sajang/devracebackend/service/RoomService.java index e49c9d1..c71f834 100644 --- a/src/main/java/com/sajang/devracebackend/service/RoomService.java +++ b/src/main/java/com/sajang/devracebackend/service/RoomService.java @@ -1,10 +1,10 @@ package com.sajang.devracebackend.service; -import com.sajang.devracebackend.dto.problem.ProblemRequestDto; -import com.sajang.devracebackend.dto.room.RoomIdResponseDto; +import com.sajang.devracebackend.dto.problem.ProblemSaveRequestDto; +import com.sajang.devracebackend.dto.room.RoomSaveResponseDto; import java.io.IOException; public interface RoomService { - RoomIdResponseDto createRoom(ProblemRequestDto problemRequestDto) throws IOException; + RoomSaveResponseDto createRoom(ProblemSaveRequestDto problemSaveRequestDto) throws IOException; } diff --git a/src/main/java/com/sajang/devracebackend/service/UserService.java b/src/main/java/com/sajang/devracebackend/service/UserService.java index 360f689..5cb803b 100644 --- a/src/main/java/com/sajang/devracebackend/service/UserService.java +++ b/src/main/java/com/sajang/devracebackend/service/UserService.java @@ -1,9 +1,9 @@ package com.sajang.devracebackend.service; import com.sajang.devracebackend.domain.User; -import com.sajang.devracebackend.dto.user.SolvedResponseDto; +import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; public interface UserService { User findUser(Long userId); - SolvedResponseDto checkUserSolvedCount(); + UserSolvedResponseDto checkUserSolvedCount(); } diff --git a/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java b/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java index 387c180..383d65d 100644 --- a/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java @@ -50,7 +50,7 @@ public SignupResponseDto signup(MultipartFile imageFile, SignupRequestDto signup // signup은 Role이 GUEST인 사용자만 이용가능한 API임. if(!user.getRole().equals(Role.ROLE_GUEST) || user.getBojId() != null) { // 이 로직을 SecurityConfig의 hasAuthority("ROLE_GUEST") 외에도 여기 또 써줘야하는 이유는, - // reissue로 인한 재발급 이후에도 이전 엑세스 토큰으로 '/signup' 경로에 다시 접근할 경우, 토큰 내의 권한은 GUEST이 맞겠지만 DB 내의 권한은 USER이기에 이러한 비정상적인 접근을 방지할 수 있기 때문임. + // reissue로 인한 재발급 이후에도 이전 엑세스 토큰으로 '/signup' 경로에 다시 접근할 경우, 토큰 내의 권한은 GUEST가 맞겠지만 DB 내의 권한은 USER이기에 이러한 비정상적인 접근을 방지할 수 있기 때문임. throw new UserBadRequestException("이미 가입완료 되어있는 사용자입니다."); } diff --git a/src/main/java/com/sajang/devracebackend/service/impl/RoomServiceImpl.java b/src/main/java/com/sajang/devracebackend/service/impl/RoomServiceImpl.java index 1d29e76..c22c37a 100644 --- a/src/main/java/com/sajang/devracebackend/service/impl/RoomServiceImpl.java +++ b/src/main/java/com/sajang/devracebackend/service/impl/RoomServiceImpl.java @@ -2,8 +2,8 @@ import com.sajang.devracebackend.domain.Problem; import com.sajang.devracebackend.domain.Room; -import com.sajang.devracebackend.dto.problem.ProblemRequestDto; -import com.sajang.devracebackend.dto.room.RoomIdResponseDto; +import com.sajang.devracebackend.dto.problem.ProblemSaveRequestDto; +import com.sajang.devracebackend.dto.room.RoomSaveResponseDto; import com.sajang.devracebackend.repository.ProblemRepository; import com.sajang.devracebackend.repository.RoomRepository; import com.sajang.devracebackend.service.ProblemService; @@ -27,8 +27,8 @@ public class RoomServiceImpl implements RoomService { @Transactional @Override - public RoomIdResponseDto createRoom(ProblemRequestDto problemRequestDto) throws IOException { - Integer problemNumber = problemRequestDto.getProblemNumber(); + public RoomSaveResponseDto createRoom(ProblemSaveRequestDto problemSaveRequestDto) throws IOException { + Integer problemNumber = problemSaveRequestDto.getProblemNumber(); Problem problem = problemRepository.findByNumber(problemNumber) .orElse(null); // try~catch문 대신 null로 표현했음. @@ -47,8 +47,8 @@ public RoomIdResponseDto createRoom(ProblemRequestDto problemRequestDto) throws .problem(problem) .build(); Long roomId = roomRepository.save(room).getId(); - RoomIdResponseDto roomIdResponseDto = new RoomIdResponseDto(roomId); + RoomSaveResponseDto roomSaveResponseDto = new RoomSaveResponseDto(roomId); - return roomIdResponseDto; + return roomSaveResponseDto; } } diff --git a/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java b/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java index b7d47f9..f23cb7f 100644 --- a/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java @@ -1,7 +1,7 @@ package com.sajang.devracebackend.service.impl; import com.sajang.devracebackend.domain.User; -import com.sajang.devracebackend.dto.user.SolvedResponseDto; +import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; import com.sajang.devracebackend.repository.UserRepository; import com.sajang.devracebackend.response.exception.exception404.NoSuchBojIdException; import com.sajang.devracebackend.response.exception.exception404.NoSuchUserException; @@ -30,19 +30,19 @@ public User findUser(Long userId) { @Transactional(readOnly = true) @Override - public SolvedResponseDto checkUserSolvedCount() { + public UserSolvedResponseDto checkUserSolvedCount() { Long loginUserId = SecurityUtil.getCurrentMemberId(); User user = findUser(loginUserId); - SolvedResponseDto solvedResponseDto = getSolvedCount(user.getBojId()); + UserSolvedResponseDto userSolvedResponseDto = getSolvedCount(user.getBojId()); - return solvedResponseDto; + return userSolvedResponseDto; } // ========== 유틸성 메소드 ========== // @Transactional - public static SolvedResponseDto getSolvedCount(String bojId){ // WebClient로 외부 solved API 호출 메소드 + public static UserSolvedResponseDto getSolvedCount(String bojId){ // WebClient로 외부 solved API 호출 메소드 try { WebClient webClient = WebClient.builder() .baseUrl("https://solved.ac/api/v3") @@ -52,7 +52,7 @@ public static SolvedResponseDto getSolvedCount(String bojId){ // WebClient로 return webClient.get() .uri("/user/show?handle=" + bojId) .retrieve() - .bodyToMono(SolvedResponseDto.class) + .bodyToMono(UserSolvedResponseDto.class) .block(); }catch (Exception e){ throw new NoSuchBojIdException("bojId = " + bojId); // solvedac 서버에 존재하지않는 백준id일경우 예외 처리. From 3e512c7214c423294ab6e1060cf28b7f689fd7d3 Mon Sep 17 00:00:00 2001 From: sahyunjin Date: Mon, 20 May 2024 03:42:47 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[#43]=20Feat:=20=EC=B0=B8=EC=97=AC=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=A9=20=EC=97=AC=EB=B6=80=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserController.java | 8 +++++ .../dto/user/UserEnterResponseDto.java | 14 +++++++++ .../devracebackend/service/UserService.java | 3 ++ .../service/impl/AuthServiceImpl.java | 6 ++-- .../service/impl/UserServiceImpl.java | 30 +++++++++++++++++-- 5 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/sajang/devracebackend/dto/user/UserEnterResponseDto.java diff --git a/src/main/java/com/sajang/devracebackend/controller/UserController.java b/src/main/java/com/sajang/devracebackend/controller/UserController.java index d2206a6..5f63146 100644 --- a/src/main/java/com/sajang/devracebackend/controller/UserController.java +++ b/src/main/java/com/sajang/devracebackend/controller/UserController.java @@ -1,5 +1,6 @@ package com.sajang.devracebackend.controller; +import com.sajang.devracebackend.dto.user.UserEnterResponseDto; import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; import com.sajang.devracebackend.response.ResponseCode; import com.sajang.devracebackend.response.ResponseData; @@ -25,4 +26,11 @@ public ResponseEntity> checkUserSolvedCount( UserSolvedResponseDto userSolvedResponseDto = userService.checkUserSolvedCount(); return ResponseData.toResponseEntity(ResponseCode.READ_SOLVEDCOUNT, userSolvedResponseDto); } + + @GetMapping("/users/rooms") + @Operation(summary = "참여중인 방 여부 검사 [jwt O]") + public ResponseEntity> findCurrentRoom() { + UserEnterResponseDto userEnterResponseDto = userService.findCurrentRoom(); + return ResponseData.toResponseEntity(ResponseCode.READ_ROOM, userEnterResponseDto); + } } diff --git a/src/main/java/com/sajang/devracebackend/dto/user/UserEnterResponseDto.java b/src/main/java/com/sajang/devracebackend/dto/user/UserEnterResponseDto.java new file mode 100644 index 0000000..f6fe118 --- /dev/null +++ b/src/main/java/com/sajang/devracebackend/dto/user/UserEnterResponseDto.java @@ -0,0 +1,14 @@ +package com.sajang.devracebackend.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserEnterResponseDto { + + private Boolean isEnter; // 참여중인 방 존재 여부 + private Long roomId; // null 가능. +} diff --git a/src/main/java/com/sajang/devracebackend/service/UserService.java b/src/main/java/com/sajang/devracebackend/service/UserService.java index 5cb803b..ebf34c6 100644 --- a/src/main/java/com/sajang/devracebackend/service/UserService.java +++ b/src/main/java/com/sajang/devracebackend/service/UserService.java @@ -1,9 +1,12 @@ package com.sajang.devracebackend.service; import com.sajang.devracebackend.domain.User; +import com.sajang.devracebackend.dto.user.UserEnterResponseDto; import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; public interface UserService { User findUser(Long userId); + User findLoginUser(); UserSolvedResponseDto checkUserSolvedCount(); + UserEnterResponseDto findCurrentRoom(); } diff --git a/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java b/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java index 383d65d..c9b9c95 100644 --- a/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/sajang/devracebackend/service/impl/AuthServiceImpl.java @@ -13,7 +13,6 @@ import com.sajang.devracebackend.service.AuthService; import com.sajang.devracebackend.service.AwsS3Service; import com.sajang.devracebackend.service.UserService; -import com.sajang.devracebackend.util.SecurityUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,8 +43,7 @@ public SignupResponseDto signup(MultipartFile imageFile, SignupRequestDto signup } UserServiceImpl.getSolvedCount(signupRequestDto.getBojId()); // solvedac 서버에 존재하지않는 백준id일경우 예외 처리. - Long loginUserId = SecurityUtil.getCurrentMemberId(); - User user = userService.findUser(loginUserId); + User user = userService.findLoginUser(); // signup은 Role이 GUEST인 사용자만 이용가능한 API임. if(!user.getRole().equals(Role.ROLE_GUEST) || user.getBojId() != null) { @@ -69,7 +67,7 @@ else if(imageFile != null && signupRequestDto.getIsImageChange() == 0) { // 기 UserResponseDto userResponseDto = new UserResponseDto(user); // 추가정보 입력후, 위에서 Role을 GUEST->USER로 업데이트했지만, 헤더의 jwt 토큰에 등록해둔 권한도 수정해야하기에, Access 토큰도 따로 재발급해야함. - TokenDto tokenDto = tokenProvider.generateAccessTokenByRefreshToken(loginUserId, Role.ROLE_USER, user.getRefreshToken()); + TokenDto tokenDto = tokenProvider.generateAccessTokenByRefreshToken(user.getId(), Role.ROLE_USER, user.getRefreshToken()); return new SignupResponseDto(userResponseDto, tokenDto); } diff --git a/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java b/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java index f23cb7f..80d59f6 100644 --- a/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sajang/devracebackend/service/impl/UserServiceImpl.java @@ -1,6 +1,8 @@ package com.sajang.devracebackend.service.impl; import com.sajang.devracebackend.domain.User; +import com.sajang.devracebackend.domain.mapping.UserRoom; +import com.sajang.devracebackend.dto.user.UserEnterResponseDto; import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; import com.sajang.devracebackend.repository.UserRepository; import com.sajang.devracebackend.response.exception.exception404.NoSuchBojIdException; @@ -14,6 +16,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient; +import java.util.Optional; + @Service @RequiredArgsConstructor public class UserServiceImpl implements UserService { @@ -30,18 +34,38 @@ public User findUser(Long userId) { @Transactional(readOnly = true) @Override - public UserSolvedResponseDto checkUserSolvedCount() { + public User findLoginUser() { Long loginUserId = SecurityUtil.getCurrentMemberId(); - User user = findUser(loginUserId); + User loginUser = findUser(loginUserId); + return loginUser; + } + + @Transactional(readOnly = true) + @Override + public UserSolvedResponseDto checkUserSolvedCount() { + User user = findLoginUser(); UserSolvedResponseDto userSolvedResponseDto = getSolvedCount(user.getBojId()); return userSolvedResponseDto; } + @Transactional(readOnly = true) + @Override + public UserEnterResponseDto findCurrentRoom() { + User user = findLoginUser(); + + Optional optionalUserRoom = user.getUserRoomList().stream() + .filter(userRoom -> userRoom.getIsLeave() == 0) // getIsLeave() 값이 0인 경우만 필터링 (참여중인 방 찾기) + .findFirst(); + UserRoom userRoom = optionalUserRoom.orElse(null); + + if(userRoom == null) return new UserEnterResponseDto(false, null); // 참여중인 방이 없음 X. + else return new UserEnterResponseDto(true, userRoom.getRoom().getId()); // 참여중인 방이 있음 O. + } + // ========== 유틸성 메소드 ========== // - @Transactional public static UserSolvedResponseDto getSolvedCount(String bojId){ // WebClient로 외부 solved API 호출 메소드 try { WebClient webClient = WebClient.builder()