diff --git a/src/main/java/in/koreatech/koin/domain/bus/model/enums/BusStation.java b/src/main/java/in/koreatech/koin/domain/bus/model/enums/BusStation.java index ab2ca6270..5f7852113 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/model/enums/BusStation.java +++ b/src/main/java/in/koreatech/koin/domain/bus/model/enums/BusStation.java @@ -10,7 +10,7 @@ @Getter public enum BusStation { - KOREATECH(List.of("학교", "한기대", "코리아텍"), BusStationNode.KOREATECH, "한기대"), + KOREATECH(List.of("학교", "한기대", "코리아텍", "대학", "본교"), BusStationNode.KOREATECH, "한기대"), STATION(List.of("천안역", "천안역(학화호두과자)"), BusStationNode.STATION, "천안역"), TERMINAL(List.of("터미널", "터미널(신세계 앞 횡단보도)", "야우리"), BusStationNode.TERMINAL, "터미널"), ; diff --git a/src/main/java/in/koreatech/koin/domain/bus/model/mongo/ShuttleBusRoute.java b/src/main/java/in/koreatech/koin/domain/bus/model/mongo/ShuttleBusRoute.java index d13e68730..bcf9ee65a 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/model/mongo/ShuttleBusRoute.java +++ b/src/main/java/in/koreatech/koin/domain/bus/model/mongo/ShuttleBusRoute.java @@ -2,12 +2,18 @@ import static lombok.AccessLevel.PROTECTED; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.format.TextStyle; import java.util.List; +import java.util.Locale; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; +import in.koreatech.koin.domain.bus.exception.BusArrivalNodeNotFoundException; +import in.koreatech.koin.domain.bus.model.enums.BusStation; import in.koreatech.koin.domain.bus.model.enums.ShuttleBusRegion; import in.koreatech.koin.domain.bus.model.enums.ShuttleRouteType; import lombok.Getter; @@ -68,5 +74,39 @@ public static class RouteInfo { @Field("arrival_time") private List arrivalTime; + + public boolean filterRoutesByDayOfWeek(LocalDate date) { + DayOfWeek dayOfWeek = date.getDayOfWeek(); + return runningDays.contains(dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.US).toUpperCase()); + } + } + + public boolean filterDepartAndArriveNode(BusStation departNode, BusStation arriveNode) { + boolean foundDepart = false; + for (NodeInfo node : nodeInfo) { + for (String nodeName : departNode.getDisplayNames()) { + if (!foundDepart && node.getName().contains(nodeName)) { + foundDepart = true; + break; + } + } + for (String nodeName : arriveNode.getDisplayNames()) { + if (foundDepart && node.getName().contains(nodeName)) { + return true; + } + } + } + return false; + } + + public int findArrivalNodeIndexByStation(BusStation departNode) { + for (int i = 0; i < nodeInfo.size(); i++) { + for (String nodeName : departNode.getDisplayNames()) { + if (nodeInfo.get(i).getName().contains(nodeName)) { + return i; + } + } + } + throw new BusArrivalNodeNotFoundException(""); } } diff --git a/src/main/java/in/koreatech/koin/domain/bus/repository/BusRepository.java b/src/main/java/in/koreatech/koin/domain/bus/repository/BusRepository.java index 2dfaefb93..d436a1562 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/repository/BusRepository.java +++ b/src/main/java/in/koreatech/koin/domain/bus/repository/BusRepository.java @@ -14,8 +14,6 @@ public interface BusRepository extends Repository { List findByBusType(String busType); - List findByBusTypeAndRegion(String busType, String region); - Optional findByBusTypeAndDirectionAndRegion(String busType, String direction, String region); default BusCourse getByBusTypeAndDirectionAndRegion(String busType, String direction, String region) { diff --git a/src/main/java/in/koreatech/koin/domain/bus/repository/ShuttleBusRepository.java b/src/main/java/in/koreatech/koin/domain/bus/repository/ShuttleBusRepository.java index 2d60c4587..d56f359f0 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/repository/ShuttleBusRepository.java +++ b/src/main/java/in/koreatech/koin/domain/bus/repository/ShuttleBusRepository.java @@ -7,12 +7,15 @@ import org.springframework.data.repository.Repository; import in.koreatech.koin.domain.bus.exception.BusNotFoundException; +import in.koreatech.koin.domain.bus.model.enums.ShuttleBusRegion; import in.koreatech.koin.domain.bus.model.mongo.ShuttleBusRoute; public interface ShuttleBusRepository extends Repository { List findBySemesterType(String semesterType); + List findBySemesterTypeAndRegion(String semesterType, ShuttleBusRegion region); + Optional findById(String id); default ShuttleBusRoute getById(String id) { diff --git a/src/main/java/in/koreatech/koin/domain/bus/service/route/CityBusRouteStrategy.java b/src/main/java/in/koreatech/koin/domain/bus/service/route/CityBusRouteStrategy.java index d4eb4cd2e..19ee374af 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/service/route/CityBusRouteStrategy.java +++ b/src/main/java/in/koreatech/koin/domain/bus/service/route/CityBusRouteStrategy.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import in.koreatech.koin.domain.bus.dto.BusRouteCommand; import in.koreatech.koin.domain.bus.dto.BusScheduleResponse.ScheduleInfo; @@ -15,7 +15,7 @@ import in.koreatech.koin.domain.bus.repository.CityBusTimetableRepository; import lombok.RequiredArgsConstructor; -@Service +@Component @RequiredArgsConstructor public class CityBusRouteStrategy implements BusRouteStrategy { diff --git a/src/main/java/in/koreatech/koin/domain/bus/service/route/CommutingBusRouteStrategy.java b/src/main/java/in/koreatech/koin/domain/bus/service/route/CommutingBusRouteStrategy.java deleted file mode 100644 index c4cd89298..000000000 --- a/src/main/java/in/koreatech/koin/domain/bus/service/route/CommutingBusRouteStrategy.java +++ /dev/null @@ -1,40 +0,0 @@ -package in.koreatech.koin.domain.bus.service.route; - -import java.util.List; - -import org.springframework.stereotype.Service; - -import in.koreatech.koin.domain.bus.dto.BusRouteCommand; -import in.koreatech.koin.domain.bus.dto.BusScheduleResponse.ScheduleInfo; -import in.koreatech.koin.domain.bus.model.enums.BusRouteType; -import in.koreatech.koin.domain.bus.model.mongo.BusCourse; -import in.koreatech.koin.domain.bus.repository.BusRepository; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class CommutingBusRouteStrategy implements BusRouteStrategy { - - private final BusRepository busRepository; - private static final String BUS_TYPE = "commuting"; - private static final String REGION = "천안"; - - @Override - public List findSchedule(BusRouteCommand command) { - return busRepository.findByBusTypeAndRegion(BUS_TYPE, REGION).stream() - .map(BusCourse::getRoutes) - .flatMap(routes -> - routes.stream() - .filter(route -> route.filterRoutesByDayOfWeek(command.date())) - .filter(route -> route.filterDepartAndArriveNode(command.depart(), command.arrive())) - .map(route -> route.getCommutingShuttleBusScheduleInfo(command.depart())) - ) - .distinct() - .toList(); - } - - @Override - public boolean support(BusRouteType type) { - return type == BusRouteType.SHUTTLE || type == BusRouteType.ALL; - } -} diff --git a/src/main/java/in/koreatech/koin/domain/bus/service/route/ShuttleBusRouteStrategy.java b/src/main/java/in/koreatech/koin/domain/bus/service/route/ShuttleBusRouteStrategy.java index 7a86b3970..1ad65a48e 100644 --- a/src/main/java/in/koreatech/koin/domain/bus/service/route/ShuttleBusRouteStrategy.java +++ b/src/main/java/in/koreatech/koin/domain/bus/service/route/ShuttleBusRouteStrategy.java @@ -1,36 +1,56 @@ package in.koreatech.koin.domain.bus.service.route; +import static in.koreatech.koin.domain.bus.model.enums.ShuttleBusRegion.CHEONAN_ASAN; + +import java.time.LocalTime; +import java.util.ArrayList; import java.util.List; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import in.koreatech.koin.domain.bus.dto.BusRouteCommand; import in.koreatech.koin.domain.bus.dto.BusScheduleResponse.ScheduleInfo; import in.koreatech.koin.domain.bus.model.enums.BusRouteType; -import in.koreatech.koin.domain.bus.model.mongo.BusCourse; -import in.koreatech.koin.domain.bus.repository.BusRepository; +import in.koreatech.koin.domain.bus.model.mongo.ShuttleBusRoute; +import in.koreatech.koin.domain.bus.model.mongo.ShuttleBusRoute.RouteInfo; +import in.koreatech.koin.domain.bus.repository.ShuttleBusRepository; +import in.koreatech.koin.domain.version.model.Version; +import in.koreatech.koin.domain.version.model.VersionType; +import in.koreatech.koin.domain.version.repository.VersionRepository; import lombok.RequiredArgsConstructor; -@Service +@Component @RequiredArgsConstructor public class ShuttleBusRouteStrategy implements BusRouteStrategy { - private final BusRepository busRepository; - private static final String BUS_TYPE = "shuttle"; - private static final String REGION = "천안"; + private final ShuttleBusRepository shuttleBusRepository; + private final VersionRepository versionRepository; @Override public List findSchedule(BusRouteCommand command) { - return busRepository.findByBusTypeAndRegion(BUS_TYPE, REGION).stream() - .map(BusCourse::getRoutes) - .flatMap(routes -> - routes.stream() - .filter(route -> route.filterRoutesByDayOfWeek(command.date())) - .filter(route -> route.filterDepartAndArriveNode(command.depart(), command.arrive())) - .map(route -> route.getShuttleBusScheduleInfo(command.depart())) - ) - .distinct() - .toList(); + Version version = versionRepository.getByTypeAndIsPrevious(VersionType.SHUTTLE, false); + String semesterType = version.getTitle(); + List list = new ArrayList<>(); + for (ShuttleBusRoute shuttleBusRoute : shuttleBusRepository.findBySemesterTypeAndRegion(semesterType, + CHEONAN_ASAN)) { + if (!shuttleBusRoute.filterDepartAndArriveNode(command.depart(), command.arrive())) { + continue; + } + addSchedule(command, shuttleBusRoute, list); + } + return list; + } + + private void addSchedule(BusRouteCommand command, ShuttleBusRoute shuttleBusRoute, List list) { + for (RouteInfo route : shuttleBusRoute.getRouteInfo()) { + if (!route.filterRoutesByDayOfWeek(command.date())) { + continue; + } + int departNodeIndex = shuttleBusRoute.findArrivalNodeIndexByStation(command.depart()); + ScheduleInfo shuttleBusScheduleInfo = new ScheduleInfo("shuttle", + shuttleBusRoute.getRouteName(), LocalTime.parse(route.getArrivalTime().get(departNodeIndex))); + list.add(shuttleBusScheduleInfo); + } } @Override