snp-batch-validation/src/main/java/com/snp/batch/global/model/BypassApiRequest.java
HYOJIN 911f755d46 feat(bypass-account): Bypass API 사용자 계정 발급 신청 프로세스 개발 (#126)
- Spring Security Basic Auth 인증 도입 (Bypass 데이터 API만)
- 계정 신청/승인/거절 백엔드 API 및 프론트엔드 구현
- 계정 관리 (CRUD, 비밀번호 재설정, 상태/기간 수정)
- 401 응답에 계정 상태 상세 메시지 포함
- Swagger UI Basic Auth 스킴/환경별 그룹 노출 연동
- 신청 폼 정규식 검증 및 접근기간 프리셋 선택
2026-04-02 17:12:51 +09:00

130 lines
2.9 KiB
Java

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();
}
}