Spaces:
Sleeping
Sleeping
File size: 3,558 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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | -- μλΆ λ©μμ§ (`/message`) β λ³ΈμΈ μμμΌλ‘ κ°μ‘±/μΉκ΅¬μκ² λ³΄λΌ μ§§μ μμ± λ©μμ§.
--
-- νλ¦:
-- 1) μ¬μ©μκ° μμ±/ν
μ€νΈλ‘ "μ΄λ° μλΆ λ³΄λ΄μ€" μ§μ
-- 2) LLM μ΄ 1~2λ¬Έμ₯ λ³Έλ¬Έ μμ± + μ¬μ©μ μμ ICL TTS ν©μ±
-- 3) wav λ₯Ό Supabase Storage (scheduled-audio bucket μ¬μ¬μ©) μ μ
λ‘λ
-- 4) μ¦μ 곡μ : μ¬μ©μκ° μΉ΄μΉ΄μ€ JS SDK λ‘ λ³ΈμΈ μΉ΄ν‘μμ κ°μ‘± μ±ν
λ°© μ ν β /listen/<id> λ§ν¬ λ°μ‘
-- 5) μμ½: μκ° λλ¬ μ μ¬μ©μ λ³ΈμΈμκ² μλ¦Όν‘ ("μ€λΉλμ΄μ. 곡μ νκΈ°") β ν΄λ¦ β /listen/<id> νμ΄μ§μ
-- [곡μ νκΈ°] λ²νΌ β μΉ΄ν‘ κ³΅μ
--
-- λ°μ μ νμ μ¬μ©μ λ³ΈμΈ β μλ¦Όν‘μ μ¬μ©μ μμ μκ²λ§ λ°μ‘ (μ μ±
μμ ), κ°μ‘±μκ²λ μ¬μ©μ μΉ΄ν‘μΌλ‘ μ§μ .
-- λ°λ μ¬λ λ²νΈ μμ§ μμ (PIPA λΆλ΄ ννΌ). recipient_label μ μ¬μ©μκ° μκΈ°λ§ μμ보λ λ©λͺ¨.
CREATE TABLE IF NOT EXISTS public.care_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
-- μ
λ ₯
recipient_label TEXT NOT NULL DEFAULT '', -- "μ΄λ¨Έλ" / "μλΉ " λ± μ¬μ©μ λ©λͺ¨
voice_input_text TEXT, -- STT λλ μ§μ μ
λ ₯ν μ§μλ¬Έ (μ΄λ ₯)
-- μμ±λ κ²°κ³Ό
generated_text TEXT NOT NULL DEFAULT '', -- LLM μ΄ λ§λ λ³Έλ¬Έ (μ€μ μμ± ν
μ€νΈ)
audio_file_path TEXT, -- storage κ²½λ‘ (μμ μ©)
audio_file_url TEXT, -- 1λ
signed URL (λͺ©λ‘ 미리λ£κΈ°)
voice_storage_path TEXT, -- ν©μ±μ μ¬μ©ν μ¬μ©μ μμ (μ¬ν©μ± μΆμ )
-- μμ½ (NULL = μ¦μ 곡μ , μμ½ μμ)
scheduled_at TIMESTAMPTZ,
timezone TEXT NOT NULL DEFAULT 'Asia/Seoul',
next_fire_at TIMESTAMPTZ,
last_fired_at TIMESTAMPTZ,
active BOOLEAN NOT NULL DEFAULT TRUE,
-- λΆμ
shared_at TIMESTAMPTZ, -- μ¬μ©μκ° [곡μ νκΈ°] λ²νΌ λλ₯Έ μκ°
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_care_messages_user
ON public.care_messages (user_id, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_care_messages_due
ON public.care_messages (active, next_fire_at)
WHERE next_fire_at IS NOT NULL;
ALTER TABLE public.care_messages ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS care_messages_owner ON public.care_messages;
CREATE POLICY care_messages_owner ON public.care_messages
FOR ALL
USING (user_id = auth.uid())
WITH CHECK (user_id = auth.uid());
-- updated_at μλ κ°±μ
CREATE OR REPLACE FUNCTION public._care_messages_touch_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS care_messages_touch_updated_at ON public.care_messages;
CREATE TRIGGER care_messages_touch_updated_at
BEFORE UPDATE ON public.care_messages
FOR EACH ROW EXECUTE FUNCTION public._care_messages_touch_updated_at();
-- βββββββββ Storage μ μ±
βββββββββ
-- scheduled-audio bucket μ¬μ¬μ© (sql/016 μμ μ΄λ―Έ μμ±). κ°μ ν΄λ (<user_id>/)
-- μμ care λ©μμ§ wav λ₯Ό λλ―λ‘ μΆκ° μ μ±
λΆνμ.
-- care νμΌλͺ
컨벀μ
: <user_id>/care-<message_id>-<timestamp>.wav
|