package com.snp.batch.global.model; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; /** * Bypass API 접근 신청 정보를 저장하는 엔티티 * 외부 사용자가 Bypass API 접근을 신청하고 관리자가 승인/반려하는 워크플로우 관리 * * JPA를 사용하므로 @PrePersist, @PreUpdate로 감사 필드 자동 설정 */ @Entity @Table(name = "bypass_api_request", indexes = { @Index(name = "idx_bypass_request_status", columnList = "status") } ) @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor public class BypassApiRequest { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 신청자 이름 */ @Column(name = "applicant_name", nullable = false, length = 100) private String applicantName; /** * 소속 기관 */ @Column(name = "organization", length = 200) private String organization; /** * 신청 목적 */ @Column(name = "purpose", columnDefinition = "TEXT") private String purpose; /** * 이메일 */ @Column(name = "email", length = 200) private String email; /** * 연락처 */ @Column(name = "phone", length = 50) private String phone; /** * 요청 접근 기간 */ @Column(name = "requested_access_period", length = 100) private String requestedAccessPeriod; /** * 신청 상태 (PENDING, APPROVED, REJECTED) */ @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false, length = 20) @Builder.Default private RequestStatus status = RequestStatus.PENDING; /** * 검토자 */ @Column(name = "reviewed_by", length = 100) private String reviewedBy; /** * 검토 일시 */ @Column(name = "reviewed_at") private LocalDateTime reviewedAt; /** * 반려 사유 */ @Column(name = "reject_reason", columnDefinition = "TEXT") private String rejectReason; /** * 승인 후 생성된 계정 */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "account_id") private BypassApiAccount account; /** * 생성 일시 (감사 필드) */ @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; /** * 수정 일시 (감사 필드) */ @Column(name = "updated_at", nullable = false) private LocalDateTime updatedAt; /** * 엔티티 저장 전 자동 호출 (INSERT 시) */ @PrePersist protected void onCreate() { LocalDateTime now = LocalDateTime.now(); this.createdAt = now; this.updatedAt = now; } /** * 엔티티 업데이트 전 자동 호출 (UPDATE 시) */ @PreUpdate protected void onUpdate() { this.updatedAt = LocalDateTime.now(); } }