talk / backend /sql /008_laugh_kinds.sql
user
Deploy StyleVoiceChat backend
aa9892b
Raw History Blame Contribute Delete
4.15 kB
-- Phase 4 (laugh register): μ›ƒμŒ μ’…λ₯˜ (kind) 메타 + ν‚€μ›Œλ“œ λ§€ν•‘.
--
-- λ°°κ²½: κΈ°μ‘΄ admin_laugh_templates λŠ” length_class 만으둜 λΆ„λ₯˜ν–ˆλŠ”λ°,
-- γ…‹γ…‹γ…‹ 같은 짧은 μ›ƒμŒμ— 2초 wav κ°€ κ³Όν•΄μ„œ "짧은/κΈ΄" 길이 λΆ„ν•  + "κΈ°λ³Έ/μˆ˜μ€μ€/λ°•μž₯λŒ€μ†Œ/ν‚₯ν‚₯"
-- 같은 톀별 λΆ„λ₯˜κ°€ ν•„μš”ν•΄μ‘Œλ‹€. 이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ€ 길이 뢄할은 일단 두고
-- (ν˜„μž¬ length_class μ»¬λŸΌμ€ κ·ΈλŒ€λ‘œ μœ μ§€) **μ’…λ₯˜** μΆ•λ§Œ μƒˆλ‘œ λ„μž…ν•œλ‹€.
--
-- ν‚€μ›Œλ“œλŠ” admin UI μ—μ„œ νŽΈμ§‘ κ°€λŠ₯ (laugh_kinds.keywords text[]). λŸ°νƒ€μž„ λΆ„λ₯˜κΈ°
-- (`laugh_split.classify_laugh_kind`) κ°€ 이 ν…Œμ΄λΈ”μ„ μΊμ‹œν•΄μ„œ ν…μŠ€νŠΈ β†’ kind λ§€ν•‘.
-- priority κ°€ λ†’μ„μˆ˜λ‘ λ¨Όμ € λ§€μΉ­ (예: 'shy' 의 'γ…Žγ…Ž' κ°€ 'default' 의 일반 맀칭보닀
-- λ¨Όμ € μž‘νžˆλ„λ‘).
CREATE TABLE IF NOT EXISTS public.laugh_kinds (
kind TEXT PRIMARY KEY, -- 'default' | 'shy' | 'burst' | 'chuckle' (ν™•μž₯ κ°€λŠ₯)
label TEXT NOT NULL, -- ν•œκΈ€ ν‘œμ‹œλͺ… (admin UI)
keywords TEXT[] NOT NULL DEFAULT '{}', -- λ§€μΉ­ 토큰 (예: ['γ…Žγ…Ž','ν—€ν—€','흐흐'])
priority INT NOT NULL DEFAULT 0, -- λ§€μΉ­ μš°μ„ μˆœμœ„ (높은 κ°’ λ¨Όμ €)
is_active BOOLEAN NOT NULL DEFAULT TRUE,
description TEXT, -- admin λ©”λͺ¨
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
ALTER TABLE public.laugh_kinds ENABLE ROW LEVEL SECURITY;
-- μ •μ±… μ—†μŒ: service_role 만 μ ‘κ·Ό (admin endpoint ν†΅ν•΄μ„œλ§Œ μˆ˜μ •).
COMMENT ON TABLE public.laugh_kinds IS
'Phase 4 (laugh register): μ›ƒμŒ μ’…λ₯˜ 메타 + ν‚€μ›Œλ“œ λ§€ν•‘. admin UI μ—μ„œ νŽΈμ§‘ κ°€λŠ₯.';
COMMENT ON COLUMN public.laugh_kinds.priority IS
'λ§€μΉ­ μš°μ„ μˆœμœ„ β€” burst/shy/chuckle 처럼 쒁은 맀칭이 default 보닀 λ¨Όμ € μž‘ν˜€μ•Ό ν•œλ‹€.';
-- 초기 μ‹œλ“œ β€” 4μ’… + ν•©μ˜λœ ν‚€μ›Œλ“œ.
-- priority: burst > chuckle > shy > default (쒁은 λ§€μΉ­ μš°μ„ )
INSERT INTO public.laugh_kinds (kind, label, keywords, priority, description) VALUES
('burst', 'λ°•μž₯λŒ€μ†Œ', ARRAY['ν‘Έν•˜ν•˜','ν‘Έν•˜','μœΌν•˜ν•˜','μœΌν•˜','μ™€ν•˜ν•˜','κΉ”κΉ”','μΊ¬μΊ¬','μΊ¬ν•˜'], 30,
'ν„°μ§€λŠ” μ›ƒμŒ β€” 큰 μ†Œλ¦¬λ‘œ κ°‘μž‘μŠ€λŸ½κ²Œ ν„°μ Έ λ‚˜μ˜΄.'),
('chuckle', 'ν‚₯ν‚₯/μ°ΈλŠ”μ›ƒμŒ', ARRAY['ν‚₯ν‚₯','λ‚„λ‚„','μΏ‘μΏ‘','ν‘Έν•«','ν’‰','피식'], 20,
'μ°Έλ‹€ μƒˆλŠ” 짧은 μ›ƒμŒ.'),
('shy', 'μˆ˜μ€μ€', ARRAY['γ…Žγ…Ž','γ…Žγ…Žγ…Ž','ν—€ν—€','ν—€ν—·','흐흐','흐흣','히히','νžˆνž›'], 10,
'λΆ€λ“œλŸ½κ³  μž‘μ€ μ›ƒμŒ.'),
('default', 'κΈ°λ³Έ', ARRAY['ν•˜ν•˜','ν•˜ν•˜ν•˜','γ…‹γ…‹','γ…‹γ…‹γ…‹','γ…‹γ…‹γ…‹γ…‹','크크','호호'], 0,
'일반 μ›ƒμŒ β€” λ§€μΉ­ μ•ˆλœ λͺ¨λ“  μ›ƒμŒμ˜ 폴백.')
ON CONFLICT (kind) DO NOTHING;
-- admin_laugh_templates: kind 컬럼 μΆ”κ°€ (FK λŠ” ꡳ이 μ•ˆ κ²€ β€” κ°€λ²Όμš΄ lookup).
ALTER TABLE public.admin_laugh_templates
ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL DEFAULT 'default';
CREATE INDEX IF NOT EXISTS admin_laugh_templates_kind_active_idx
ON public.admin_laugh_templates (kind, is_active)
WHERE is_active = TRUE;
-- user_laugh_cache: kind 컬럼 μΆ”κ°€ (admin_laugh_templates.kind 동기 β€” 쑰인 λΉ„μš© 쀄이렀고
-- 미러링). μƒˆ 행은 _convert_one 이 μ±„μš°κ³ , κΈ°μ‘΄ 행은 μ•„λž˜ λ°±ν•„ + μΆ”ν›„ rebuild_for_voice
-- μžλ™ κ°±μ‹ .
ALTER TABLE public.user_laugh_cache
ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL DEFAULT 'default';
-- κΈ°μ‘΄ cache ν–‰μ˜ kind λ°±ν•„ β€” ν…œν”Œλ¦Ώμ—μ„œ λŒμ–΄μ˜΄.
UPDATE public.user_laugh_cache c
SET kind = t.kind
FROM public.admin_laugh_templates t
WHERE c.template_id = t.id
AND (c.kind IS NULL OR c.kind = 'default')
AND t.kind <> 'default';
CREATE INDEX IF NOT EXISTS user_laugh_cache_kind_idx
ON public.user_laugh_cache (user_id, voice_storage_path, kind)
WHERE ready = TRUE;
COMMENT ON COLUMN public.admin_laugh_templates.kind IS
'μ›ƒμŒ μ’…λ₯˜ (laugh_kinds.kind μ°Έμ‘°). μ±„νŒ… chunker κ°€ ν…μŠ€νŠΈβ†’kind λΆ„λ₯˜ ν›„ λ§€μΉ­.';
COMMENT ON COLUMN public.user_laugh_cache.kind IS
'admin_laugh_templates.kind 미러 β€” 쑰회 λ‹¨μˆœν™”μš©.';