diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/DistanceResponse.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/DistanceResponse.java index 62a3f72..8acc5fa 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/DistanceResponse.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/DistanceResponse.java @@ -1,5 +1,6 @@ package com.pinHouse.server.platform.housing.complex.application.dto.response; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.pinHouse.server.platform.housing.complex.application.dto.result.RootResult; import com.pinHouse.server.platform.housing.complex.application.dto.result.SubwayLineType; @@ -97,6 +98,7 @@ public record TransitResponse( String lineText, @Schema(description = "통합 노선 정보 (코드, 이름, 색상)") + @JsonIgnore LineInfo line, @Schema(hidden = true) @@ -116,6 +118,7 @@ public record TransitResponse( ExpressBusType expressBusType, @Schema(description = "세그먼트 배경 컬러(Hex 코드)", example = "#FF5722") + @JsonIgnore String bgColorHex) { } @@ -153,6 +156,7 @@ public record TransferPointResponse( ExpressBusType expressBusType, @Schema(description = "배경 컬러(Hex 코드)") + @JsonIgnore String bgColorHex ) { public enum TransferRole { diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitRoutesResponse.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitRoutesResponse.java new file mode 100644 index 0000000..1511bfb --- /dev/null +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitRoutesResponse.java @@ -0,0 +1,141 @@ +package com.pinHouse.server.platform.housing.complex.application.dto.response; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.pinHouse.server.platform.housing.complex.application.dto.result.LineInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +/** + * 대중교통 경로 응답 (3개 경로 한 번에 제공) + */ +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "[응답][대중교통] 전체 경로 응답", description = "3개의 대중교통 경로를 한 번에 제공하는 응답 DTO") +public record TransitRoutesResponse( + + @Schema(description = "전체 경로 개수", example = "3") + int totalCount, + + @Schema(description = "경로 리스트 (최대 3개)") + List routes +) { + + /** + * 개별 경로 정보 + */ + @Builder + @Schema(name = "[응답][대중교통] 개별 경로", description = "하나의 대중교통 경로 정보") + public record RouteResponse( + + @Schema(description = "경로 인덱스 (0부터 시작)", example = "0") + int routeIndex, + + @Schema(description = "경로 요약 정보") + SummaryResponse summary, + + @Schema(description = "색 막대용 구간 정보 배열") + List distance, + + @Schema(description = "세부 경로 단계 배열 (색깔 + 승차/하차 + 소요시간 모두 포함)") + List steps + ) { + } + + /** + * 경로 요약 정보 + */ + @Builder + @Schema(name = "[응답][대중교통] 경로 요약", description = "총 시간, 거리, 요금, 환승 횟수") + public record SummaryResponse( + + @Schema(description = "총 소요 시간(분)", example = "83") + int totalMinutes, + + @Schema(description = "총 거리(km)", example = "39.6") + double totalDistanceKm, + + @Schema(description = "총 요금(원), 없으면 null", example = "1350") + Integer totalFareWon, + + @Schema(description = "환승 횟수", example = "1") + int transferCount, + + @Schema(description = "UI 표시용 시간 텍스트", example = "1시간 23분") + String displayText + ) { + } + + /** + * 색 막대용 구간 정보 + */ + @Builder + @Schema(name = "[응답][대중교통] 세그먼트", description = "색 막대 렌더링용 구간 정보") + public record SegmentResponse( + + @Schema(description = "이동 수단 (WALK, BUS, SUBWAY, TRAIN, AIR)", example = "SUBWAY") + String type, + + @Schema(description = "소요 시간(분)", example = "65") + int minutes, + + @Schema(description = "막대 위 표시 텍스트", example = "65분") + String minutesText, + + @Schema(description = "구간 색상(Hex)", example = "#3356B4") + String colorHex, + + @Schema(description = "노선 정보 (WALK면 null)") + LineInfo line + ) {} + + /** + * 세부 경로 단계 (색깔 + 승차/하차 + 시간 정보 통합) + */ + @Builder + @Schema(name = "[응답][대중교통] 단계", description = "세부 경로 단계 (색깔 + 승차/하차/도보 등 모든 정보 포함)") + public record StepResponse( + + @Schema(description = "단계 인덱스 (0부터 시작)", example = "0") + int stepIndex, + + @Schema(description = "행동 타입 (DEPART, WALK, BOARD, ALIGHT, ARRIVE)", example = "BOARD") + StepAction action, + + @Schema(description = "이동 수단 (WALK, BUS, SUBWAY, TRAIN, AIR, null)", example = "SUBWAY") + String type, + + @Schema(description = "정류장/역 이름", example = "시청역") + String stopName, + + @Schema(description = "주 텍스트 (UI에 굵게 표시)", example = "시청역 승차") + String primaryText, + + @Schema(description = "부 텍스트 (노선명, 방면 등)", example = "수도권 1호선") + @JsonIgnore + String secondaryText, + + @Schema(description = "해당 구간 소요 시간(분), 없으면 null", example = "65") + Integer minutes, + + @Schema(description = "색 막대용 색상(Hex), 출발/도착은 null", example = "#3356B4") + String colorHex, + + @Schema(description = "노선 정보 (WALK면 null)") + LineInfo line + ) { + } + + /** + * 단계 행동 타입 + */ + public enum StepAction { + DEPART, // 출발 + WALK, // 도보 + BOARD, // 승차 + ALIGHT, // 하차 + ARRIVE // 도착 + } +} diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/BusRouteType.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/BusRouteType.java index cf94142..bb352e6 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/BusRouteType.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/BusRouteType.java @@ -18,21 +18,24 @@ public enum BusRouteType { VILLAGE(3, "마을버스", "#86C34B"), DIRECT_SEAT(4, "직행좌석", "#D82628"), AIRPORT(5, "공항버스", "#F68A1E"), - TRUNK(6, "간선급행", "#BBBBBB"), - OUTER(10, "외곽", "#BBBBBB"), + + TRUNK(6, "간선급행", "#E6002D"), + OUTER(10, "외곽", "#8E8E8E"), TRUNK_LINE(11, "간선", "#0069B3"), BRANCH(12, "지선", "#2E933C"), CIRCULAR(13, "순환", "#F8B600"), WIDE_AREA(14, "광역", "#D82628"), EXPRESS(15, "급행", "#F8B600"), - TOUR(16, "관광버스", "#BBBBBB"), - RURAL(20, "농어촌버스", "#BBBBBB"), + + TOUR(16, "관광버스", "#6A4FB3"), + RURAL(20, "농어촌버스", "#5B8C3B"), GYEONGGI_INTERCITY(22, "경기도 시외형버스", "#D82628"), - EXPRESS_TRUNK(26, "급행간선", "#BBBBBB"), - HAN_RIVER(30, "한강버스", "#BBBBBB"), + EXPRESS_TRUNK(26, "급행간선", "#C8102E"), + HAN_RIVER(30, "한강버스", "#1CA9C9"), UNKNOWN(-1, "UNKNOWN", "#BBBBBB"); + private final int code; private final String label; diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/LineInfo.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/LineInfo.java index aa1c882..4680cb7 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/LineInfo.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/LineInfo.java @@ -1,5 +1,6 @@ package com.pinHouse.server.platform.housing.complex.application.dto.result; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @@ -11,12 +12,14 @@ @Schema(name = "교통수단 노선 정보", description = "교통수단의 코드, 이름, 색상 정보") public record LineInfo( @Schema(description = "노선 코드", example = "1") + @JsonIgnore Integer code, @Schema(description = "노선명", example = "KTX") String label, @Schema(description = "배경 색상 (Hex 코드)", example = "#3356B4") + @JsonIgnore String bgColorHex ) { /** diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java index f1b7f5d..db0bd1c 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java @@ -108,7 +108,7 @@ public List getComplexUnitTypes(String id, UUID userId) { - /// 대중교통 시뮬레이터 + /// 대중교통 시뮬레이터 (기존 스키마) @Override @Transactional public List getDistance(String id, String pinPointId) throws UnsupportedEncodingException { @@ -131,16 +131,41 @@ public List getDistance(String id, String pinPointId) throws U return rootResults.stream() .map(route -> { // 각 경로의 세부 구간을 TransitResponse 리스트로 매핑 - List segments = mapper.from(route); + List distance = mapper.from(route); List stops = mapper.extractStops(route); // DistanceResponse 하나 생성 - return DistanceResponse.from(route, segments, stops); + return DistanceResponse.from(route, distance, stops); }) .toList(); } + /// 대중교통 시뮬레이터 (새 스키마 - 3개 경로 한 번에) + @Override + @Transactional + public TransitRoutesResponse getDistanceV2(String id, String pinPointId) throws UnsupportedEncodingException { + + /// 임대주택 예외처리 + ComplexDocument complex = loadComplex(id); + Location location = complex.getLocation(); + + /// 핀포인트 조회 + PinPoint pinPoint = pinPointService.loadPinPoint(pinPointId); + Location pointLocation = pinPoint.getLocation(); + + /// 대중교통 목록 가져오기 + PathResult pathResult = distanceUtil.findPathResult( + pointLocation.getLatitude(), + pointLocation.getLongitude(), + location.getLatitude(), + location.getLongitude() + ); + + /// 새 스키마로 변환 (3개 경로 한 번에) + return mapper.toTransitRoutesResponse(pathResult); + } + /// 좋아요 누른 방 목록 조회 @Override @Transactional(readOnly = true) diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/usecase/ComplexUseCase.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/usecase/ComplexUseCase.java index 1fc03a3..40c7856 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/usecase/ComplexUseCase.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/usecase/ComplexUseCase.java @@ -2,6 +2,7 @@ import com.pinHouse.server.platform.housing.complex.application.dto.response.ComplexDetailResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.DistanceResponse; +import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.UnitTypeResponse; import com.pinHouse.server.platform.housing.complex.domain.entity.ComplexDocument; import com.pinHouse.server.platform.like.application.dto.UnityTypeLikeResponse; @@ -25,9 +26,12 @@ public interface ComplexUseCase { /// 상세 조회 List getComplexUnitTypes(String id, UUID userId); - /// 거리 시뮬레이터 전부 조회 + /// 거리 시뮬레이터 전부 조회 (기존 스키마) List getDistance(String id, String pinPointId) throws UnsupportedEncodingException; + /// 거리 시뮬레이터 전부 조회 (새 스키마 - 3개 경로 한 번에) + TransitRoutesResponse getDistanceV2(String id, String pinPointId) throws UnsupportedEncodingException; + /// 간편 거리 시뮬레이터 (Redis 캐싱 포함) DistanceResponse getEasyDistance(String id, String pinPointId) throws UnsupportedEncodingException; diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java index e8787bb..0ee6c7c 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java @@ -2,6 +2,7 @@ import com.pinHouse.server.platform.housing.complex.application.dto.response.ChipType; import com.pinHouse.server.platform.housing.complex.application.dto.response.DistanceResponse; +import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse; import com.pinHouse.server.platform.housing.complex.application.dto.result.PathResult; import com.pinHouse.server.platform.housing.complex.application.dto.result.RootResult; import lombok.AccessLevel; @@ -266,4 +267,354 @@ private static String extractBgColorHex(RootResult.DistanceStep step, ChipType t // 그 외의 경우 기본 회색 반환 return "#BBBBBB"; } + + // ================= + // 새 스키마 변환 로직 + // ================= + + /** + * 새 스키마: 3개 경로를 한 번에 변환 + */ + public TransitRoutesResponse toTransitRoutesResponse(PathResult pathResult) { + if (pathResult == null || pathResult.routes() == null) { + return TransitRoutesResponse.builder() + .totalCount(0) + .routes(List.of()) + .build(); + } + + List top3 = selectTop3(pathResult); + List routeResponses = new ArrayList<>(); + + for (int i = 0; i < top3.size(); i++) { + RootResult route = top3.get(i); + routeResponses.add(toRouteResponse(route, i)); + } + + return TransitRoutesResponse.builder() + .totalCount(routeResponses.size()) + .routes(routeResponses) + .build(); + } + + /** + * 개별 경로 변환 + */ + private TransitRoutesResponse.RouteResponse toRouteResponse(RootResult route, int index) { + return TransitRoutesResponse.RouteResponse.builder() + .routeIndex(index) + .summary(toSummaryResponse(route)) + .distance(toSegmentResponses(route)) + .steps(toStepResponses(route)) + .build(); + } + + /** + * 요약 정보 생성 + */ + private TransitRoutesResponse.SummaryResponse toSummaryResponse(RootResult route) { + int totalMinutes = route.totalTime(); + int transferCount = countTransfers(route); + + return TransitRoutesResponse.SummaryResponse.builder() + .totalMinutes(totalMinutes) + .totalDistanceKm(Math.round(route.totalDistance() / 100.0) / 10.0) + .totalFareWon(route.totalPayment() > 0 ? route.totalPayment() : null) + .transferCount(transferCount) + .displayText(formatTime(totalMinutes)) + .build(); + } + + /** + * 환승 횟수 계산 (WALK 제외한 교통수단이 2개 이상이면 환승 발생) + */ + private int countTransfers(RootResult route) { + if (route == null || route.steps() == null) { + return 0; + } + + long transportCount = route.steps().stream() + .filter(s -> s.type() != RootResult.TransportType.WALK) + .count(); + + return (int) Math.max(0, transportCount - 1); + } + + /** + * Segments 생성 (색 막대용) + */ + private List toSegmentResponses(RootResult route) { + if (route == null || route.steps() == null) { + return List.of(); + } + + return route.steps().stream() + .filter(step -> step.time() > 0) // 0분인 구간은 제외 + .map(step -> { + ChipType type = mapType(step.type()); + String bgColorHex = extractBgColorHex(step, type); + + return TransitRoutesResponse.SegmentResponse.builder() + .type(step.type().name()) + .minutes(step.time()) + .minutesText(formatMinutes(step.time())) + .colorHex(bgColorHex) + .line(step.line()) + .build(); + }) + .toList(); + } + + /** + * Steps 생성 (색깔 + 승차/하차 통합) + */ + private List toStepResponses(RootResult route) { + if (route == null || route.steps() == null || route.steps().isEmpty()) { + return List.of(); + } + + List steps = new ArrayList<>(); + List distanceSteps = route.steps(); + + // WALK를 제외한 실제 교통수단 구간 + List transportSteps = distanceSteps.stream() + .filter(s -> s.type() != RootResult.TransportType.WALK) + .toList(); + + if (transportSteps.isEmpty()) { + // WALK만 있는 경로 (드문 케이스) + for (RootResult.DistanceStep step : distanceSteps) { + steps.add(createWalkStep(step, null)); + } + return assignStepIndexes(steps); + } + + // 1. DEPART (출발) 추가 + RootResult.DistanceStep firstTransport = transportSteps.get(0); + steps.add(createDepartStep(firstTransport.startName())); + + // 2. 전체 구간 순회하며 steps 생성 + int transportIndex = 0; + for (int i = 0; i < distanceSteps.size(); i++) { + RootResult.DistanceStep step = distanceSteps.get(i); + + if (step.type() == RootResult.TransportType.WALK) { + // WALK step 추가 (색상 포함) + steps.add(createWalkStep(step, ChipType.WALK)); + } else { + // 교통수단: BOARD + ALIGHT 추가 (색상 포함) + ChipType chipType = mapType(step.type()); + steps.add(createBoardStep(step, true, chipType)); + + // 다음이 WALK거나 마지막이면 하차 + boolean isLast = (transportIndex == transportSteps.size() - 1); + if (isLast || (i + 1 < distanceSteps.size() && distanceSteps.get(i + 1).type() == RootResult.TransportType.WALK)) { + steps.add(createAlightStep(step, true, chipType)); + } + + transportIndex++; + } + } + + // 3. ARRIVE (도착) 추가 + RootResult.DistanceStep lastTransport = transportSteps.get(transportSteps.size() - 1); + steps.add(createArriveStep(lastTransport.endName())); + + // 4. minutes가 0인 step 필터링 (DEPART/ARRIVE/ALIGHT는 null이므로 유지) + List filteredSteps = steps.stream() + .filter(step -> { + // minutes가 null이면 유지 (DEPART, ARRIVE, ALIGHT) + if (step.minutes() == null) { + return true; + } + // minutes가 0이면 제거, 0보다 크면 유지 + return step.minutes() > 0; + }) + .toList(); + + return assignStepIndexes(filteredSteps); + } + + /** + * DEPART step 생성 + */ + private TransitRoutesResponse.StepResponse createDepartStep(String stopName) { + return TransitRoutesResponse.StepResponse.builder() + .stepIndex(0) + .action(TransitRoutesResponse.StepAction.DEPART) + .type(null) + .stopName(stopName) + .primaryText(stopName) + .secondaryText("출발") + .minutes(null) + .colorHex(null) + .line(null) + .build(); + } + + /** + * WALK step 생성 + */ + private TransitRoutesResponse.StepResponse createWalkStep(RootResult.DistanceStep step, ChipType chipType) { + String colorHex = (chipType != null) ? chipType.defaultBg : ChipType.WALK.defaultBg; + + return TransitRoutesResponse.StepResponse.builder() + .stepIndex(0) + .action(TransitRoutesResponse.StepAction.WALK) + .type("WALK") + .stopName(null) + .primaryText("도보 이동") + .secondaryText("약 " + formatMinutes(step.time())) + .minutes(step.time()) + .colorHex(colorHex) + .line(null) + .build(); + } + + /** + * BOARD step 생성 (승차) + */ + private TransitRoutesResponse.StepResponse createBoardStep(RootResult.DistanceStep step, boolean isInferred, ChipType chipType) { + String stopType = getStopTypeSuffix(step.type()); + String shortLabel = shortenLineLabel(step.lineInfo()); + String secondaryText = step.lineInfo(); + + // 버스 노선 축약 + if (step.type() == RootResult.TransportType.BUS && step.lineInfo() != null) { + secondaryText = abbreviateBusNumbers(step.lineInfo()); + } + + // 색상 추출 + String colorHex = extractBgColorHex(step, chipType); + + return TransitRoutesResponse.StepResponse.builder() + .stepIndex(0) + .action(TransitRoutesResponse.StepAction.BOARD) + .type(step.type().name()) + .stopName(step.startName()) + .primaryText(step.startName() + stopType + " 승차") + .secondaryText(secondaryText) + .minutes(step.time()) + .colorHex(colorHex) + .line(step.line()) + .build(); + } + + /** + * ALIGHT step 생성 (하차) + */ + private TransitRoutesResponse.StepResponse createAlightStep(RootResult.DistanceStep step, boolean isInferred, ChipType chipType) { + String stopType = getStopTypeSuffix(step.type()); + String shortLabel = shortenLineLabel(step.lineInfo()); + + // 색상 추출 (ALIGHT는 해당 교통수단의 색상 유지) + String colorHex = extractBgColorHex(step, chipType); + + return TransitRoutesResponse.StepResponse.builder() + .stepIndex(0) + .action(TransitRoutesResponse.StepAction.ALIGHT) + .type(step.type().name()) + .stopName(step.endName()) + .primaryText(step.endName() + stopType + " 하차") + .secondaryText(step.lineInfo()) + .minutes(null) + .colorHex(colorHex) + .line(step.line()) + .build(); + } + + /** + * ARRIVE step 생성 + */ + private TransitRoutesResponse.StepResponse createArriveStep(String stopName) { + return TransitRoutesResponse.StepResponse.builder() + .stepIndex(0) + .action(TransitRoutesResponse.StepAction.ARRIVE) + .type(null) + .stopName(stopName) + .primaryText(stopName) + .secondaryText("도착") + .minutes(null) + .colorHex(null) + .line(null) + .build(); + } + + /** + * Step 인덱스 부여 + */ + private List assignStepIndexes(List steps) { + List result = new ArrayList<>(); + for (int i = 0; i < steps.size(); i++) { + TransitRoutesResponse.StepResponse original = steps.get(i); + result.add(TransitRoutesResponse.StepResponse.builder() + .stepIndex(i) + .action(original.action()) + .type(original.type()) + .stopName(original.stopName()) + .primaryText(original.primaryText()) + .secondaryText(original.secondaryText()) + .minutes(original.minutes()) + .colorHex(original.colorHex()) + .line(original.line()) + .build()); + } + return result; + } + + /** + * 정류장/역 접미어 반환 + */ + private String getStopTypeSuffix(RootResult.TransportType type) { + if (type == RootResult.TransportType.SUBWAY || type == RootResult.TransportType.TRAIN) { + return "역"; + } else if (type == RootResult.TransportType.BUS) { + return "정류장"; + } + return ""; + } + + /** + * 노선명 축약 + */ + private String shortenLineLabel(String label) { + if (label == null) return null; + return label.replace("수도권 ", "").replace("호선", "호선"); + } + + /** + * 버스 번호 축약 + */ + private String abbreviateBusNumbers(String busNumbers) { + if (busNumbers == null) return null; + String[] numbers = busNumbers.split(",\\s*"); + if (numbers.length <= 3) { + return busNumbers + "번"; + } + String first3 = String.join(", ", numbers[0], numbers[1], numbers[2]); + int remaining = numbers.length - 3; + return first3 + "번 외 " + remaining + "개"; + } + + /** + * 시간 포맷팅 + */ + private String formatTime(int totalMinutes) { + if (totalMinutes <= 0) { + return "0분"; + } + + if (totalMinutes < 60) { + return totalMinutes + "분"; + } + + int hours = totalMinutes / 60; + int minutes = totalMinutes % 60; + + if (minutes == 0) { + return hours + "시간"; + } + + return hours + "시간 " + minutes + "분"; + } } diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/ComplexApi.java b/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/ComplexApi.java index 3a088d5..ea0860e 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/ComplexApi.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/ComplexApi.java @@ -3,6 +3,7 @@ import com.pinHouse.server.core.aop.CheckLogin; import com.pinHouse.server.core.response.response.ApiResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.DistanceResponse; +import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.UnitTypeResponse; import com.pinHouse.server.platform.housing.complex.application.usecase.ComplexUseCase; import com.pinHouse.server.platform.housing.complex.application.dto.response.ComplexDetailResponse; @@ -68,14 +69,14 @@ public ApiResponse> getComplexUnitTypes( return ApiResponse.ok(response); } - /// 대중교통 시뮬레이터 + /// 대중교통 시뮬레이터 (새 스키마 - 3개 경로 한 번에) @GetMapping("/transit/{complexId}") - public ApiResponse> distance( + public ApiResponse distance( @PathVariable String complexId, @RequestParam String pinPointId) throws UnsupportedEncodingException { - /// 서비스 호출 - var response = service.getDistance(complexId, pinPointId); + /// 서비스 호출 (새 스키마) + var response = service.getDistanceV2(complexId, pinPointId); /// 리턴 return ApiResponse.ok(response); diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/swagger/ComplexApiSpec.java b/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/swagger/ComplexApiSpec.java index fd3f23b..d1abb7d 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/swagger/ComplexApiSpec.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/presentation/swagger/ComplexApiSpec.java @@ -4,6 +4,7 @@ import com.pinHouse.server.platform.housing.complex.application.dto.response.ComplexDetailResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.DepositResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.DistanceResponse; +import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.UnitTypeResponse; import com.pinHouse.server.platform.like.application.dto.UnityTypeLikeResponse; import com.pinHouse.server.security.oauth2.domain.PrincipalDetails; @@ -26,7 +27,7 @@ public interface ComplexApiSpec { description = "임대주택 ID로 상세 조회하는 API 입니다." ) ApiResponse getComplex( - @Parameter(example = "19231#37", description = "임대주택 ID") + @Parameter(example = "19413#1", description = "임대주택 ID") @PathVariable String complexId, @Parameter(example = "fec9aba3-0fd9-4b75-bebf-9cb7641fd251", description = "핀포인트 ID") @@ -38,7 +39,7 @@ ApiResponse getComplex( description = "임대주택 ID로 방 타입을 상세 조회하는 API 입니다. 로그인한 사용자의 경우 좋아요 정보가 포함됩니다." ) ApiResponse> getComplexUnitTypes( - @Parameter(example = "19231#37", description = "임대주택 ID") + @Parameter(example = "19413#1", description = "임대주택 ID") @PathVariable String complexId, @AuthenticationPrincipal PrincipalDetails principalDetails ); @@ -52,12 +53,12 @@ ApiResponse> getLikeComplexes( @AuthenticationPrincipal PrincipalDetails principalDetails ); - /// 거리 시뮬레이터 + /// 거리 시뮬레이터 (새 스키마) @Operation( - summary = "거리 시뮬레이터 API", - description = "임대주택 ID와 핀포인트 ID를 통해 계산을 진행합니다.") - ApiResponse> distance( - @Parameter(example = "19207#1", description = "시도 간 조회") + summary = "거리 시뮬레이터 API (v2)", + description = "임대주택 ID와 핀포인트 ID를 통해 대중교통 경로 3개를 한 번에 조회합니다. 승차/하차 정보가 명확하게 표시됩니다.") + ApiResponse distance( + @Parameter(example = "19413#1", description = "시도 간 조회") @PathVariable String complexId, @Parameter(example = "fec9aba3-0fd9-4b75-bebf-9cb7641fd251", description = "핀포인트 ID") @RequestParam String pinPointId) throws UnsupportedEncodingException; diff --git a/src/main/java/com/pinHouse/server/platform/housing/facility/presentation/swagger/FacilityApiSpec.java b/src/main/java/com/pinHouse/server/platform/housing/facility/presentation/swagger/FacilityApiSpec.java index dd5f74f..a443896 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/facility/presentation/swagger/FacilityApiSpec.java +++ b/src/main/java/com/pinHouse/server/platform/housing/facility/presentation/swagger/FacilityApiSpec.java @@ -21,7 +21,7 @@ public interface FacilityApiSpec { description = "공고 주변 3KM내 존재하는 인프라를 확인하는 API입니다." ) ApiResponse showNotice( - @Parameter(example = "19231#37") + @Parameter(example = "19413#1") @PathVariable String complexId);