Files
Jyotisha/frontend/supabase/migrations/20260718010000_birth_time_evidence_rectification.sql
T
2026-07-18 18:40:23 +08:00

90 lines
2.8 KiB
PL/PgSQL

begin;
alter table public.birth_time_rectification_cases
add column if not exists life_events jsonb not null default '[]'::jsonb,
add column if not exists candidate_result jsonb not null default '{}'::jsonb,
add column if not exists event_scoring_version text,
add column if not exists candidate_result_id uuid,
add column if not exists candidate_saved_at timestamptz;
alter table public.birth_time_rectification_cases
drop constraint if exists birth_time_rectification_cases_life_events_check,
drop constraint if exists birth_time_rectification_cases_candidate_result_check,
drop constraint if exists birth_time_rectification_cases_status_check;
alter table public.birth_time_rectification_cases
add constraint birth_time_rectification_cases_life_events_check check (
jsonb_typeof(life_events) = 'array'
),
add constraint birth_time_rectification_cases_candidate_result_check check (
jsonb_typeof(candidate_result) = 'object'
),
add constraint birth_time_rectification_cases_status_check check (
status in ('assessing', 'rectifying', 'candidate', 'confirming', 'confirmed')
);
revoke update (
life_events,
candidate_result,
event_scoring_version,
candidate_result_id,
candidate_saved_at,
confirmed_time,
confirmed_at
) on table public.birth_time_rectification_cases from authenticated;
grant all on table public.birth_time_rectification_cases to service_role;
create or replace function public.confirm_birth_time_candidate(
p_user_id uuid,
p_case_id uuid,
p_result_id uuid,
p_time time without time zone,
p_snapshot jsonb
)
returns void
language plpgsql
security definer
set search_path = ''
as $$
begin
update public.birth_time_rectification_cases
set
status = 'confirmed',
journey_snapshot = p_snapshot,
confirmed_time = p_time,
confirmed_at = now(),
updated_at = now()
where id = p_case_id
and user_id = p_user_id
and candidate_result_id = p_result_id
and status = 'confirming'
and candidate_result ->> 'confidence' = 'high'
and (candidate_result ->> 'canApply')::boolean is true
and candidate_result #>> '{winningSegment,representativeTime}' = to_char(p_time, 'HH24:MI');
if not found then
raise exception 'stale_or_ineligible_birth_time_candidate';
end if;
update public.profiles
set
active_birth_time = p_time,
birth_time = p_time,
birth_time_status = 'confirmed'
where id = p_user_id
and rectification_case_id = p_case_id;
if not found then
raise exception 'birth_time_profile_not_found';
end if;
end;
$$;
revoke all on function public.confirm_birth_time_candidate(uuid, uuid, uuid, time without time zone, jsonb)
from public, anon, authenticated;
grant execute on function public.confirm_birth_time_candidate(uuid, uuid, uuid, time without time zone, jsonb)
to service_role;
commit;