diff --git a/src/main/java/com/aolda/itda/controller/forwarding/ForwardingController.java b/src/main/java/com/aolda/itda/controller/forwarding/ForwardingController.java index 36e6f9a8138da9fee0f76d6028770260d9fb5679..999707aed33a9f559d2c396c6532df50aada5173 100644 --- a/src/main/java/com/aolda/itda/controller/forwarding/ForwardingController.java +++ b/src/main/java/com/aolda/itda/controller/forwarding/ForwardingController.java @@ -30,8 +30,9 @@ public class ForwardingController { } @GetMapping("/forwardings") - public ResponseEntity<Object> lists(@RequestParam String projectId) { - return ResponseEntity.ok(forwardingService.getForwardings(projectId)); + public ResponseEntity<Object> lists(@RequestParam String projectId, + @RequestParam(required = false) String query) { + return ResponseEntity.ok(forwardingService.getForwardingsWithSearch(projectId, query)); } @PatchMapping("/forwarding") diff --git a/src/main/java/com/aolda/itda/controller/routing/RoutingController.java b/src/main/java/com/aolda/itda/controller/routing/RoutingController.java index 4b9d551ada34e56464d8b95e1577adff3f456d36..c96e9106937f891a66aa19b03d4278b61bb824ae 100644 --- a/src/main/java/com/aolda/itda/controller/routing/RoutingController.java +++ b/src/main/java/com/aolda/itda/controller/routing/RoutingController.java @@ -31,8 +31,9 @@ public class RoutingController { } @GetMapping("/routings") - public ResponseEntity<Object> lists(@RequestParam String projectId) { - return ResponseEntity.ok(routingService.getRoutings(projectId)); + public ResponseEntity<Object> lists(@RequestParam String projectId, + @RequestParam(required = false) String query) { + return ResponseEntity.ok(routingService.getRoutingsWithSearch(projectId, query)); } @PatchMapping("/routing") diff --git a/src/main/java/com/aolda/itda/repository/forwarding/ForwardingRepository.java b/src/main/java/com/aolda/itda/repository/forwarding/ForwardingRepository.java index c461762a59bc4cce3ca6fbde0f1de3277a4d7293..9a330f0dbc0fe111dd99aed57e29a960ff9f5031 100644 --- a/src/main/java/com/aolda/itda/repository/forwarding/ForwardingRepository.java +++ b/src/main/java/com/aolda/itda/repository/forwarding/ForwardingRepository.java @@ -2,6 +2,7 @@ package com.aolda.itda.repository.forwarding; import com.aolda.itda.entity.forwarding.Forwarding; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Optional; @@ -11,4 +12,7 @@ public interface ForwardingRepository extends JpaRepository<Forwarding, Long> { Optional<Forwarding> findByForwardingIdAndIsDeleted(Long forwardingId, Boolean isDeleted); Boolean existsByInstanceIpAndInstancePortAndIsDeleted(String instanceIp, String instancePort, Boolean isDeleted); Boolean existsByServerPortAndIsDeleted(String serverPort, Boolean isDeleted); + + @Query("SELECT f FROM Forwarding f WHERE f.projectId = ?1 AND f.isDeleted = ?3 AND (f.instanceIp LIKE %?2% OR f.serverPort LIKE %?2% OR f.name LIKE %?2%)") + List<Forwarding> findWithSearch(String projectId, String query, Boolean isDeleted); } diff --git a/src/main/java/com/aolda/itda/repository/routing/RoutingRepository.java b/src/main/java/com/aolda/itda/repository/routing/RoutingRepository.java index 046296c2df3937d920b4816734d16ce8267b6a1f..44b88aecdc26ff76583c01149a9862503a0c8d79 100644 --- a/src/main/java/com/aolda/itda/repository/routing/RoutingRepository.java +++ b/src/main/java/com/aolda/itda/repository/routing/RoutingRepository.java @@ -3,6 +3,7 @@ package com.aolda.itda.repository.routing; import com.aolda.itda.entity.forwarding.Forwarding; import com.aolda.itda.entity.routing.Routing; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Optional; @@ -11,4 +12,7 @@ public interface RoutingRepository extends JpaRepository<Routing, Long> { List<Routing> findByProjectIdAndIsDeleted(String projectId, Boolean isDeleted); Optional<Routing> findByRoutingIdAndIsDeleted(Long routingId, Boolean isDeleted); Boolean existsByDomainAndIsDeleted(String domain, Boolean isDeleted); + + @Query("SELECT r FROM Routing r WHERE r.projectId = ?1 AND r.isDeleted = ?3 AND (r.domain LIKE %?2% OR r.instanceIp LIKE %?2% OR r.name LIKE %?2%)") + List<Routing> findWithSearch(String projectId, String query, Boolean isDeleted); } diff --git a/src/main/java/com/aolda/itda/service/forwarding/ForwardingService.java b/src/main/java/com/aolda/itda/service/forwarding/ForwardingService.java index cae38c3229e0d8d221136c726f4452d315dbe8ec..e6fc9d45ee66e4f74ac7898bd2c43de0544de86a 100644 --- a/src/main/java/com/aolda/itda/service/forwarding/ForwardingService.java +++ b/src/main/java/com/aolda/itda/service/forwarding/ForwardingService.java @@ -27,6 +27,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; +import java.util.regex.Pattern; @Service @Transactional @@ -52,11 +53,20 @@ public class ForwardingService { return forwarding.toForwardingDTO(); } - /* 포트포워딩 목록 조회 */ - public PageResp<ForwardingDTO> getForwardings(String projectId) { + /* 포트포워딩 목록 조회 + 검색 */ + public PageResp<ForwardingDTO> getForwardingsWithSearch(String projectId, String query) { + + /* 입력 검증 */ + if (query == null || query.isBlank()) { + return PageResp.<ForwardingDTO>builder() + .contents(forwardingRepository.findByProjectIdAndIsDeleted(projectId, false) + .stream() + .map(Forwarding::toForwardingDTO) + .toList()).build(); + } return PageResp.<ForwardingDTO>builder() - .contents(forwardingRepository.findByProjectIdAndIsDeleted(projectId, false) + .contents(forwardingRepository.findWithSearch(projectId, query, false) .stream() .map(Forwarding::toForwardingDTO) .toList()).build(); diff --git a/src/main/java/com/aolda/itda/service/routing/RoutingService.java b/src/main/java/com/aolda/itda/service/routing/RoutingService.java index 769278d2c6aca1a1f7e4f7afb11a3281e8e7fd07..d01eb022236db9162bee3b62907bcca07fbfa05f 100644 --- a/src/main/java/com/aolda/itda/service/routing/RoutingService.java +++ b/src/main/java/com/aolda/itda/service/routing/RoutingService.java @@ -28,6 +28,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; +import java.util.regex.Pattern; @Service @Transactional @@ -52,10 +53,26 @@ public class RoutingService { return routing.toRoutingDTO(); } - /* Routing 목록 조회 */ - public PageResp<RoutingDTO> getRoutings(String projectId) { + /* Routing 목록 조회 + 검색 */ + public PageResp<RoutingDTO> getRoutingsWithSearch(String projectId, String query) { + + /* 입력 검증 */ + if (query == null || query.isBlank()) { + return PageResp.<RoutingDTO>builder() + .contents(routingRepository.findByProjectIdAndIsDeleted(projectId, false) + .stream() + .map(Routing::toRoutingDTO) + .toList()).build(); + } + + /* 도메인 패턴 검증 */ + String domainPattern = "^(\\*\\.)?([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$"; + if (Pattern.matches(domainPattern, query) && query.startsWith("*.")) { + query = query.substring(2); + } + return PageResp.<RoutingDTO>builder() - .contents(routingRepository.findByProjectIdAndIsDeleted(projectId, false) + .contents(routingRepository.findWithSearch(projectId, query, false) .stream() .map(Routing::toRoutingDTO) .toList()).build();