diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java new file mode 100644 index 0000000..9c0083b --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java @@ -0,0 +1,55 @@ +package com.eactive.apim.portal.djb.apistatus.incident.entity; + +import com.eactive.apim.portal.common.entity.Auditable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import java.time.LocalDateTime; + +/** + * 점검 공지의 사전발송 예약/결과. {@link DjbApistatusIncident} 와 1:1 이며 PK 를 공유한다. + * + *

행이 존재한다는 것 자체가 "사전 발송이 예약되어 있다"는 뜻이다 - 관리자가 사전 발송 시각을 + * 비우고 저장하면(아직 미발송인 경우) 행을 지운다.

+ * + *

{@code RUN_AT}/{@code RESULT}/{@code TARGET_CNT}/{@code SENT_CNT}/{@code FAIL_MSG} 는 + * 향후 발송 스케줄러가 채우는 자리다. 관리자 화면은 읽기만 한다.

+ */ +@Entity +@Table(name = "DJB_APISTATUS_INCIDENT_PRENOTICE") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class DjbApistatusIncidentPrenotice extends Auditable { + + /** 상위 INCIDENT 의 PK 를 그대로 쓴다 (생성 전략 없음 - 저장 시 직접 대입). */ + @Id + @Column(name = "INCIDENT_ID", nullable = false) + private Long incidentId; + + @Column(name = "PRENOTI_AT", nullable = false) + private LocalDateTime prenotiAt; + + @Column(name = "RUN_AT") + private LocalDateTime runAt; + + @Enumerated(EnumType.STRING) + @Column(name = "RESULT", length = 20, nullable = false) + private PrenoticeResult result = PrenoticeResult.PENDING; + + @Column(name = "TARGET_CNT") + private Integer targetCnt; + + @Column(name = "SENT_CNT") + private Integer sentCnt; + + @Column(name = "FAIL_MSG", length = 2000) + private String failMsg; +} diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java new file mode 100644 index 0000000..e46d879 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java @@ -0,0 +1,27 @@ +package com.eactive.apim.portal.djb.apistatus.incident.entity; + +/** + * 점검 사전발송 결과. + * + *

{@link #PENDING} 인 동안에만 관리자가 사전 발송 지정 시각을 고칠 수 있다. + * 발송 작업이 한 번이라도 돌면({@link #SUCCESS}/{@link #FAIL}) 지정 시각은 이력이 되어 잠긴다.

+ * + *

{@link #SUCCESS} 라도 발송 성공 건수가 0 일 수 있다 - 구독 대상이 한 건도 없었던 경우다. + * 실제 발송 시각·응답은 Webhook 발송 내역(PTL_WEBHOOK_SEND_LOG)에서 확인한다.

+ */ +public enum PrenoticeResult { + + /** 대기 - 아직 발송 작업이 돌지 않음 */ + PENDING, + + /** 성공 */ + SUCCESS, + + /** 실패 */ + FAIL; + + /** 발송 작업이 이미 수행되었는지 여부 (지정 시각 수정 불가 판단) */ + public boolean isSent() { + return this != PENDING; + } +} diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java new file mode 100644 index 0000000..4306822 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java @@ -0,0 +1,14 @@ +package com.eactive.apim.portal.djb.apistatus.incident.repository; + +import com.eactive.apim.portal.djb.apistatus.incident.entity.DjbApistatusIncidentPrenotice; +import com.eactive.eai.rms.data.EMSDataSource; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +@EMSDataSource +public interface DjbApistatusIncidentPrenoticeRepository + extends JpaRepository { + + void deleteByIncidentId(Long incidentId); +}