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])
    );