diff --git a/docs/20261030_공지사항예약공개/alter-service-notice-publication.sql b/docs/20261030_공지사항예약공개/alter-service-notice-publication.sql new file mode 100644 index 00000000..aa357855 --- /dev/null +++ b/docs/20261030_공지사항예약공개/alter-service-notice-publication.sql @@ -0,0 +1,9 @@ +-- 수동 배포용 additive schema이며 운영 DB에서 자동 실행하지 않는다. +-- 서버/JDBC/DB UTC 확인 후 schema를 먼저 적용하고, 공개 필터가 포함된 앱으로 모든 reader를 교체한다. +-- 이전 reader가 하나라도 남아 있으면 예약 공지를 노출하므로 전체 교체 전에는 예약 쓰기/admin 사용을 금지한다. +-- 기존 row는 NULL/FALSE를 유지하며 created_at 변경이나 backfill을 수행하지 않는다. +ALTER TABLE service_notice + ADD COLUMN publish_at TIMESTAMP NULL DEFAULT NULL COMMENT '예약 공개 시각(UTC)'; + +ALTER TABLE service_notice + ADD COLUMN is_scheduled BOOLEAN NOT NULL DEFAULT FALSE COMMENT '예약 공개 여부'; diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNotice.kt b/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNotice.kt index 6800fff1..0855b1ee 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNotice.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNotice.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.notice import kr.co.vividnext.sodalive.common.BaseEntity +import java.time.LocalDateTime import javax.persistence.Column import javax.persistence.Entity @@ -11,5 +12,9 @@ data class ServiceNotice( @Column(columnDefinition = "TEXT", nullable = false) var content: String, @Column(nullable = false) - var isActive: Boolean = true + var isActive: Boolean = true, + @Column(columnDefinition = "TIMESTAMP", nullable = true) + var publishAt: LocalDateTime? = null, + @Column(nullable = false) + var isScheduled: Boolean = false ) : BaseEntity() diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeTest.kt new file mode 100644 index 00000000..a721e037 --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeTest.kt @@ -0,0 +1,19 @@ +package kr.co.vividnext.sodalive.notice + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +class ServiceNoticeTest { + @Test + @DisplayName("기존 엔티티 생성은 활성·즉시 공개 기본값과 미지정 등록 시각을 유지한다") + fun shouldDefaultToImmediateActiveNotice() { + val notice = ServiceNotice("공지", "본문") + + assertEquals(true, notice.isActive) + assertEquals(false, notice.isScheduled) + assertNull(notice.publishAt) + assertNull(notice.createdAt) + } +}