90 lines
2.8 KiB
PL/PgSQL
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;
|