package com.snp.batch.global.model; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; /** * BYPASS API 설정 정보를 저장하는 엔티티 * 외부 API를 동적으로 프록시하기 위한 설정 메타데이터 * * JPA를 사용하므로 @PrePersist, @PreUpdate로 감사 필드 자동 설정 */ @Entity @Table(name = "bypass_api_config") @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor public class BypassApiConfig { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 도메인명 (패키지명/URL 경로) * 예: "ship-info", "port-data" */ @Column(name = "domain_name", unique = true, nullable = false, length = 50) private String domainName; /** * 표시명 * 예: "선박 정보 API", "항만 데이터 API" */ @Column(name = "display_name", nullable = false, length = 100) private String displayName; /** * WebClient 빈 이름 * 예: "maritimeWebClient", "portWebClient" */ @Column(name = "webclient_bean", nullable = false, length = 100) private String webclientBean; /** * 외부 API 경로 * 예: "/api/v1/ships/{imoNumber}" */ @Column(name = "external_path", nullable = false, length = 500) private String externalPath; /** * HTTP 메서드 * 예: "GET", "POST" */ @Column(name = "http_method", nullable = false, length = 10) @Builder.Default private String httpMethod = "GET"; /** * 응답 타입 * 예: "LIST", "SINGLE" */ @Column(name = "response_type", nullable = false, length = 20) @Builder.Default private String responseType = "LIST"; /** * 설명 */ @Column(name = "description", length = 1000) private String description; /** * 코드 생성 완료 여부 */ @Column(name = "generated", nullable = false) @Builder.Default private Boolean generated = false; /** * 코드 생성 일시 */ @Column(name = "generated_at") private LocalDateTime generatedAt; /** * 생성 일시 (감사 필드) */ @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; /** * 수정 일시 (감사 필드) */ @Column(name = "updated_at", nullable = false) private LocalDateTime updatedAt; /** * API 파라미터 목록 */ @OneToMany(mappedBy = "config", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default private List params = new ArrayList<>(); /** * API 응답 필드 목록 */ @OneToMany(mappedBy = "config", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default private List fields = new ArrayList<>(); /** * 엔티티 저장 전 자동 호출 (INSERT 시) */ @PrePersist protected void onCreate() { LocalDateTime now = LocalDateTime.now(); this.createdAt = now; this.updatedAt = now; } /** * 엔티티 업데이트 전 자동 호출 (UPDATE 시) */ @PreUpdate protected void onUpdate() { this.updatedAt = LocalDateTime.now(); } }