d3ro-voice/server/supabase/migrations/20260821000020_transcription_outbox_completion_edges.sql
2026-08-29 18:33:45 +09:00

50 lines
1.4 KiB
PL/PgSQL

BEGIN;
-- Workers normally transition queued/running jobs to succeeded, but recovery
-- and import paths may insert an already-succeeded job or attach history_id
-- after the provider result was committed. Every server-owned completion edge
-- must enqueue the same immutable event exactly once.
CREATE OR REPLACE FUNCTION public.enqueue_processing_job_push()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = ''
AS $$
BEGIN
IF NEW.kind <> 'transcription'
OR NEW.status <> 'succeeded'
OR NEW.history_id IS NULL THEN
RETURN NEW;
END IF;
IF TG_OP = 'UPDATE'
AND OLD.status IS NOT DISTINCT FROM 'succeeded'
AND OLD.history_id IS NOT DISTINCT FROM NEW.history_id THEN
RETURN NEW;
END IF;
IF EXISTS (
SELECT 1
FROM public.history
WHERE id = NEW.history_id
AND user_id = NEW.user_id
AND status = 'completed'
) THEN
PERFORM public.enqueue_immutable_push_event(
'transcription.completed', NEW.history_id
);
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER enqueue_processing_job_push_after_success
ON public.processing_jobs;
CREATE TRIGGER enqueue_processing_job_push_after_success
AFTER INSERT OR UPDATE OF status, history_id ON public.processing_jobs
FOR EACH ROW EXECUTE FUNCTION public.enqueue_processing_job_push();
REVOKE ALL ON FUNCTION public.enqueue_processing_job_push()
FROM PUBLIC, anon, authenticated;
COMMIT;