diff --git a/src/main/java/ac/knu/likeknu/controller/MainController.java b/src/main/java/ac/knu/likeknu/controller/MainController.java index 5907370..40eef19 100644 --- a/src/main/java/ac/knu/likeknu/controller/MainController.java +++ b/src/main/java/ac/knu/likeknu/controller/MainController.java @@ -57,7 +57,7 @@ public ResponseDto> getMainPageCityBuses( throw new BusinessException("Invalid campus"); } - List cityBuses = cityBusService.earliestOutgoingCityBuses(campus); + List cityBuses = cityBusService.earliestArriveCityBuses(campus); return ResponseDto.of(cityBuses); } diff --git a/src/main/java/ac/knu/likeknu/domain/Route.java b/src/main/java/ac/knu/likeknu/domain/Route.java index ea0f04e..2196876 100644 --- a/src/main/java/ac/knu/likeknu/domain/Route.java +++ b/src/main/java/ac/knu/likeknu/domain/Route.java @@ -45,6 +45,9 @@ public class Route { @Enumerated(value = EnumType.STRING) private Campus campus; + @Column(nullable = false) + private int sequence; + @JoinTable(name = "bus_route", joinColumns = @JoinColumn(name = "route_id"), inverseJoinColumns = @JoinColumn(name = "bus_id")) diff --git a/src/main/java/ac/knu/likeknu/service/CityBusService.java b/src/main/java/ac/knu/likeknu/service/CityBusService.java index 047d3f4..b7e07ef 100644 --- a/src/main/java/ac/knu/likeknu/service/CityBusService.java +++ b/src/main/java/ac/knu/likeknu/service/CityBusService.java @@ -25,7 +25,9 @@ @Service public class CityBusService { - private static final int MAX_BUSES_SIZE = 5; + private static final int MAX_MAIN_ROUTES_SIZE = 3; + private static final int MAX_ARRIVAL_TIMES_SIZE = 5; + private static final LocalTime ROUTE_TYPE_CHANGE_TIME = LocalTime.of(12, 0); private final RouteRepository routeRepository; private final CityBusRepository cityBusRepository; @@ -36,22 +38,36 @@ public CityBusService(RouteRepository routeRepository, CityBusRepository cityBus } /** - * 학교에서 외부로 가는 가장 금방 도착하는 시내버스 정보 + * 학교에서 출발하거나 돌아오는 경로 중 가장 금방 도착하는 시내버스 정보 * * @param campus 캠퍼스 - * @return 캠퍼스별 학교에서 나가는 가장 빠른 시내버스 목록 + * @return 캠퍼스별 학교에서 출발하거나 돌아오는 경로의 가장 빠른 시내버스 목록 */ - public List earliestOutgoingCityBuses(Campus campus) { + public List earliestArriveCityBuses(Campus campus) { + RouteType routeType = getRouteType(LocalTime.now()); return routeRepository.findByCampus(campus, Sort.by(Order.asc("origin"))).stream() - .filter(route -> route.getRouteType().equals(RouteType.OUTGOING)) - .map(route -> { - CityBus earliestBus = getEarliestCityBus(cityBusRepository.findByRoutesContaining(route)); - return earliestBus == null ? MainCityBusResponse.empty(route) - : MainCityBusResponse.of(route, earliestBus); - }) + .filter(route -> route.getRouteType().equals(routeType)) + .sorted(Comparator.comparing(Route::getSequence)) + .map(this::generateMainCityBusResponse) + .limit(MAX_MAIN_ROUTES_SIZE) .toList(); } + private RouteType getRouteType(LocalTime time) { + if (time.isBefore(ROUTE_TYPE_CHANGE_TIME)) { + return RouteType.INCOMING; + } + return RouteType.OUTGOING; + } + + private MainCityBusResponse generateMainCityBusResponse(Route route) { + CityBus earliestBus = getEarliestCityBus(cityBusRepository.findByRoutesContaining(route)); + if (earliestBus == null) { + return MainCityBusResponse.empty(route); + } + return MainCityBusResponse.of(route, earliestBus); + } + private CityBus getEarliestCityBus(List buses) { return buses.stream() .filter(cityBus -> cityBus.getEarliestArrivalTime() != null) @@ -62,19 +78,23 @@ private CityBus getEarliestCityBus(List buses) { /** * 특정 경로의 시내버스 도착 시간 조회 * - * @param routeId 경로 ID + * @param campus 캠퍼스 + * @param routeType 경로 종류(들어오는 거, 나가는 거) * @return 특정 경로의 시내버스 도착 시간 목록 */ public List getCityBusesArrivalTime(Campus campus, RouteType routeType) { List routes = routeRepository.findByCampusAndRouteType(campus, routeType); return routes.stream() - .map(route -> { - List cityBusesArrivalTime = getCityBusesArrivalTime(route); - return CityBusesResponse.of(route, cityBusesArrivalTime); - }) + .sorted(Comparator.comparing(Route::getSequence)) + .map(this::generateCityBusesResponse) .toList(); } + private CityBusesResponse generateCityBusesResponse(Route route) { + List cityBusesArrivalTime = getCityBusesArrivalTime(route); + return CityBusesResponse.of(route, cityBusesArrivalTime); + } + private List getCityBusesArrivalTime(Route route) { LocalTime currentTime = LocalTime.now(); return cityBusRepository.findByRoutesContaining(route) @@ -82,7 +102,7 @@ private List getCityBusesArrivalTime(Route route) .flatMap(cityBus -> getCloseArrivalTimesStream(cityBus, currentTime) .map(arrivalTime -> CityBusesArrivalTimeResponse.of(cityBus, arrivalTime, currentTime))) .sorted(Comparator.comparing(CityBusesArrivalTimeResponse::arrivalAt)) - .limit(MAX_BUSES_SIZE) + .limit(MAX_ARRIVAL_TIMES_SIZE) .toList(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 91cbb15..257b306 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1 @@ -spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_SCHEMA}?characterEncoding=UTF-8&serverTimezone=UTC -spring.datasource.username=${DB_USERNAME} -spring.datasource.password=${DB_PASSWORD} - -spring.jpa.hibernate.ddl-auto=validate +spring.profiles.active=dev \ No newline at end of file diff --git a/src/test/java/ac/knu/likeknu/controller/MainControllerTest.java b/src/test/java/ac/knu/likeknu/controller/MainControllerTest.java index cb36426..823c8f2 100644 --- a/src/test/java/ac/knu/likeknu/controller/MainControllerTest.java +++ b/src/test/java/ac/knu/likeknu/controller/MainControllerTest.java @@ -64,9 +64,9 @@ void getCityBusArrivalTimesSuccess() throws Exception { ); // when - when(cityBusService.earliestOutgoingCityBuses(eq(Campus.CHEONAN))) + when(cityBusService.earliestArriveCityBuses(eq(Campus.CHEONAN))) .thenReturn(cheonanCityBuses); - when(cityBusService.earliestOutgoingCityBuses(eq(Campus.SINGWAN))) + when(cityBusService.earliestArriveCityBuses(eq(Campus.SINGWAN))) .thenReturn(singwanCityBuses); ResultActions cheonanResultActions = mockMvc.perform(get("/api/main/buses") diff --git a/src/test/java/ac/knu/likeknu/service/CityBusServiceTest.java b/src/test/java/ac/knu/likeknu/service/CityBusServiceTest.java index 5ee3f7c..d9acd8c 100644 --- a/src/test/java/ac/knu/likeknu/service/CityBusServiceTest.java +++ b/src/test/java/ac/knu/likeknu/service/CityBusServiceTest.java @@ -67,7 +67,7 @@ void earliestOutgoingCityBusesSuccess() throws Exception { .thenReturn(List.of(cityBus1, cityBus4, cityBus5)); // when - List earliestCityBuses = cityBusService.earliestOutgoingCityBuses(Campus.CHEONAN); + List earliestCityBuses = cityBusService.earliestArriveCityBuses(Campus.CHEONAN); // then MainCityBusResponse mainCityBusResponse = earliestCityBuses.get(1);