Skip to content

Commit

Permalink
feat: 교통편 조회 의존성 변경 (#1216)
Browse files Browse the repository at this point in the history
교통편 조회 기능 repo 의존성 변경
(BusRepository -> ShuttleBusRepository)
  • Loading branch information
kih1015 authored Feb 4, 2025
1 parent 136efa4 commit 1a92dc0
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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, "터미널"),
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -68,5 +74,39 @@ public static class RouteInfo {

@Field("arrival_time")
private List<String> 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("");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ public interface BusRepository extends Repository<BusCourse, String> {

List<BusCourse> findByBusType(String busType);

List<BusCourse> findByBusTypeAndRegion(String busType, String region);

Optional<BusCourse> findByBusTypeAndDirectionAndRegion(String busType, String direction, String region);

default BusCourse getByBusTypeAndDirectionAndRegion(String busType, String direction, String region) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ShuttleBusRoute, ObjectId> {

List<ShuttleBusRoute> findBySemesterType(String semesterType);

List<ShuttleBusRoute> findBySemesterTypeAndRegion(String semesterType, ShuttleBusRegion region);

Optional<ShuttleBusRoute> findById(String id);

default ShuttleBusRoute getById(String id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -15,7 +15,7 @@
import in.koreatech.koin.domain.bus.repository.CityBusTimetableRepository;
import lombok.RequiredArgsConstructor;

@Service
@Component
@RequiredArgsConstructor
public class CityBusRouteStrategy implements BusRouteStrategy {

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<ScheduleInfo> 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<ScheduleInfo> 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<ScheduleInfo> 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
Expand Down

0 comments on commit 1a92dc0

Please sign in to comment.