From 3824d9dc404821385087f7d7d40fb218a39d72ea Mon Sep 17 00:00:00 2001 From: so1eeee Date: Thu, 29 May 2025 18:57:43 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[feat/#37]=20MULTIPLE=5FBUSES=5FARRIVING=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gooroomi/global/handler/response/BaseResponseStatus.java | 1 + 1 file changed, 1 insertion(+) 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 잘못된 요청 From 8cc82435e5853ff0cd9e227e0458d92596e1baef Mon Sep 17 00:00:00 2001 From: so1eeee Date: Thu, 29 May 2025 18:58:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[chore/#37]=20=EA=B3=A7=20=EB=8F=84?= =?UTF-8?q?=EC=B0=A9=20=EB=B2=84=EC=8A=A4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EC=9D=91=EB=8B=B5=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/gooroomi/domain/bus/api/BusRestController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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) { From 28fef43a881a406a5e2ac72d3a4279c62ceec0da Mon Sep 17 00:00:00 2001 From: so1eeee Date: Thu, 29 May 2025 19:01:14 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[feat/#37]=20=EB=B2=84=EC=8A=A4=20=EB=8F=84?= =?UTF-8?q?=EC=B0=A9=20=EC=A0=95=EB=B3=B4=20API=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EB=B2=84=EC=8A=A4=20=ED=8F=AC=ED=95=A8=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=9D=91=EB=8B=B5=20=EB=B6=84?= =?UTF-8?q?=EA=B8=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/bus/application/BusService.java | 51 ++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) 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); } } From 48d981f23d746b6b06fdaef1e51213e78c0aa265 Mon Sep 17 00:00:00 2001 From: so1eeee Date: Thu, 29 May 2025 19:02:21 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[style/#37]=20=EC=A3=BC=EC=84=9D=20JavaDoc?= =?UTF-8?q?=20=E2=86=92=20=EC=9D=BC=EB=B0=98=20=EB=B8=94=EB=A1=9D=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/bus/application/BusOcrMatchingService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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);