-- 카페 BGM 샘플 편성표 DB화 (2026-05-25). -- -- 기존: 샘플(스타벅스/올리브영)이 프론트 하드코딩 → 관리자가 편집/저장해도 영속 안 됨. -- 변경: 샘플을 실제 music_timelines 행(is_sample=true)으로 만들어 관리자 편집이 영속 + -- 모든 사용자가 같은 샘플을 봄. owner = 관리자(icesgg). 읽기는 누구나, 쓰기는 관리자만 -- (백엔드 timeline_service 가드 + 아래 RLS public read). -- -- 회귀 0: 컬럼 추가(nullable/default) + 신규 RLS는 SELECT 만 추가(기존 owner FOR ALL 유지). ALTER TABLE public.music_timelines ADD COLUMN IF NOT EXISTS is_sample boolean NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS description text, ADD COLUMN IF NOT EXISTS genre text, ADD COLUMN IF NOT EXISTS time_label text; CREATE INDEX IF NOT EXISTS music_timelines_sample_idx ON public.music_timelines (is_sample) WHERE is_sample; -- 공용 샘플은 누구나 읽기 (owner 전용 정책에 SELECT 한 줄 추가 — permissive OR). -- 백엔드는 service_role 로 우회하지만 RLS 도 방어선으로 맞춰둔다. DROP POLICY IF EXISTS music_timelines_sample_read ON public.music_timelines; CREATE POLICY music_timelines_sample_read ON public.music_timelines FOR SELECT USING (is_sample = true); DROP POLICY IF EXISTS timeline_items_sample_read ON public.timeline_items; CREATE POLICY timeline_items_sample_read ON public.timeline_items FOR SELECT USING ( EXISTS (SELECT 1 FROM public.music_timelines t WHERE t.id = timeline_items.timeline_id AND t.is_sample = true) ); -- 샘플 2개 시드 (owner = 관리자). 멱등 — 같은 name 의 샘플이 이미 있으면 skip. INSERT INTO public.music_timelines (user_id, name, is_sample, description, genre, time_label) SELECT u.id, '스타벅스 매장 플레이 리스트', true, '세련된 재즈와 부드러운 아쿠스틱 음악이 조합된 스타벅스 스타일 편성표입니다.', 'JAZZ', '08:00 - 11:00' FROM auth.users u WHERE u.email = 'icesgg@gmail.com' AND NOT EXISTS ( SELECT 1 FROM public.music_timelines WHERE is_sample = true AND name = '스타벅스 매장 플레이 리스트'); INSERT INTO public.music_timelines (user_id, name, is_sample, description, genre, time_label) SELECT u.id, '올리브영 최신 트렌디 팝', true, '활기찬 매장 분위기를 위한 최신 인기 팝과 브랜드 공지사항이 포함된 구성입니다.', 'TRENDY', '11:30 - 14:00' FROM auth.users u WHERE u.email = 'icesgg@gmail.com' AND NOT EXISTS ( SELECT 1 FROM public.music_timelines WHERE is_sample = true AND name = '올리브영 최신 트렌디 팝'); COMMENT ON COLUMN public.music_timelines.is_sample IS '공용 샘플 편성표(템플릿). true=모든 사용자 노출, 관리자만 편집. 내 편성표 목록 제외.';