Spaces:
Sleeping
Sleeping
File size: 2,412 Bytes
aa9892b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | -- μ€μΌμ€ μμ½ μμ± νμΌ ν΄λΌμ°λ 보κ΄.
--
-- μ μ±
: μ¬μ©μκ° μ€μΌμ€ μμ½ μ λͺ
μμ λμ β νλ μ΄λ¦¬μ€νΈ νλͺ©λ€μ 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])
);
|