50 lines
1.4 KiB
PL/PgSQL
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;
|