-- 044_timeline_item_schedule.sql -- 카페 "매장 모드" — 멘트/실시간 항목의 노출시간(time window) + 노출간격(interval). -- -- 매장 모드는 편성표를 폐점까지 무한 반복한다. 인사("좋은 아침입니다")가 오후에도 -- 반복되거나 날씨/뉴스가 매 바퀴 나오는 것을 막기 위해, 항목별로 -- · 노출시간: 자정 기준 분(0~1439) 시작/종료. 현재 시각이 창 밖이면 그 바퀴 스킵. -- · 노출간격: 최소 재생 간격(분). 마지막 재생 후 N분 미경과면 스킵. -- 을 둔다. tts_ment 와 realtime_weather/realtime_news 에만 의미가 있다(bgm 은 항상). -- -- ⛔⛔ CHECK 제약 함정 (2026-05-27 데이터 손실 사고 재발 방지): sql/043 에서 -- item_type CHECK 에 새 타입 추가 마이그레이션을 빠뜨려, update_timeline 의 -- 비-트랜잭션 delete→insert 가 CHECK 위반으로 항목을 통째 잃었다. 이번엔 CHECK 를 -- 일절 추가하지 않는다 — 전부 nullable 컬럼만. null = "제한 없음"(기존 동작). -- -- 적용: Supabase SQL Editor 에서 실행. 미적용 시 신규 컬럼이 없을 뿐 — 백엔드는 -- 값이 있을 때만 컬럼을 insert 하므로, 일정 미설정 항목 저장/재생은 영향 없음(손실 0). -- 재실행 무해(IF NOT EXISTS). ALTER TABLE public.timeline_items ADD COLUMN IF NOT EXISTS play_start_min smallint, -- 자정 기준 분(0~1439), null=제한없음 ADD COLUMN IF NOT EXISTS play_end_min smallint, -- 자정 기준 분(0~1439), null=제한없음 ADD COLUMN IF NOT EXISTS play_interval_min smallint; -- 최소 재생 간격(분), null=매 바퀴 COMMENT ON COLUMN public.timeline_items.play_start_min IS '매장 모드 노출시간 시작(자정 기준 분 0~1439). null=제한없음. play_end_min 과 쌍.'; COMMENT ON COLUMN public.timeline_items.play_end_min IS '매장 모드 노출시간 종료(자정 기준 분 0~1439). start>end 면 자정 넘김(예 22:00~02:00).'; COMMENT ON COLUMN public.timeline_items.play_interval_min IS '매장 모드 최소 재생 간격(분). 마지막 재생 후 N분 미경과면 스킵. null=매 바퀴.';