106 lines
3.7 KiB
PL/PgSQL
106 lines
3.7 KiB
PL/PgSQL
-- =========================================================
|
|
-- INTakes / Cadastros Recebidos - Supabase Local
|
|
-- =========================================================
|
|
|
|
-- 0) Extensões úteis (geralmente já existem no Supabase, mas é seguro)
|
|
create extension if not exists pgcrypto;
|
|
|
|
-- 1) Função padrão para updated_at
|
|
create or replace function public.set_updated_at()
|
|
returns trigger
|
|
language plpgsql
|
|
as $$
|
|
begin
|
|
new.updated_at = now();
|
|
return new;
|
|
end;
|
|
$$;
|
|
|
|
-- 2) Tabela patient_intake_requests (espelhando nuvem)
|
|
create table if not exists public.patient_intake_requests (
|
|
id uuid primary key default gen_random_uuid(),
|
|
owner_id uuid not null,
|
|
token text,
|
|
name text,
|
|
email text,
|
|
phone text,
|
|
notes text,
|
|
consent boolean not null default false,
|
|
status text not null default 'new',
|
|
created_at timestamptz not null default now(),
|
|
updated_at timestamptz not null default now(),
|
|
payload jsonb
|
|
);
|
|
|
|
-- 3) Índices (performance em listagem e filtros)
|
|
create index if not exists idx_intakes_owner_created
|
|
on public.patient_intake_requests (owner_id, created_at desc);
|
|
|
|
create index if not exists idx_intakes_owner_status_created
|
|
on public.patient_intake_requests (owner_id, status, created_at desc);
|
|
|
|
create index if not exists idx_intakes_status_created
|
|
on public.patient_intake_requests (status, created_at desc);
|
|
|
|
-- 4) Trigger updated_at
|
|
drop trigger if exists trg_patient_intake_requests_updated_at on public.patient_intake_requests;
|
|
|
|
create trigger trg_patient_intake_requests_updated_at
|
|
before update on public.patient_intake_requests
|
|
for each row execute function public.set_updated_at();
|
|
|
|
-- 5) RLS
|
|
alter table public.patient_intake_requests enable row level security;
|
|
|
|
-- 6) Policies (iguais às que você mostrou na nuvem)
|
|
drop policy if exists intake_select_own on public.patient_intake_requests;
|
|
create policy intake_select_own
|
|
on public.patient_intake_requests
|
|
for select
|
|
to authenticated
|
|
using (owner_id = auth.uid());
|
|
|
|
drop policy if exists intake_update_own on public.patient_intake_requests;
|
|
create policy intake_update_own
|
|
on public.patient_intake_requests
|
|
for update
|
|
to authenticated
|
|
using (owner_id = auth.uid())
|
|
with check (owner_id = auth.uid());
|
|
|
|
drop policy if exists "delete own intake requests" on public.patient_intake_requests;
|
|
create policy "delete own intake requests"
|
|
on public.patient_intake_requests
|
|
for delete
|
|
to authenticated
|
|
using (owner_id = auth.uid());
|
|
|
|
-- =========================================================
|
|
-- OPCIONAL (RECOMENDADO): registrar conversão
|
|
-- =========================================================
|
|
-- Se você pretende marcar intake como convertido e guardar o patient_id:
|
|
alter table public.patient_intake_requests
|
|
add column if not exists converted_patient_id uuid;
|
|
|
|
create index if not exists idx_intakes_converted_patient_id
|
|
on public.patient_intake_requests (converted_patient_id);
|
|
|
|
-- Opcional: impedir delete de intakes convertidos (melhor para auditoria)
|
|
-- (Se quiser manter delete liberado como na nuvem, comente este bloco.)
|
|
drop policy if exists "delete own intake requests" on public.patient_intake_requests;
|
|
create policy "delete_own_intakes_not_converted"
|
|
on public.patient_intake_requests
|
|
for delete
|
|
to authenticated
|
|
using (owner_id = auth.uid() and status <> 'converted');
|
|
|
|
-- =========================================================
|
|
-- OPCIONAL: check de status (evita status inválido)
|
|
-- =========================================================
|
|
alter table public.patient_intake_requests
|
|
drop constraint if exists chk_intakes_status;
|
|
|
|
alter table public.patient_intake_requests
|
|
add constraint chk_intakes_status
|
|
check (status in ('new', 'converted', 'rejected'));
|