fix(db): implementa identidade persistente segura para homologacao
ci / lint, typecheck, testes e build (push) Canceled after 0s
ci / Postgres e Redis reais (push) Canceled after 0s
ci / imagem Docker Linux (push) Canceled after 0s

This commit is contained in:
Ferraz Fagundes committed 2026-10-19 23:39:05 -03:00
1 parent 2c8c5d9507
commit a4f0a2f649
11 files changed
+1146 -106

No files matched your search

+113
View File
@@ -0,0 +1,113 @@
-- Remove somente os objetos conhecidos de adaptador_guard.
-- Recusa se faltar peça, se houver objeto estranho ou se outro schema depender da identidade.
-- Não apaga auth, storage, public nem app.settings.jwt_exp.
-- O bloco e os DROP seguem juntos: se a conferência falhar, nada é removido.
do $revert$
begin
if not exists (select 1 from pg_catalog.pg_namespace where nspname = 'adaptador_guard') then
raise exception 'marcador_ausente' using errcode = 'P0002';
end if;
if exists (
select kind, name
from (
select 'missing'::text as kind, 'project_identity'::text as name
where exists (select 1 from pg_catalog.pg_namespace where nspname = 'adaptador_guard')
and not exists (
select 1
from pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'adaptador_guard' and c.relname = 'project_identity' and c.relkind = 'r'
)
union all
select 'missing', 'adapter_project_identity'
where exists (select 1 from pg_catalog.pg_namespace where nspname = 'adaptador_guard')
and not exists (
select 1
from pg_catalog.pg_proc p
join pg_catalog.pg_namespace n on n.oid = p.pronamespace
where n.nspname = 'adaptador_guard' and p.proname = 'adapter_project_identity'
)
union all
select 'missing', 'reject_identity_change'
where exists (select 1 from pg_catalog.pg_namespace where nspname = 'adaptador_guard')
and not exists (
select 1
from pg_catalog.pg_proc p
join pg_catalog.pg_namespace n on n.oid = p.pronamespace
where n.nspname = 'adaptador_guard' and p.proname = 'reject_identity_change'
)
union all
select 'unknown_relation', c.relname
from pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'adaptador_guard'
and not (
(c.relname = 'project_identity' and c.relkind = 'r')
or (
c.relkind = 'i'
and exists (
select 1
from pg_catalog.pg_index i
join pg_catalog.pg_class t on t.oid = i.indrelid
where i.indexrelid = c.oid
and t.relname = 'project_identity'
and t.relnamespace = n.oid
)
)
)
union all
select 'unknown_function', p.proname
from pg_catalog.pg_proc p
join pg_catalog.pg_namespace n on n.oid = p.pronamespace
where n.nspname = 'adaptador_guard'
and p.proname not in ('adapter_project_identity', 'reject_identity_change')
union all
select 'unknown_type', t.typname
from pg_catalog.pg_type t
join pg_catalog.pg_namespace n on n.oid = t.typnamespace
where n.nspname = 'adaptador_guard'
and not exists (
select 1
from pg_catalog.pg_class c
where c.oid = t.typrelid
and c.relname = 'project_identity'
and c.relnamespace = n.oid
)
and not exists (
select 1
from pg_catalog.pg_type elem
join pg_catalog.pg_class c on c.oid = elem.typrelid
where elem.oid = t.typelem
and c.relname = 'project_identity'
and c.relnamespace = n.oid
)
union all
select 'external', vn.nspname || '.' || v.relname
from pg_catalog.pg_depend d
join pg_catalog.pg_rewrite rw on rw.oid = d.objid
join pg_catalog.pg_class v on v.oid = rw.ev_class
join pg_catalog.pg_namespace vn on vn.oid = v.relnamespace
join pg_catalog.pg_class t on t.oid = d.refobjid
join pg_catalog.pg_namespace tn on tn.oid = t.relnamespace
where tn.nspname = 'adaptador_guard'
and vn.nspname <> 'adaptador_guard'
union all
select 'external', n.nspname || '.' || p.proname
from pg_catalog.pg_depend d
join pg_catalog.pg_proc p on p.oid = d.objid
join pg_catalog.pg_namespace n on n.oid = p.pronamespace
join pg_catalog.pg_class t on t.oid = d.refobjid
join pg_catalog.pg_namespace tn on tn.oid = t.relnamespace
where tn.nspname = 'adaptador_guard'
and n.nspname <> 'adaptador_guard'
) findings
) then
raise exception 'reversao_recusada' using errcode = '55000';
end if;
end
$revert$;
drop function adaptador_guard.adapter_project_identity();
drop table adaptador_guard.project_identity;
drop function adaptador_guard.reject_identity_change();
drop schema adaptador_guard restrict;