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..5f63146 100644 --- a/src/main/java/com/sajang/devracebackend/controller/UserController.java +++ b/src/main/java/com/sajang/devracebackend/controller/UserController.java @@ -1,6 +1,7 @@ package com.sajang.devracebackend.controller; -import com.sajang.devracebackend.dto.user.SolvedResponseDto; +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; import com.sajang.devracebackend.service.UserService; @@ -21,8 +22,15 @@ 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); + } + + @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/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/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/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..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.SolvedResponseDto; +import com.sajang.devracebackend.dto.user.UserEnterResponseDto; +import com.sajang.devracebackend.dto.user.UserSolvedResponseDto; public interface UserService { User findUser(Long userId); - SolvedResponseDto checkUserSolvedCount(); + 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 387c180..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,13 +43,12 @@ 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) { // 이 로직을 SecurityConfig의 hasAuthority("ROLE_GUEST") 외에도 여기 또 써줘야하는 이유는, - // reissue로 인한 재발급 이후에도 이전 엑세스 토큰으로 '/signup' 경로에 다시 접근할 경우, 토큰 내의 권한은 GUEST이 맞겠지만 DB 내의 권한은 USER이기에 이러한 비정상적인 접근을 방지할 수 있기 때문임. + // reissue로 인한 재발급 이후에도 이전 엑세스 토큰으로 '/signup' 경로에 다시 접근할 경우, 토큰 내의 권한은 GUEST가 맞겠지만 DB 내의 권한은 USER이기에 이러한 비정상적인 접근을 방지할 수 있기 때문임. throw new UserBadRequestException("이미 가입완료 되어있는 사용자입니다."); } @@ -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/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..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,7 +1,9 @@ package com.sajang.devracebackend.service.impl; import com.sajang.devracebackend.domain.User; -import com.sajang.devracebackend.dto.user.SolvedResponseDto; +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; import com.sajang.devracebackend.response.exception.exception404.NoSuchUserException; @@ -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,19 +34,39 @@ public User findUser(Long userId) { @Transactional(readOnly = true) @Override - public SolvedResponseDto checkUserSolvedCount() { + public User findLoginUser() { Long loginUserId = SecurityUtil.getCurrentMemberId(); - User user = findUser(loginUserId); - SolvedResponseDto solvedResponseDto = getSolvedCount(user.getBojId()); + 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); - return solvedResponseDto; + if(userRoom == null) return new UserEnterResponseDto(false, null); // 참여중인 방이 없음 X. + else return new UserEnterResponseDto(true, userRoom.getRoom().getId()); // 참여중인 방이 있음 O. } // ========== 유틸성 메소드 ========== // - @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 +76,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일경우 예외 처리.