From 96f4543138433652d8731cdeb6ca348748129273 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 13 Jun 2026 17:02:53 -0300 Subject: [PATCH] wiki: F6.4 SaaS-admin resolvida, F6.3 desbloqueada Co-Authored-By: Claude Fable 5 --- Obsidian/Brain/log.md | 3 +++ .../Brain/wiki/Migracao Schema-per-Tenant.md | 5 +++- ...op_public_tenant_tables.supabase_admin.sql | 27 +++++++------------ 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/Obsidian/Brain/log.md b/Obsidian/Brain/log.md index 7013650..6597eab 100644 --- a/Obsidian/Brain/log.md +++ b/Obsidian/Brain/log.md @@ -1687,3 +1687,6 @@ Touched: Migracao Schema-per-Tenant ## [2026-06-13 16:45] session | F6.3 preparada (nao-aplicada) + itens SaaS-admin Touched: Migracao Schema-per-Tenant + +## [2026-06-13 17:02] session | F6.4 superficie SaaS-admin resolvida (F6.3 desbloqueada) +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 e08e1ef..265584d 100644 --- a/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md +++ b/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md @@ -39,7 +39,10 @@ Triggers (A agnósticos + B schema-aware + C notif) + RPCs (D usuário + E cron - ✅ **wiring DONE** (commit dc7826d, manual/f6_2h_clone_wiring.supabase_admin.sql): trigger AFTER INSERT em tenant_schemas (trg_attach_business_triggers) dispara os 3 attach pro schema novo → tenant novo nasce com 84 triggers. attach_agnostic agora SELF-CONTAINED (dirigido por colunas, não lê public — sobrevive ao DROP). provision_account_tenant: clone ANTES do seed. Smoke OK. - **F6.3 DROP** 📋 PREPARADA não-aplicada (commit cdb9ce1, manual/f6_3_drop_public_tenant_tables.supabase_admin.sql): pré-flight assert + 2 FKs viram coluna solta (document_share_links.documento_id, whatsapp_credits_transactions.conversation_message_id) + dropa 9 views public + DROP CASCADE das 78 + limpa financial_records_inject_tenant. **BLOQUEADA** pelos itens em aberto abaixo. -## ⛔ ITENS EM ABERTO antes do F6.3 DROP (verificados: 16 reads FE públicos remanescentes, TODOS aqui) +## ✅ SUPERFÍCIE SaaS-ADMIN RESOLVIDA (F6.4, commit dc2363b) +RPCs `saas_admin` (manual/f6_4_saas_admin_rpcs.supabase_admin.sql): defaults editados no `_tenant_template` + fan-out pros schemas (saas_list/add/remove_default_feriado; saas_*_default_notif_template; saas_count_notif_template_overrides). Cross-tenant: `saas_list_all_whatsapp_channels` (fan-out, substitui v_twilio_whatsapp_overview). FE: SaasFeriadosPage/SaasNotificationTemplatesPage → RPCs; SaasWhatsappPage → `supabase.schema(tenant_)` (RLS permite saas_admin) p/ tenant selecionado + RPC p/ overview; getAllChannels → RPC. **Varredura confirma ZERO supabase.from('') público no FE.** F6.3 DESBLOQUEADA (falta só Leonardo testar app + backup). TODOs deixados: stat-cards de feriados (cidade/estado) e incidents-7d viraram 0 (UI degrada sem crash). + +## (histórico) ITENS EM ABERTO antes do F6.3 DROP — RESOLVIDOS acima Superfície **SaaS-admin / cross-tenant** que ainda lê `public.` e quebraria no DROP: 1. **SaasWhatsappPage.vue + v_twilio_whatsapp_overview + twilioWhatsappService.getAllChannels()** — admin cross-tenant de canais WhatsApp (notification_channels/whatsapp_connection_incidents). Reescrever fan-out por schema OU usar `public.channel_routing`. 2. **SaasNotificationTemplatesPage.vue** — gerencia templates DEFAULT do sistema (tenant_id NULL). Apontar pra `_tenant_template.notification_templates` (os defaults vivem lá agora). diff --git a/database-novo/manual/f6_3_drop_public_tenant_tables.supabase_admin.sql b/database-novo/manual/f6_3_drop_public_tenant_tables.supabase_admin.sql index bf1076e..749d601 100644 --- a/database-novo/manual/f6_3_drop_public_tenant_tables.supabase_admin.sql +++ b/database-novo/manual/f6_3_drop_public_tenant_tables.supabase_admin.sql @@ -18,24 +18,15 @@ -- --schema=public --no-owner --no-acl > database-novo/backups/pre-F6.3/public.sql -- -- ───────────────────────────────────────────────────────────────────────────── --- ⛔ ITENS EM ABERTO (resolver ANTES de aplicar) — superfície SaaS-admin / anon --- que AINDA aponta pra public e quebraria com o DROP: --- --- 1. v_twilio_whatsapp_overview + twilioWhatsappService.getAllChannels() --- → view SaaS-admin cross-tenant sobre notification_channels + --- twilio_subaccount_usage (tenant). Reescrever getAllChannels pra varrer --- os schemas (ou usar public.channel_routing) antes do DROP. --- 2. Páginas SaaS revertidas na F3 (SaasFeriadosPage, SaasNotificationTemplates, --- SaasDocumentTemplates, SaasWhatsappPage) — gerenciam defaults do sistema / --- views cross-tenant; hoje leem public.. Redirecionar pra --- _tenant_template (defaults) ou fan-out por schema. --- 3. notification-webhook (Meta) — fan-out por message_id em public; conferir --- que só usa channel_routing/schemas. --- 4. AgendadorPublicoPage — já usa RPCs roteadas (OK); confirmar. --- --- Rodar pra detectar referências FE remanescentes a tabelas tenant em public: --- grep -rnE "supabase\.from\('(patients|agenda_eventos|financial_records| --- documents|notification_channels|conversation_messages|...)'\)" src +-- ✅ ITENS EM ABERTO — RESOLVIDOS (F6.4, commit dc2363b): +-- 1. v_twilio_whatsapp_overview / getAllChannels → RPC saas_list_all_whatsapp_ +-- channels (fan-out). ✓ +-- 2. SaasFeriadosPage / SaasNotificationTemplatesPage / SaasWhatsappPage → +-- RPCs saas_*_default + supabase.schema(tenant_). ✓ +-- 3. notification-webhook (Meta) → confirmado: usa tdb/schema (F4). ✓ +-- 4. AgendadorPublicoPage → RPCs roteadas. ✓ +-- Varredura FE confirma ZERO supabase.from('') público restante. +-- PRÉ-REQUISITO FINAL: Leonardo testar o app + backup fresco. -- ───────────────────────────────────────────────────────────────────────────── -- =============================================================================