-- 사용자 오류 신고 (운전모드 등에서 "오류 신고하기" 버튼) -- -- 화면 스크린샷 + 구조화 로그 (DrivingTimingProvider.turnLogs / SttPlugin 이벤트 등) + -- 디바이스 컨텍스트 (platform / version / route) 를 받아 보관. admin /ad → "오류 신고" -- 탭에서 목록/상세 확인 가능. -- -- Storage: 스크린샷은 기존 `scheduled-audio` bucket 의 `error-reports//.png` -- 경로 재사용 (별도 bucket 안 만들고 단순화). CREATE TABLE IF NOT EXISTS public.error_reports ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, -- 사용자 입력 route TEXT NOT NULL, -- '/driving', '/message' 등 (자동 캡처) description TEXT, -- 선택 — 사용자가 입력한 한 줄 메모 -- 자동 첨부 screenshot_path TEXT, -- storage path (signed URL 으로 admin 표시) screenshot_url TEXT, -- signed URL (1년) logs JSONB, -- 구조화 로그 (turnLogs, events 등) context JSONB, -- 디바이스/플랫폼 정보 -- admin 처리 상태 handled BOOLEAN NOT NULL DEFAULT FALSE, handled_at TIMESTAMPTZ, admin_note TEXT, -- admin 메모 (해결책 / 분류) created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_error_reports_created ON public.error_reports (created_at DESC); CREATE INDEX IF NOT EXISTS idx_error_reports_unhandled ON public.error_reports (created_at DESC) WHERE handled = FALSE; ALTER TABLE public.error_reports ENABLE ROW LEVEL SECURITY; -- 사용자: 본인 신고만 INSERT DROP POLICY IF EXISTS error_reports_insert ON public.error_reports; CREATE POLICY error_reports_insert ON public.error_reports FOR INSERT WITH CHECK (user_id = auth.uid()); -- 사용자: 본인 신고만 SELECT (자기 신고 목록 확인용, 향후 사용) DROP POLICY IF EXISTS error_reports_select_own ON public.error_reports; CREATE POLICY error_reports_select_own ON public.error_reports FOR SELECT USING (user_id = auth.uid()); -- admin (service_role 사용) 은 RLS bypass — 모든 신고 조회/갱신 가능. CREATE OR REPLACE FUNCTION public._error_reports_touch_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS error_reports_touch_updated_at ON public.error_reports; CREATE TRIGGER error_reports_touch_updated_at BEFORE UPDATE ON public.error_reports FOR EACH ROW EXECUTE FUNCTION public._error_reports_touch_updated_at(); COMMENT ON TABLE public.error_reports IS '사용자 오류 신고 — 화면 스크린샷 + 로그 + 디바이스 컨텍스트.'; COMMENT ON COLUMN public.error_reports.logs IS '구조화 로그. 운전모드: {"turn_logs": [...], "events": [...]}.'; COMMENT ON COLUMN public.error_reports.context IS '디바이스 컨텍스트: {"platform": "ios", "version": "26.4", "app_version": "...", "user_agent": "..."}.';