talk / backend /sql /016_schedule_audio_files.sql
user
Deploy StyleVoiceChat backend
aa9892b
Raw History Blame Contribute Delete
2.41 kB
-- μŠ€μΌ€μ€„ μ˜ˆμ•½ μŒμ„± 파일 ν΄λΌμš°λ“œ 보관.
--
-- μ •μ±…: μ‚¬μš©μžκ°€ μŠ€μΌ€μ€„ μ˜ˆμ•½ μ‹œ λͺ…μ‹œμ  λ™μ˜ β†’ ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ ν•­λͺ©λ“€μ˜ wav λ₯Ό
-- 병합해 Supabase Storage 에 μ—…λ‘œλ“œ. μ•Œλ¦Ό 클릭 μ‹œ κ·Έ 단일 파일 μž¬μƒ β†’ TTS
-- μž¬ν•©μ„± λΆ€ν•˜ 0, cache miss 0.
--
-- 차별화 λ©”μ‹œμ§€μ™€ 일치: 자유 λŒ€ν™” / Voice Contents λŠ” λΉ„μ €μž₯ κ·ΈλŒ€λ‘œ,
-- μŠ€μΌ€μ€„ μ˜ˆμ•½μ€ μ‚¬μš©μž λͺ…μ‹œ λ™μ˜ + ν΄λΌμš°λ“œ 보관 λͺ…μ‹œ.
ALTER TABLE public.playlist_schedules
ADD COLUMN IF NOT EXISTS audio_file_url TEXT, -- public/signed URL
ADD COLUMN IF NOT EXISTS audio_file_path TEXT, -- storage path (μ‚­μ œμš©)
ADD COLUMN IF NOT EXISTS audio_uploaded_at TIMESTAMPTZ;
-- μŠ€μΌ€μ€„ cascade μ‚­μ œ μ‹œ audio_file_path κ°€ μ‚΄μ•„μžˆλŠ” storage 파일 cleanup 은
-- 별도 cron λ˜λŠ” schedule_service.delete_schedule μ—μ„œ 처리.
-- ───────── Supabase Storage bucket ─────────
-- bucket 생성은 Dashboard μ—μ„œ 직접 ν•˜κ±°λ‚˜, μ•„λž˜ INSERT 둜 κ°€λŠ₯.
INSERT INTO storage.buckets (id, name, public)
VALUES ('scheduled-audio', 'scheduled-audio', false)
ON CONFLICT (id) DO NOTHING;
-- RLS: 본인 폴더(<user_id>/) 만 읽기/μ“°κΈ°/μ‚­μ œ. signed URL 은 RLS 우회.
DROP POLICY IF EXISTS scheduled_audio_own_select ON storage.objects;
CREATE POLICY scheduled_audio_own_select ON storage.objects
FOR SELECT TO authenticated
USING (
bucket_id = 'scheduled-audio'
AND (auth.uid()::text = (storage.foldername(name))[1])
);
DROP POLICY IF EXISTS scheduled_audio_own_insert ON storage.objects;
CREATE POLICY scheduled_audio_own_insert ON storage.objects
FOR INSERT TO authenticated
WITH CHECK (
bucket_id = 'scheduled-audio'
AND (auth.uid()::text = (storage.foldername(name))[1])
);
DROP POLICY IF EXISTS scheduled_audio_own_update ON storage.objects;
CREATE POLICY scheduled_audio_own_update ON storage.objects
FOR UPDATE TO authenticated
USING (
bucket_id = 'scheduled-audio'
AND (auth.uid()::text = (storage.foldername(name))[1])
);
DROP POLICY IF EXISTS scheduled_audio_own_delete ON storage.objects;
CREATE POLICY scheduled_audio_own_delete ON storage.objects
FOR DELETE TO authenticated
USING (
bucket_id = 'scheduled-audio'
AND (auth.uid()::text = (storage.foldername(name))[1])
);