diff --git a/src/main/java/server/gooroomi/domain/bus/api/BusRestController.java b/src/main/java/server/gooroomi/domain/bus/api/BusRestController.java index ccc8919..c114f98 100644 --- a/src/main/java/server/gooroomi/domain/bus/api/BusRestController.java +++ b/src/main/java/server/gooroomi/domain/bus/api/BusRestController.java @@ -25,7 +25,9 @@ public class BusRestController { private final BusOcrMatchingService busOcrMatchingService; @Operation(summary = "곧 도착 버스 목록 조회", description = "사용자의 위치 기준으로 도착 예정인 버스 목록을 조회합니다. " - + "사용자가 등록한 버스가 포함된 경우 code: 20002로 응답합니다.") + + "사용자가 등록한 버스가 포함된 경우, 다음과 같이 응답합니다: " + + "1. 사용자가 등록한 버스 1대만 도착하는 경우: code: 20002 " + + "2. 사용자가 등록한 버스가 여러 대의 버스와 함께 도착하는 경우: code: 20003") @Parameters({ @Parameter(name = "userId", description = "사용자 ID", required = true) }) @GetMapping("/arrivals") public BaseResponse> getBusArrivals(@RequestParam Long userId) { diff --git a/src/main/java/server/gooroomi/domain/bus/application/BusOcrMatchingService.java b/src/main/java/server/gooroomi/domain/bus/application/BusOcrMatchingService.java index 1c0b4da..4d97fde 100644 --- a/src/main/java/server/gooroomi/domain/bus/application/BusOcrMatchingService.java +++ b/src/main/java/server/gooroomi/domain/bus/application/BusOcrMatchingService.java @@ -50,11 +50,11 @@ public BaseResponse processOcrResult(OcrProcessRequest reque return BaseResponse.success(similarMatchResponse.get()); } - /** - * 일치하는 버스가 없는 경우 (정확히 일치하지도 않고, 유사하지도 않은 경우) - * 다음 경우가 포함됨 - * 1. 버스 목록이 비어있는 경우 - * 2. 유사도가 임계값보다 낮은 경우 + /* + 일치하는 버스가 없는 경우 (정확히 일치하지도 않고, 유사하지도 않은 경우) + 다음 경우가 포함됨 + 1. 버스 목록이 비어있는 경우 + 2. 유사도가 임계값보다 낮은 경우 */ OcrProcessResponse response = BusConverter.toOCRProcessResponse(request.getOcrText(), request.getOcrText(), MatchType.NONE); diff --git a/src/main/java/server/gooroomi/domain/bus/application/BusService.java b/src/main/java/server/gooroomi/domain/bus/application/BusService.java index faee8f3..ec3068c 100644 --- a/src/main/java/server/gooroomi/domain/bus/application/BusService.java +++ b/src/main/java/server/gooroomi/domain/bus/application/BusService.java @@ -13,6 +13,7 @@ import server.gooroomi.global.handler.response.BaseResponseStatus; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -20,28 +21,64 @@ public class BusService { private final UserRepository userRepository; + /** + * 사용자 ID를 기반으로 버스 도착 정보 조회 + */ public BaseResponse> getBusArrivals(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_USER)); + BusStation busStation = getBusStationFromUser(user); String userBusNumber = user.getBusNumber(); - BusStation nearestBusStation = user.getBusStation(); - if (nearestBusStation == null) { + // 버스 도착 정보 조회 및 변환 + List busArrivals = busStation.getBusArrivals(); + List responseList = busArrivals.stream().map(BusConverter::toBusArrivalResponse) + .collect(Collectors.toList()); + + // 사용자 버스 도착 여부에 따른 응답 + return getBusArrivalResponse(userBusNumber, busArrivals, responseList); + } + + /** + * 사용자 버스 정류소 정보 조회 + */ + private BusStation getBusStationFromUser(User user) { + BusStation busStation = user.getBusStation(); + if (busStation == null) { throw new BaseException(BaseResponseStatus.LOCATION_NOT_UPDATED); } + return busStation; + } - List busArrivals = nearestBusStation.getBusArrivals(); - - List responseList = busArrivals.stream().map(BusConverter::toBusArrivalResponse).toList(); + /** + * 사용자가 등록한 버스의 도착 여부에 따라 다른 응답 + */ + private BaseResponse> getBusArrivalResponse(String userBusNumber, + List busArrivals, List responseList) { + // 사용자가 등록한 버스가 도착 예정 버스 목록에 있는지 확인 boolean isUserBusArriving = busArrivals.stream() .anyMatch(busArrival -> busArrival.getBusNumber().equals(userBusNumber)); - if (isUserBusArriving) { + // 사용자의 버스가 도착 예정이 아닌 경우 + if (!isUserBusArriving) { + return BaseResponse.success(responseList); + } + + // 도착 예정인 버스가 사용자의 버스 1대만 있는 경우 (code: 20002) + if (isSingleUserBusArriving(busArrivals, userBusNumber)) { return BaseResponse.success(BaseResponseStatus.USER_BUS_ARRIVING, responseList); } - return BaseResponse.success(responseList); + // 도착 예정인 버스가 여러 대이고, 그 중에 사용자의 버스가 포함된 경우 (code: 20003) + return BaseResponse.success(BaseResponseStatus.MULTIPLE_BUSES_ARRIVING, responseList); + } + + /** + * 도착 예정인 버스가 사용자의 버스 1대만 있는지 확인 + */ + private boolean isSingleUserBusArriving(List busArrivals, String userBusNumber) { + return busArrivals.size() == 1 && busArrivals.get(0).getBusNumber().equals(userBusNumber); } } diff --git a/src/main/java/server/gooroomi/global/handler/response/BaseResponseStatus.java b/src/main/java/server/gooroomi/global/handler/response/BaseResponseStatus.java index c115aee..fc2bca2 100644 --- a/src/main/java/server/gooroomi/global/handler/response/BaseResponseStatus.java +++ b/src/main/java/server/gooroomi/global/handler/response/BaseResponseStatus.java @@ -18,6 +18,7 @@ public enum BaseResponseStatus { */ STATION_NOT_FOUND(true, 20001, HttpStatus.OK, "주변에 버스 정류소가 존재하지 않습니다."), USER_BUS_ARRIVING(true, 20002, HttpStatus.OK, "등록된 버스가 곧 도착합니다."), + MULTIPLE_BUSES_ARRIVING(true, 20003, HttpStatus.OK, "등록된 버스가 곧 도착합니다."), /** * 400 BAD_REQUEST 잘못된 요청