Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • dev
  • feat/auth
  • feat/certificate
  • feat/forwarding
  • feat/log
  • feat/routing
  • feat/ssl
  • main
8 results

Target

Select target project
  • aolda/proxy-manager-backend
1 result
Select Git revision
  • dev
  • feat/auth
  • feat/certificate
  • feat/forwarding
  • feat/log
  • feat/routing
  • feat/ssl
  • main
8 results
Show changes
Commits on Source (10)
Showing
with 284 additions and 137 deletions
...@@ -61,7 +61,7 @@ public class RoutingLogAspect { ...@@ -61,7 +61,7 @@ public class RoutingLogAspect {
+ "ip: " + routing.getInstanceIp() + "\n" + "ip: " + routing.getInstanceIp() + "\n"
+ "port: " + routing.getInstancePort() + "\n" + "port: " + routing.getInstancePort() + "\n"
+ (routing.getCertificate() != null ? ("certificateId: " + routing.getCertificate().getCertificateId() + "\n") : "") + (routing.getCertificate() != null ? ("certificateId: " + routing.getCertificate().getCertificateId() + "\n") : "")
+ "caching: " + routing.getCaching() + "\n"; + "caching: " + routing.getCaching();
/* 로그 엔티티 저장 */ /* 로그 엔티티 저장 */
logRepository.save(Log.builder() logRepository.save(Log.builder()
...@@ -97,7 +97,7 @@ public class RoutingLogAspect { ...@@ -97,7 +97,7 @@ public class RoutingLogAspect {
+ "ip: " + routing.getInstanceIp() + "\n" + "ip: " + routing.getInstanceIp() + "\n"
+ "port: " + routing.getInstancePort() + "\n" + "port: " + routing.getInstancePort() + "\n"
+ (routing.getCertificate() != null ? ("certificateId: " + routing.getCertificate().getCertificateId() + "\n") : "") + (routing.getCertificate() != null ? ("certificateId: " + routing.getCertificate().getCertificateId() + "\n") : "")
+ "caching: " + routing.getCaching() + "\n"; + "caching: " + routing.getCaching();
/* 로그 엔티티 저장 */ /* 로그 엔티티 저장 */
logRepository.save(Log.builder() logRepository.save(Log.builder()
......
...@@ -4,64 +4,73 @@ import com.aolda.itda.dto.auth.IdAndNameDTO; ...@@ -4,64 +4,73 @@ import com.aolda.itda.dto.auth.IdAndNameDTO;
import com.aolda.itda.exception.CustomException; import com.aolda.itda.exception.CustomException;
import com.aolda.itda.exception.ErrorCode; import com.aolda.itda.exception.ErrorCode;
import com.aolda.itda.service.AuthService; import com.aolda.itda.service.AuthService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@RequiredArgsConstructor @RequiredArgsConstructor
@Component @Component
@Slf4j @Slf4j
public class AuthInterceptor implements HandlerInterceptor { public class AuthFilter extends OncePerRequestFilter {
private final AuthService authService; private final AuthService authService;
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (request.getRequestURI().contains("/api/auth")) {
filterChain.doFilter(request, response);
return;
}
String token = request.getHeader("X-Subject-Token"); String token = request.getHeader("X-Subject-Token");
/* 토큰 헤더 검증 */ // 토큰 헤더 검증
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
throw new CustomException(ErrorCode.INVALID_TOKEN, request.getRequestURI()); throw new CustomException(ErrorCode.INVALID_TOKEN, request.getRequestURI());
} }
/* 유효 토큰 검증 */ // 유효 토큰 검증
String userId = authService.validateTokenAndGetUserId(token); String userId = authService.validateTokenAndGetUserId(token);
if (userId == null) { if (userId == null) {
log.error("Token validation failed for URI {}: {}", request.getRequestURI(), request.getRemoteAddr()); log.error("Token validation failed for URI {}: {}", request.getRequestURI(), request.getRemoteAddr());
throw new CustomException(ErrorCode.INVALID_TOKEN, request.getRequestURI()); throw new CustomException(ErrorCode.INVALID_TOKEN, request.getRequestURI());
} }
/* 프로젝트 권한 검증 */ // 프로젝트 권한 검증
String projectId = request.getParameter("projectId"); String projectId = request.getParameter("projectId");
if (projectId != null) { if (projectId != null) {
try { try {
String role = authService.getBestRoleWithinProject(token, projectId).get("role"); authService.getBestRoleWithinProject(token, projectId).get("role");
if (!role.equals("admin")) { if (!request.getMethod().equals("GET") && !authService.getBestRoleWithinProject(token, projectId).get("role").equals("admin")) {
log.error("Unauthorized Token for URI {}: {}", request.getRequestURI(), request.getRemoteAddr());
throw new CustomException(ErrorCode.UNAUTHORIZED_USER, request.getRequestURI()); throw new CustomException(ErrorCode.UNAUTHORIZED_USER, request.getRequestURI());
} }
} catch (Exception e) { } catch (Exception e) {
throw new CustomException(ErrorCode.UNAUTHORIZED_USER, request.getRequestURI()); throw new CustomException(ErrorCode.UNAUTHORIZED_USER, request.getRequestURI());
} }
}
// 프로젝트 리스트 조회
List<String> projects;
if (authService.isAdmin(Map.of("id", userId, "token", token))) {
projects = authService.getAllProjects(token).stream().map(IdAndNameDTO::getId).toList();
} else {
projects = authService.getProjectsWithUser(Map.of("id", userId, "token", token)).stream().map(IdAndNameDTO::getId).toList();
} }
/* 프로젝트 리스트 조회 */
List<String> projects = authService.getProjectsWithUser(Map.of("id", userId, "token", token))
.stream().map(IdAndNameDTO::getId)
.toList();
request.setAttribute("projects", projects); request.setAttribute("projects", projects);
request.setAttribute("user", Map.of("id", userId, "token", token)); request.setAttribute("user", Map.of("id", userId, "token", token));
return true;
filterChain.doFilter(request, response);
} }
} }
\ No newline at end of file
package com.aolda.itda.config; package com.aolda.itda.config;
import com.aolda.itda.exception.CustomException;
import com.aolda.itda.exception.ErrorCode;
import com.aolda.itda.service.AuthService;
import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.servlet.FilterChain; import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -11,11 +16,14 @@ import org.springframework.web.filter.OncePerRequestFilter; ...@@ -11,11 +16,14 @@ import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingRequestWrapper;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
@Component @Component
@RequiredArgsConstructor
public class LoggingFilter extends OncePerRequestFilter { public class LoggingFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class); private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);
private final AuthService authService;
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
...@@ -23,24 +31,22 @@ public class LoggingFilter extends OncePerRequestFilter { ...@@ -23,24 +31,22 @@ public class LoggingFilter extends OncePerRequestFilter {
// Request Body를 읽을 수 있도록 래핑 // Request Body를 읽을 수 있도록 래핑
ContentCachingRequestWrapper cachingRequest = new ContentCachingRequestWrapper(request); ContentCachingRequestWrapper cachingRequest = new ContentCachingRequestWrapper(request);
System.out.println("필터 적용");
filterChain.doFilter(cachingRequest, response); filterChain.doFilter(cachingRequest, response);
// 로그 기록 // 로그 기록
logRequest(cachingRequest); logRequest(cachingRequest);
System.out.println("왜 안돼ㅐ");
} }
private void logRequest(ContentCachingRequestWrapper request) { private void logRequest(ContentCachingRequestWrapper request) throws JsonProcessingException {
System.out.println("되는거 맞아?");
String ip = request.getRemoteAddr(); String ip = request.getRemoteAddr();
String method = request.getMethod(); String method = request.getMethod();
String uri = request.getRequestURI(); String uri = request.getRequestURI();
String queryString = request.getQueryString(); String queryString = request.getQueryString();
String body = getRequestBody(request); String body = getRequestBody(request);
Map<String, String> user = (Map<String, String>) request.getAttribute("user");
logger.info("IP: {}, Method: {}, URI: {}, Query Params: {}, Request Body: {}", logger.info("IP: {}, Method: {}, URI: {}, Query Params: {}, User: {}, Request Body: {}",
ip, method, uri, (queryString != null ? queryString : "None"), ip, method, uri, (queryString != null ? queryString : "None"), (user != null ? user.get("id") : "None"),
(!body.isEmpty() ? body : "None")); (!body.isEmpty() ? body : "None"));
} }
......
...@@ -3,17 +3,18 @@ package com.aolda.itda.config; ...@@ -3,17 +3,18 @@ package com.aolda.itda.config;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration @Configuration
@RequiredArgsConstructor @RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer { public class WebConfig implements WebMvcConfigurer {
private final AuthInterceptor authInterceptor; private final AuthFilter authFilter;
private final LoggingFilter loggingFilter;
@Override @Override
public void addCorsMappings(CorsRegistry registry) { // 스프링단에서 cors 설정 public void addCorsMappings(CorsRegistry registry) { // 스프링단에서 cors 설정
...@@ -26,13 +27,23 @@ public class WebConfig implements WebMvcConfigurer { ...@@ -26,13 +27,23 @@ public class WebConfig implements WebMvcConfigurer {
; ;
} }
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] excludeAuth = {"/error", "/api/auth/*" };
registry.addInterceptor(authInterceptor) @Bean
.addPathPatterns("/**") public FilterRegistrationBean<AuthFilter> authFilterRegistration() {
.excludePathPatterns(excludeAuth); FilterRegistrationBean<AuthFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(authFilter);
registrationBean.setOrder(1); // AuthFilter의 순서를 1로 설정
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
@Bean
public FilterRegistrationBean<LoggingFilter> loggingFilterRegistration() {
FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(loggingFilter);
registrationBean.setOrder(2); // LoggingFilter의 순서를 2로 설정
registrationBean.addUrlPatterns("/*");
return registrationBean;
} }
@Bean @Bean
......
...@@ -30,8 +30,9 @@ public class ForwardingController { ...@@ -30,8 +30,9 @@ public class ForwardingController {
} }
@GetMapping("/forwardings") @GetMapping("/forwardings")
public ResponseEntity<Object> lists(@RequestParam String projectId) { public ResponseEntity<Object> lists(@RequestParam String projectId,
return ResponseEntity.ok(forwardingService.getForwardings(projectId)); @RequestParam(required = false) String query) {
return ResponseEntity.ok(forwardingService.getForwardingsWithSearch(projectId, query));
} }
@PatchMapping("/forwarding") @PatchMapping("/forwarding")
......
package com.aolda.itda.controller.main;
import com.aolda.itda.service.main.MainService;
import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class MainController {
private final MainService mainService;
@GetMapping("/projects")
public ResponseEntity<Object> projects(HttpServletRequest request) throws JsonProcessingException {
return ResponseEntity.ok(mainService.getAllProjects((Map<String, String>) request.getSession().getAttribute("user")));
}
@GetMapping("/main")
public ResponseEntity<Object> mainInfo(@RequestParam String projectId, HttpServletRequest request) {
return ResponseEntity.ok(mainService.getMainInfo(projectId, (List<String>) request.getAttribute("projects")));
}
}
...@@ -31,8 +31,9 @@ public class RoutingController { ...@@ -31,8 +31,9 @@ public class RoutingController {
} }
@GetMapping("/routings") @GetMapping("/routings")
public ResponseEntity<Object> lists(@RequestParam String projectId) { public ResponseEntity<Object> lists(@RequestParam String projectId,
return ResponseEntity.ok(routingService.getRoutings(projectId)); @RequestParam(required = false) String query) {
return ResponseEntity.ok(routingService.getRoutingsWithSearch(projectId, query));
} }
@PatchMapping("/routing") @PatchMapping("/routing")
......
package com.aolda.itda.dto.forwarding; package com.aolda.itda.dto.forwarding;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
...@@ -40,6 +41,10 @@ public class ForwardingDTO { ...@@ -40,6 +41,10 @@ public class ForwardingDTO {
@NotBlank(message = "name 값이 존재하지 않습니다") @NotBlank(message = "name 값이 존재하지 않습니다")
private String name; private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
} }
...@@ -3,6 +3,7 @@ package com.aolda.itda.dto.log; ...@@ -3,6 +3,7 @@ package com.aolda.itda.dto.log;
import com.aolda.itda.dto.auth.IdAndNameDTO; import com.aolda.itda.dto.auth.IdAndNameDTO;
import com.aolda.itda.entity.log.Action; import com.aolda.itda.entity.log.Action;
import com.aolda.itda.entity.log.ObjectType; import com.aolda.itda.entity.log.ObjectType;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.querydsl.core.annotations.QueryProjection; import com.querydsl.core.annotations.QueryProjection;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -22,7 +23,11 @@ public class LogDTO { ...@@ -22,7 +23,11 @@ public class LogDTO {
private Action action; private Action action;
private ObjectType type; private ObjectType type;
private Long objectId; private Long objectId;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private String description; private String description;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@QueryProjection @QueryProjection
......
package com.aolda.itda.dto.main;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MainInfoDTO {
private Long routing;
private Long forwarding;
private Long certificate;
}
package com.aolda.itda.dto.routing; package com.aolda.itda.dto.routing;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
...@@ -28,8 +29,10 @@ public class RoutingDTO { ...@@ -28,8 +29,10 @@ public class RoutingDTO {
@NotNull @NotNull
private Long certificateId; private Long certificateId;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@NotNull @NotNull
......
...@@ -17,12 +17,12 @@ import java.time.LocalDateTime; ...@@ -17,12 +17,12 @@ import java.time.LocalDateTime;
public abstract class BaseTimeEntity { public abstract class BaseTimeEntity {
@CreatedDate @CreatedDate
@Column(updatable = false) @Column(updatable = false, columnDefinition = "DATETIME")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt; private LocalDateTime createdAt;
@LastModifiedDate @LastModifiedDate
@Column(name = "updated_at") @Column(name = "updated_at", columnDefinition = "DATETIME")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
......
...@@ -27,10 +27,13 @@ public class Certificate extends BaseTimeEntity { ...@@ -27,10 +27,13 @@ public class Certificate extends BaseTimeEntity {
@JoinColumn(nullable = false, name = "user_id") @JoinColumn(nullable = false, name = "user_id")
private User user; private User user;
@Column(length = 64)
private String projectId; private String projectId;
@Column(length = 64)
private String domain; private String domain;
@Column(length = 64)
private String email; private String email;
private LocalDateTime expiredAt; private LocalDateTime expiredAt;
...@@ -40,6 +43,7 @@ public class Certificate extends BaseTimeEntity { ...@@ -40,6 +43,7 @@ public class Certificate extends BaseTimeEntity {
private Boolean isDeleted; private Boolean isDeleted;
@Column(length = 256)
private String description; private String description;
public String formatDomain() { public String formatDomain() {
......
package com.aolda.itda.entity.certificate; package com.aolda.itda.entity.certificate;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum Challenge { public enum Challenge {
HTTP, DNS_CLOUDFLARE HTTP, DNS_CLOUDFLARE;
@JsonValue
@Override
public String toString() {
return name().toLowerCase();
}
} }
...@@ -20,18 +20,24 @@ public class Forwarding extends BaseTimeEntity { ...@@ -20,18 +20,24 @@ public class Forwarding extends BaseTimeEntity {
@Column(nullable = false) @Column(nullable = false)
private Long forwardingId; private Long forwardingId;
@Column(length = 64)
private String projectId; private String projectId;
@Column(length = 32)
private String serverIp; private String serverIp;
@Column(length = 8)
private String serverPort; private String serverPort;
@Column(length = 32)
private String instanceIp; private String instanceIp;
@Column(length = 8)
private String instancePort; private String instancePort;
private Boolean isDeleted; private Boolean isDeleted;
@Column(length = 256)
private String name; private String name;
public Forwarding(Forwarding forwarding) { public Forwarding(Forwarding forwarding) {
......
package com.aolda.itda.entity.log; package com.aolda.itda.entity.log;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum Action { public enum Action {
CREATE, UPDATE, DELETE CREATE, UPDATE, DELETE;
@JsonValue
@Override
public String toString() {
return name().toLowerCase();
}
} }
...@@ -27,16 +27,20 @@ public class Log extends BaseTimeEntity { ...@@ -27,16 +27,20 @@ public class Log extends BaseTimeEntity {
@JoinColumn(name = "user_id", nullable = false) @JoinColumn(name = "user_id", nullable = false)
private User user; private User user;
@Column(length = 64)
private String projectId; private String projectId;
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private ObjectType objectType; private ObjectType objectType;
@Column(length = 64)
private Long objectId; private Long objectId;
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private Action action; private Action action;
@Lob
@Column(length = 1024)
private String description; private String description;
public LogDTO toLogDTO() { public LogDTO toLogDTO() {
......
package com.aolda.itda.entity.log; package com.aolda.itda.entity.log;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum ObjectType { public enum ObjectType {
ROUTING, CERTIFICATE, FORWARDING ROUTING, CERTIFICATE, FORWARDING;
@JsonValue
@Override
public String toString() {
return name().toLowerCase();
}
} }
...@@ -28,18 +28,23 @@ public class Routing extends BaseTimeEntity { ...@@ -28,18 +28,23 @@ public class Routing extends BaseTimeEntity {
@JoinColumn(name = "certificate_id") @JoinColumn(name = "certificate_id")
private Certificate certificate; private Certificate certificate;
@Column(length = 64)
private String projectId; private String projectId;
@Column(length = 64)
private String domain; private String domain;
@Column(length = 32)
private String instanceIp; private String instanceIp;
@Column(length = 8)
private String instancePort; private String instancePort;
private Boolean isDeleted; private Boolean isDeleted;
private Boolean caching; private Boolean caching;
@Column(length = 256)
private String name; private String name;
public RoutingDTO toRoutingDTO() { public RoutingDTO toRoutingDTO() {
......
...@@ -2,6 +2,7 @@ package com.aolda.itda.repository.forwarding; ...@@ -2,6 +2,7 @@ package com.aolda.itda.repository.forwarding;
import com.aolda.itda.entity.forwarding.Forwarding; import com.aolda.itda.entity.forwarding.Forwarding;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
...@@ -11,4 +12,7 @@ public interface ForwardingRepository extends JpaRepository<Forwarding, Long> { ...@@ -11,4 +12,7 @@ public interface ForwardingRepository extends JpaRepository<Forwarding, Long> {
Optional<Forwarding> findByForwardingIdAndIsDeleted(Long forwardingId, Boolean isDeleted); Optional<Forwarding> findByForwardingIdAndIsDeleted(Long forwardingId, Boolean isDeleted);
Boolean existsByInstanceIpAndInstancePortAndIsDeleted(String instanceIp, String instancePort, Boolean isDeleted); Boolean existsByInstanceIpAndInstancePortAndIsDeleted(String instanceIp, String instancePort, Boolean isDeleted);
Boolean existsByServerPortAndIsDeleted(String serverPort, 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);
} }