From 7a2d6cd42443e525275912618ed852a4915a695d Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Thu, 30 Jan 2025 23:53:26 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[UNI-71]feat=20:=20=EB=91=90=20=EB=85=B8?= =?UTF-8?q?=EB=93=9C=EC=9D=98=20=EC=A2=8C=ED=91=9C=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=ED=8A=B9=EC=A0=95=20=EA=B0=84=EC=84=A0=EC=9D=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EC=97=AC=20=EC=9C=84=ED=97=98/?= =?UTF-8?q?=EC=A3=BC=EC=9D=98=EC=9A=94=EC=86=8C=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20API=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/common/error/ErrorCode.java | 3 ++ .../custom/RouteNotFoundException.java | 10 +++++++ .../route/controller/RouteApi.java | 12 ++++++++ .../route/controller/RouteController.java | 16 +++++++++-- .../route/dto/GetRiskResDTO.java | 28 +++++++++++++++++++ .../route/repository/RouteRepository.java | 20 +++++++++++++ .../route/service/RouteService.java | 20 ++++++++++--- 7 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/RouteNotFoundException.java create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/GetRiskResDTO.java diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java index d28b618..bdd6bbb 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java @@ -12,6 +12,9 @@ public enum ErrorCode { FASTEST_ROUTE_NOT_FOUND(422, "경로가 없습니다."), SAME_START_AND_END_POINT(400, "출발지와 도착지가 같습니다."), + // 루트 + ROUTE_NOT_FOUND(404, "루트를 찾을 수 없습니다."), + // 건물 노드 BUILDING_NOT_FOUND(404, "유효한 건물을 찾을 수 없습니다."), ; diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/RouteNotFoundException.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/RouteNotFoundException.java new file mode 100644 index 0000000..a7efd57 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/RouteNotFoundException.java @@ -0,0 +1,10 @@ +package com.softeer5.uniro_backend.common.exception.custom; + +import com.softeer5.uniro_backend.common.error.ErrorCode; +import com.softeer5.uniro_backend.common.exception.CustomException; + +public class RouteNotFoundException extends CustomException { + public RouteNotFoundException(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java index 11750c6..e1521aa 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java @@ -2,6 +2,7 @@ import com.softeer5.uniro_backend.route.dto.FastestRouteResDTO; import com.softeer5.uniro_backend.route.dto.GetAllRoutesResDTO; +import com.softeer5.uniro_backend.route.dto.GetRiskResDTO; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; @@ -33,6 +34,17 @@ public interface RouteApi { }) ResponseEntity getRiskRoutes(@PathVariable("univId") Long univId); + @Operation(summary = "단일 route의 위험&주의 요소 조회") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "단일 route의 위험&주의 요소 조회 성공"), + @ApiResponse(responseCode = "400", description = "EXCEPTION(임시)", content = @Content), + }) + ResponseEntity getRisk(@PathVariable("univId") Long univId, + @RequestParam(value = "start-lat") double startLat, + @RequestParam(value = "start-lng") double startLng, + @RequestParam(value = "end-lat") double endLat, + @RequestParam(value = "end-lng") double endLng); + @Operation(summary = "빠른 길 계산") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "빠른 길 계산 성공"), diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java index 07644fa..d716628 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java @@ -2,6 +2,7 @@ import com.softeer5.uniro_backend.route.dto.FastestRouteResDTO; import com.softeer5.uniro_backend.route.dto.GetAllRoutesResDTO; +import com.softeer5.uniro_backend.route.dto.GetRiskResDTO; import com.softeer5.uniro_backend.route.service.RouteCalculationService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -37,11 +38,22 @@ public ResponseEntity getRiskRoutes(@PathVariable("univId") return ResponseEntity.ok().body(riskRoutes); } + @Override + @GetMapping("/{univId}/route/risk") + public ResponseEntity getRisk(@PathVariable("univId") Long univId, + @RequestParam(value = "start-lat") double startLat, + @RequestParam(value = "start-lng") double startLng, + @RequestParam(value = "end-lat") double endLat, + @RequestParam(value = "end-lng") double endLng){ + GetRiskResDTO riskResDTO = routeService.getRisk(univId,startLat,startLng,endLat,endLng); + return ResponseEntity.ok().body(riskResDTO); + } + @Override @GetMapping("/{univId}/routes/fastest") public ResponseEntity calculateFastestRoute(@PathVariable("univId") Long univId, - @RequestParam Long startNodeId, - @RequestParam Long endNodeId) { + @RequestParam(value = "start-node-id") Long startNodeId, + @RequestParam(value = "end-node-id") Long endNodeId) { FastestRouteResDTO fastestRouteResDTO = routeCalculationService.calculateFastestRoute(univId, startNodeId, endNodeId); return ResponseEntity.ok(fastestRouteResDTO); } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/GetRiskResDTO.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/GetRiskResDTO.java new file mode 100644 index 0000000..5f188d5 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/GetRiskResDTO.java @@ -0,0 +1,28 @@ +package com.softeer5.uniro_backend.route.dto; + +import com.softeer5.uniro_backend.route.entity.CautionType; +import com.softeer5.uniro_backend.route.entity.DangerType; +import com.softeer5.uniro_backend.route.entity.Route; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@Getter +@Schema(name = "GetAllRoutesResDTO", description = "특정 간선의 주의/위험요소 조회 DTO") +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class GetRiskResDTO { + @Schema(description = "route ID", example = "3") + private final Long routeId; + @Schema(description = "위험 요소 타입 리스트", example = "[\"SLOPE\", \"STAIRS\"]") + private final List cautionTypes; + @Schema(description = "위험 요소 타입 리스트", example = "[\"SLOPE\", \"STAIRS\"]") + private final List dangerTypes; + + public static GetRiskResDTO of(Route route) { + return new GetRiskResDTO(route.getId(),route.getCautionFactorsByList(), route.getDangerFactorsByList()); + } + +} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java index fe442d9..6b8f62d 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java @@ -1,6 +1,7 @@ package com.softeer5.uniro_backend.route.repository; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; @@ -26,4 +27,23 @@ public interface RouteRepository extends JpaRepository { ) List findRiskRouteByUnivIdWithNode(@Param("univId") Long univId); + @Query(value = """ + SELECT r.* FROM route r + JOIN node n1 ON r.node1_id = n1.id + JOIN node n2 ON r.node2_id = n2.id + WHERE r.univ_id = :univId + AND ( + (ST_Equals(n1.coordinates, ST_SRID(ST_GeomFromText(:point1), 4326)) + AND ST_Equals(n2.coordinates, ST_SRID(ST_GeomFromText(:point2), 4326))) + OR + (ST_Equals(n1.coordinates, ST_SRID(ST_GeomFromText(:point2), 4326)) + AND ST_Equals(n2.coordinates, ST_SRID(ST_GeomFromText(:point1), 4326))) + ) + """, nativeQuery = true) + Optional findRouteByPointsAndUnivId( + @Param("univId") Long univId, + @Param("point1") String point1, + @Param("point2") String point2 + ); + } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index c856a30..4e08c6a 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -2,15 +2,15 @@ import java.util.List; -import com.softeer5.uniro_backend.route.dto.GetAllRoutesResDTO; +import com.softeer5.uniro_backend.common.error.ErrorCode; +import com.softeer5.uniro_backend.common.exception.custom.RouteNotFoundException; +import com.softeer5.uniro_backend.common.utils.Utils; +import com.softeer5.uniro_backend.route.dto.*; import com.softeer5.uniro_backend.route.entity.CoreRoute; import com.softeer5.uniro_backend.route.repository.CoreRouteRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.softeer5.uniro_backend.route.dto.GetCautionResDTO; -import com.softeer5.uniro_backend.route.dto.GetDangerResDTO; -import com.softeer5.uniro_backend.route.dto.GetRiskRoutesResDTO; import com.softeer5.uniro_backend.route.entity.Route; import com.softeer5.uniro_backend.route.repository.RouteRepository; @@ -59,4 +59,16 @@ private List mapRoutesToCautionDTO(List routes) { route.getCautionFactors().stream().toList() )).toList(); } + + + public GetRiskResDTO getRisk(Long univId, double startLat, double startLng, double endLat, double endLng) { + String startWTK = Utils.convertDoubleToWTK(startLat, startLng); + String endWTK = Utils.convertDoubleToWTK(endLat, endLng); + + Route route = routeRepository.findRouteByPointsAndUnivId(univId, startWTK ,endWTK) + .orElseThrow(() -> new RouteNotFoundException("Route Not Found", ErrorCode.ROUTE_NOT_FOUND)); + + return GetRiskResDTO.of(route); + } + } From 9d85e7c15e43bdc1b2f8f125daf3da7876238f94 Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Thu, 30 Jan 2025 23:58:45 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[UNI-71]=20feat=20:=20Utils=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20double=ED=98=95=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=EB=A5=BC=20Point=20=EB=98=90=EB=8A=94=20WTK=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20static=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/common/utils/Utils.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java new file mode 100644 index 0000000..583ac96 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java @@ -0,0 +1,22 @@ +package com.softeer5.uniro_backend.common.utils; + +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; + +public final class Utils { + private static final GeometryFactory geometryFactory = new GeometryFactory(); + + private Utils(){ + // 인스턴스화 방지 + } + + public static Point convertDoubleToPoint(double lat, double lng) { + return geometryFactory.createPoint(new Coordinate(lat, lng)); + } + + public static String convertDoubleToWTK(double lat, double lng) { + return String.format("POINT(%f %f)", lat, lng); + } + +} From 401093e22ea075657253cf5b7c651633d4d345de Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 00:01:23 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[UNI-71]=20feat=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EC=9D=84=20=EC=A4=84=EC=9D=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20Route=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EC=97=90=20Set=20=EC=9E=90=EB=A3=8C=EA=B5=AC=EC=A1=B0=EB=A5=BC?= =?UTF-8?q?=20List=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20&=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EC=97=90=EB=8F=84=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/softeer5/uniro_backend/route/entity/Route.java | 10 ++++++++++ .../uniro_backend/route/service/RouteService.java | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java index 31e6620..cf79c32 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java @@ -2,6 +2,7 @@ import static jakarta.persistence.FetchType.*; +import java.util.List; import java.util.Set; import com.softeer5.uniro_backend.resolver.CautionListConverter; @@ -59,4 +60,13 @@ public class Route { @Convert(converter = DangerListConverter.class) @Column(name = "danger_factors") private Set dangerFactors; + + public List getCautionFactorsByList(){ + return cautionFactors.stream().toList(); + } + + public List getDangerFactorsByList(){ + return dangerFactors.stream().toList(); + } + } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index 4e08c6a..2f3b1c2 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -45,7 +45,7 @@ private List mapRoutesToDangerDTO(List routes) { route.getNode1(), route.getNode2(), route.getId(), - route.getDangerFactors().stream().toList() + route.getDangerFactorsByList() )).toList(); } @@ -56,7 +56,7 @@ private List mapRoutesToCautionDTO(List routes) { route.getNode1(), route.getNode2(), route.getId(), - route.getCautionFactors().stream().toList() + route.getCautionFactorsByList() )).toList(); } From 958fe3b7818500b6888ea645cbbaf4a0f5b4cd32 Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 09:50:37 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[UNI-59]=20feat=20:=20=EC=B6=94=ED=9B=84=20?= =?UTF-8?q?route=20=ED=85=8C=EC=9D=B4=EB=B8=94=EC=9D=98=20LineString?= =?UTF-8?q?=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=98=80=EC=9D=84=20?= =?UTF-8?q?=EB=95=8C=20=EC=84=B1=EB=8A=A5=EB=B9=84=EA=B5=90=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?(LineString=20=EC=82=AC=EC=9A=A9=EB=B2=84=EC=A0=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/common/utils/Utils.java | 25 +++++++++++++++++- .../route/repository/RouteRepository.java | 21 ++++++++++++--- .../route/service/RouteService.java | 26 ++++++++++++++++--- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java index 583ac96..17be94d 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/utils/Utils.java @@ -2,7 +2,11 @@ import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.Point; +import org.locationtech.jts.io.WKTWriter; + +import java.util.List; public final class Utils { private static final GeometryFactory geometryFactory = new GeometryFactory(); @@ -15,8 +19,27 @@ public static Point convertDoubleToPoint(double lat, double lng) { return geometryFactory.createPoint(new Coordinate(lat, lng)); } - public static String convertDoubleToWTK(double lat, double lng) { + public static String convertDoubleToPointWTK(double lat, double lng) { return String.format("POINT(%f %f)", lat, lng); } + public static LineString convertDoubleToLineString(List co){ + if(co==null || co.isEmpty()){ + throw new IllegalArgumentException("coordinates can not be null or empty"); + } + + Coordinate[] coordinates = new Coordinate[co.size()]; + for (int i = 0; i < co.size(); i++) { + coordinates[i] = new Coordinate(co.get(i)[0], co.get(i)[1]); + } + + return geometryFactory.createLineString(coordinates); + } + + public static String convertDoubleToLineStringWTK(List co){ + LineString lineString = convertDoubleToLineString(co); + WKTWriter writer = new WKTWriter(); + return writer.write(lineString); + } + } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java index 6b8f62d..200ea99 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java @@ -33,11 +33,11 @@ public interface RouteRepository extends JpaRepository { JOIN node n2 ON r.node2_id = n2.id WHERE r.univ_id = :univId AND ( - (ST_Equals(n1.coordinates, ST_SRID(ST_GeomFromText(:point1), 4326)) - AND ST_Equals(n2.coordinates, ST_SRID(ST_GeomFromText(:point2), 4326))) + (n1.coordinates = ST_SRID(ST_GeomFromText(:point1), 4326) + AND n2.coordinates = ST_SRID(ST_GeomFromText(:point2), 4326)) OR - (ST_Equals(n1.coordinates, ST_SRID(ST_GeomFromText(:point2), 4326)) - AND ST_Equals(n2.coordinates, ST_SRID(ST_GeomFromText(:point1), 4326))) + (n1.coordinates = ST_SRID(ST_GeomFromText(:point2), 4326) + AND n2.coordinates = ST_SRID(ST_GeomFromText(:point1), 4326)) ) """, nativeQuery = true) Optional findRouteByPointsAndUnivId( @@ -46,4 +46,17 @@ Optional findRouteByPointsAndUnivId( @Param("point2") String point2 ); + @Query(value = """ + SELECT r.* FROM route r + WHERE r.univ_id = :univId + AND ( + r.path = ST_SRID(ST_GeomFromText(:path), 4326) + OR + r.path = ST_SRID(ST_GeomFromText(:rev_path), 4326) + ) +""", nativeQuery = true) + Optional findRouteByLineStringAndUnivId(@Param("univId") Long univId, + @Param("path")String path, + @Param("rev_path")String revPath); + } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index 2f3b1c2..328efc8 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -1,5 +1,7 @@ package com.softeer5.uniro_backend.route.service; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import com.softeer5.uniro_backend.common.error.ErrorCode; @@ -62,13 +64,29 @@ private List mapRoutesToCautionDTO(List routes) { public GetRiskResDTO getRisk(Long univId, double startLat, double startLng, double endLat, double endLng) { - String startWTK = Utils.convertDoubleToWTK(startLat, startLng); - String endWTK = Utils.convertDoubleToWTK(endLat, endLng); + String startWTK = Utils.convertDoubleToPointWTK(startLat, startLng); + String endWTK = Utils.convertDoubleToPointWTK(endLat, endLng); - Route route = routeRepository.findRouteByPointsAndUnivId(univId, startWTK ,endWTK) + Route routeWithJoin = routeRepository.findRouteByPointsAndUnivId(univId, startWTK ,endWTK) .orElseThrow(() -> new RouteNotFoundException("Route Not Found", ErrorCode.ROUTE_NOT_FOUND)); - return GetRiskResDTO.of(route); + /* + // LineString 사용버전 + List coordinates = Arrays.asList( + new double[]{startLat, startLng}, + new double[]{endLat, endLng} + ); + String lineStringWTK = Utils.convertDoubleToLineStringWTK(coordinates); + Collections.reverse(coordinates); + String reverseLineStringWTK = Utils.convertDoubleToLineStringWTK(coordinates); + + Route routeWithoutJoin = routeRepository.findRouteByLineStringAndUnivId(univId,lineStringWTK,reverseLineStringWTK) + .orElseThrow(() -> new RouteNotFoundException("Route Not Found", ErrorCode.ROUTE_NOT_FOUND)); + + */ + + + return GetRiskResDTO.of(routeWithJoin); } } From 95b61663529736dddccda668b4a6585ac625324b Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 15:56:49 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[UNI-72]=20feat=20:=20=EC=A3=BC=EC=9D=98/?= =?UTF-8?q?=EC=9C=84=ED=97=98=EC=9A=94=20=EC=A0=9C=EB=B3=B4=20API=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/common/error/ErrorCode.java | 1 + .../DangerCautionConflictException.java | 10 ++++++++++ .../route/controller/RouteApi.java | 16 +++++++++++----- .../route/controller/RouteController.java | 19 +++++++++++-------- .../route/dto/PostRiskReqDTO.java | 15 +++++++++++++++ .../uniro_backend/route/entity/Route.java | 10 ++++++++++ .../route/service/RouteService.java | 15 +++++++++++++-- 7 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/DangerCautionConflictException.java create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/PostRiskReqDTO.java diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java index bdd6bbb..f97e66d 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/error/ErrorCode.java @@ -14,6 +14,7 @@ public enum ErrorCode { // 루트 ROUTE_NOT_FOUND(404, "루트를 찾을 수 없습니다."), + CAUTION_DANGER_CANT_EXIST_SIMULTANEOUSLY(400, "위험요소와 주의요소는 동시에 존재할 수 없습니다."), // 건물 노드 BUILDING_NOT_FOUND(404, "유효한 건물을 찾을 수 없습니다."), diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/DangerCautionConflictException.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/DangerCautionConflictException.java new file mode 100644 index 0000000..c2bd504 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/exception/custom/DangerCautionConflictException.java @@ -0,0 +1,10 @@ +package com.softeer5.uniro_backend.common.exception.custom; + +import com.softeer5.uniro_backend.common.error.ErrorCode; +import com.softeer5.uniro_backend.common.exception.CustomException; + +public class DangerCautionConflictException extends CustomException { + public DangerCautionConflictException(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java index e1521aa..bdd6107 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java @@ -1,18 +1,15 @@ package com.softeer5.uniro_backend.route.controller; -import com.softeer5.uniro_backend.route.dto.FastestRouteResDTO; -import com.softeer5.uniro_backend.route.dto.GetAllRoutesResDTO; -import com.softeer5.uniro_backend.route.dto.GetRiskResDTO; +import com.softeer5.uniro_backend.route.dto.*; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; -import com.softeer5.uniro_backend.route.dto.GetRiskRoutesResDTO; - import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -45,6 +42,15 @@ ResponseEntity getRisk(@PathVariable("univId") Long univId, @RequestParam(value = "end-lat") double endLat, @RequestParam(value = "end-lng") double endLng); + @Operation(summary = "위험&주의 요소 제보") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "단일 route의 위험&주의 요소 제보 성공"), + @ApiResponse(responseCode = "400", description = "EXCEPTION(임시)", content = @Content), + }) + ResponseEntity postRisk(@PathVariable("univId") Long univId, + @PathVariable("routeId") Long routeId, + @RequestBody PostRiskReqDTO postRiskReqDTO); + @Operation(summary = "빠른 길 계산") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "빠른 길 계산 성공"), diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java index d716628..2a181d1 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java @@ -1,16 +1,10 @@ package com.softeer5.uniro_backend.route.controller; -import com.softeer5.uniro_backend.route.dto.FastestRouteResDTO; -import com.softeer5.uniro_backend.route.dto.GetAllRoutesResDTO; -import com.softeer5.uniro_backend.route.dto.GetRiskResDTO; +import com.softeer5.uniro_backend.route.dto.*; import com.softeer5.uniro_backend.route.service.RouteCalculationService; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import com.softeer5.uniro_backend.route.dto.GetRiskRoutesResDTO; import com.softeer5.uniro_backend.route.service.RouteService; import lombok.RequiredArgsConstructor; @@ -49,6 +43,15 @@ public ResponseEntity getRisk(@PathVariable("univId") Long univId return ResponseEntity.ok().body(riskResDTO); } + @Override + @PostMapping("/{univId}/route/risk/{routeId}") + public ResponseEntity postRisk (@PathVariable("univId") Long univId, + @PathVariable("routeId") Long routeId, + @RequestBody PostRiskReqDTO postRiskReqDTO){ + routeService.postRisk(univId,routeId,postRiskReqDTO); + return ResponseEntity.ok().build(); + } + @Override @GetMapping("/{univId}/routes/fastest") public ResponseEntity calculateFastestRoute(@PathVariable("univId") Long univId, diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/PostRiskReqDTO.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/PostRiskReqDTO.java new file mode 100644 index 0000000..2ec52d7 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/dto/PostRiskReqDTO.java @@ -0,0 +1,15 @@ +package com.softeer5.uniro_backend.route.dto; + +import com.softeer5.uniro_backend.route.entity.CautionType; +import com.softeer5.uniro_backend.route.entity.DangerType; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class PostRiskReqDTO { + private List cautionTypes; + private List dangerTypes; +} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java index cf79c32..bc7e727 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/entity/Route.java @@ -69,4 +69,14 @@ public List getDangerFactorsByList(){ return dangerFactors.stream().toList(); } + public void setCautionFactors(List cautionFactors) { + this.cautionFactors.clear(); + this.cautionFactors.addAll(cautionFactors); + } + + public void setDangerFactors(List dangerFactors) { + this.dangerFactors.clear(); + this.dangerFactors.addAll(dangerFactors); + } + } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index 328efc8..e50b79b 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -1,10 +1,9 @@ package com.softeer5.uniro_backend.route.service; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import com.softeer5.uniro_backend.common.error.ErrorCode; +import com.softeer5.uniro_backend.common.exception.custom.DangerCautionConflictException; import com.softeer5.uniro_backend.common.exception.custom.RouteNotFoundException; import com.softeer5.uniro_backend.common.utils.Utils; import com.softeer5.uniro_backend.route.dto.*; @@ -89,4 +88,16 @@ public GetRiskResDTO getRisk(Long univId, double startLat, double startLng, doub return GetRiskResDTO.of(routeWithJoin); } + public void postRisk(Long univId, Long routeId, PostRiskReqDTO postRiskReqDTO) { + Route route = routeRepository.findByIdAndUnivId(univId,routeId) + .orElseThrow(() -> new RouteNotFoundException("Route not Found", ErrorCode.ROUTE_NOT_FOUND)); + + if(!postRiskReqDTO.getCautionTypes().isEmpty() && !postRiskReqDTO.getDangerTypes().isEmpty()){ + throw new DangerCautionConflictException("DangerFactors and CautionFactors can't exist simultaneously.", + ErrorCode.CAUTION_DANGER_CANT_EXIST_SIMULTANEOUSLY); + } + + route.setCautionFactors(postRiskReqDTO.getCautionTypes()); + route.setDangerFactors(postRiskReqDTO.getDangerTypes()); + } } From 77aa791855baeac82ef597316183eff446d20ee1 Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 15:58:12 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[UNI-72]=20feat=20:=20=EC=A3=BC=EC=9D=98/?= =?UTF-8?q?=EC=9C=84=ED=97=98=EC=9A=94=20=EC=A0=9C=EB=B3=B4=20API=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=20-=20Repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/route/repository/RouteRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java index 200ea99..695a373 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/repository/RouteRepository.java @@ -59,4 +59,6 @@ Optional findRouteByLineStringAndUnivId(@Param("univId") Long univId, @Param("path")String path, @Param("rev_path")String revPath); + Optional findByIdAndUnivId (Long id, Long univId); + } From e42eac19eb0f4d3cfc96bae03ceacce135d9c4e5 Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 16:20:14 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[UNI-72]=20refactor=20:=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A4=91=20=EB=B0=9C=EC=83=9D=ED=95=9C=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/softeer5/uniro_backend/route/service/RouteService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index e50b79b..1a6c3fe 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -88,8 +88,9 @@ public GetRiskResDTO getRisk(Long univId, double startLat, double startLng, doub return GetRiskResDTO.of(routeWithJoin); } + @Transactional public void postRisk(Long univId, Long routeId, PostRiskReqDTO postRiskReqDTO) { - Route route = routeRepository.findByIdAndUnivId(univId,routeId) + Route route = routeRepository.findByIdAndUnivId(routeId, univId) .orElseThrow(() -> new RouteNotFoundException("Route not Found", ErrorCode.ROUTE_NOT_FOUND)); if(!postRiskReqDTO.getCautionTypes().isEmpty() && !postRiskReqDTO.getDangerTypes().isEmpty()){ From f8ac523ca7a423f1231180d88c732809c8046327 Mon Sep 17 00:00:00 2001 From: songhyeonseong Date: Fri, 31 Jan 2025 16:50:09 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[UNI-18]=20chore=20:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20(=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softeer5/uniro_backend/route/controller/RouteApi.java | 2 +- .../uniro_backend/route/controller/RouteController.java | 6 +++--- .../softeer5/uniro_backend/route/service/RouteService.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java index bdd6107..7e370c5 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteApi.java @@ -47,7 +47,7 @@ ResponseEntity getRisk(@PathVariable("univId") Long univId, @ApiResponse(responseCode = "200", description = "단일 route의 위험&주의 요소 제보 성공"), @ApiResponse(responseCode = "400", description = "EXCEPTION(임시)", content = @Content), }) - ResponseEntity postRisk(@PathVariable("univId") Long univId, + ResponseEntity updateRisk(@PathVariable("univId") Long univId, @PathVariable("routeId") Long routeId, @RequestBody PostRiskReqDTO postRiskReqDTO); diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java index 2a181d1..94fbdab 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/controller/RouteController.java @@ -21,7 +21,7 @@ public class RouteController implements RouteApi { @Override @GetMapping("/{univId}/routes") public ResponseEntity> getAllRoutesAndNodes(@PathVariable("univId") Long univId){ - List allRoutes = routeService.GetAllRoutes(univId); + List allRoutes = routeService.getAllRoutes(univId); return ResponseEntity.ok().body(allRoutes); } @@ -45,10 +45,10 @@ public ResponseEntity getRisk(@PathVariable("univId") Long univId @Override @PostMapping("/{univId}/route/risk/{routeId}") - public ResponseEntity postRisk (@PathVariable("univId") Long univId, + public ResponseEntity updateRisk (@PathVariable("univId") Long univId, @PathVariable("routeId") Long routeId, @RequestBody PostRiskReqDTO postRiskReqDTO){ - routeService.postRisk(univId,routeId,postRiskReqDTO); + routeService.updateRisk(univId,routeId,postRiskReqDTO); return ResponseEntity.ok().build(); } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java index 1a6c3fe..6c8ae2c 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/route/service/RouteService.java @@ -25,7 +25,7 @@ public class RouteService { private final CoreRouteRepository coreRouteRepository; - public List GetAllRoutes(Long univId) { + public List getAllRoutes(Long univId) { List coreRoutes = coreRouteRepository.findByUnivId(univId); return coreRoutes.stream().map(GetAllRoutesResDTO::of).toList(); } @@ -89,7 +89,7 @@ public GetRiskResDTO getRisk(Long univId, double startLat, double startLng, doub } @Transactional - public void postRisk(Long univId, Long routeId, PostRiskReqDTO postRiskReqDTO) { + public void updateRisk(Long univId, Long routeId, PostRiskReqDTO postRiskReqDTO) { Route route = routeRepository.findByIdAndUnivId(routeId, univId) .orElseThrow(() -> new RouteNotFoundException("Route not Found", ErrorCode.ROUTE_NOT_FOUND));