From 77ef06fde7408dea9cf23c149f3311d03e0b09a5 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 13 Jun 2026 13:34:51 -0300 Subject: [PATCH] wiki: F6.2 Lote B done Co-Authored-By: Claude Fable 5 --- Obsidian/Brain/log.md | 3 +++ Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Obsidian/Brain/log.md b/Obsidian/Brain/log.md index ef5a823..4ea02c6 100644 --- a/Obsidian/Brain/log.md +++ b/Obsidian/Brain/log.md @@ -1660,3 +1660,6 @@ Touched: Migracao Schema-per-Tenant ## [2026-06-13 12:53] session | F6.0+F6.1 clones + migracao dados; plano F6.2 Touched: Migracao Schema-per-Tenant + +## [2026-06-13 13:34] session | F6.2 Lote A+B triggers (agnosticos + schema-aware) +Touched: Migracao Schema-per-Tenant diff --git a/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md b/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md index 2a1c930..7dd6d7e 100644 --- a/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md +++ b/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md @@ -17,8 +17,9 @@ Inventário de triggers (81 attachments nas tabelas tenant em public): - **`financial_records_inject_tenant` → OBSOLETO** no schema (não há coluna tenant_id) — NÃO anexar. Sub-lotes propostos (cada um com smoke test + commit): -- **A** triggers schema-agnósticos: anexar aos 9 schemas + embutir no clone_tenant_template (backfill + futuro). -- **B** triggers schema-aware: reescrever (search_path dinâmico) + anexar. +- **A** ✅ DONE (commit d58b939, migration 20260613000004): `attach_agnostic_triggers(schema)` recria os triggers agnósticos (8 setters updated_at + 2 prevent_*) nos 9 schemas (54 triggers/schema). Smoke: set_updated_at dispara. Wiring no clone fica pro fim da F6.2. +- **B** ✅ DONE (commit 5741e10, manual/f6_2b_schema_aware_triggers.supabase_admin.sql — roda como supabase_admin pois trigger fns são owned por supabase_admin). 14 funcs reescritas (set_config search_path dinâmico + tenant_id_for_schema p/ audit_logs global); sync_busy_mirror cross-tenant via tenant_schema_for+EXECUTE format; financial_records_inject_tenant obsoleto (não anexado). Detach dos 14 de public + attach 22 triggers/schema (defs reais, tenant_id removido de WHEN/UPDATE OF). Smoke: sessão→realizado cria financial_record no schema + audit roteia tenant_id certo + timeline OK. + - **Gotchas Lote B**: (1) trigger functions owned por supabase_admin → CREATE OR REPLACE só como supabase_admin (vira manual, não db.cjs). (2) Triggers reais tinham `WHEN (new.tenant_id=new.owner_id)` e `UPDATE OF tenant_id,...` → quebram no schema; remover tenant_id dos WHEN/colunas ao re-anexar. (3) Estratégia hybrid: detach de public pra função reescrita não rodar errada lá. - **C** split notifications: `public.notifications_sistema` (tipos cross-tenant: avisos SaaS, suporte, system_alert) + `tenant_.notifications` (locais); refatorar notify_user/notify_tenant_admins/notify_all_devs/mark/archive (2 variantes); migrar dados por type; `useNotifications.js` lê 2 fontes (campo `_origem`), realtime 2 canais; ALTER PUBLICATION add notifications_sistema. - **D** RPCs de usuário (~30: mark_as_paid, create_financial_record_for_session, safe_delete_patient, search_global, cancel_recurrence_from, export_patient_data…) → `p_tenant_id` validado com `is_tenant_member` + `set_config(search_path)`. - **E** RPCs global/cron (~10: populate/cleanup/unstick_notification_queue, sync_overdue_financial_records, whatsapp_heartbeat_*, sla_*) → loop `FROM tenants`.