From 218d3421813768cc04ba31bdb13b0822df604f28 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 13 Jun 2026 16:01:29 -0300 Subject: [PATCH] wiki: F6.2 completa (Lote G) Co-Authored-By: Claude Fable 5 --- Obsidian/Brain/log.md | 3 +++ Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Obsidian/Brain/log.md b/Obsidian/Brain/log.md index b39a879..27fcdb6 100644 --- a/Obsidian/Brain/log.md +++ b/Obsidian/Brain/log.md @@ -1678,3 +1678,6 @@ Touched: Migracao Schema-per-Tenant ## [2026-06-13 15:51] session | F6.2 Lote F anon/token RPCs Touched: Migracao Schema-per-Tenant + +## [2026-06-13 16:01] session | F6.2 Lote G + F6.2 COMPLETA (66 funcoes) +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 f90b637..88e89a1 100644 --- a/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md +++ b/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md @@ -32,7 +32,10 @@ Sub-lotes propostos (cada um com smoke test + commit): - **Gotchas Lote E**: (1) service_role NÃO é tenant_member → RPCs de cron precisam de helper sem auth-check + REVOKE de authenticated (senão um user chamaria com tenant arbitrário). (2) conversation_messages NÃO tem coluna thread_key (é computada na view) → analytics computa inline. (3) DROP+CREATE de nova assinatura: dropar AMBAS (velha+nova) p/ idempotência. - **F** ✅ DONE (commit 1243a12, manual/f6_2f_anon_token_rpcs.supabase_admin.sql + 2 FE; build passa). Documentos anon resolvem tenant de `document_share_links.tenant_id` (public/F1b); agendador de `agendador_configuracoes.tenant_id`. document/document_signatures/access_logs/agenda no schema; share_links/agendador_* ficam public. %ROWTYPE→RECORD, RETURNS document_signatures→jsonb. sign_document_by_signature_id (paciente logado, NÃO é member): unchecked + auth por LINHA (signatario_id/email/doc do paciente). match_patient_by_phone: unchecked + REVOKE authenticated (só service). list_my_signatures: fan-out cross-schema. RPCs public-only (intake/invite/agendador_gerar_slug) SEM mudança. FE: signByPortal(tenantId,...). - **Gotcha Lote F**: paciente assinante NÃO é tenant_member → autorizar por LINHA (dono da assinatura), não por membership. Anon resolve tenant SEMPRE da tabela public que tem o token+tenant_id. -- **G** SQL→plpgsql (8: can_delete_patient, get_financial_report/summary, list_financial_records, get_patient_session_counts, get_entity_primary_phone, _first_response_runs) — DROP+CREATE (muda linguagem). +- **G** ✅ DONE (commit ee82985, manual/f6_2g_sql_to_plpgsql.supabase_admin.sql + 3 FE; build passa). 5 funções SQL→plpgsql + p_tenant_id + _tenant_route (get_financial_summary/report, list_financial_records SETOF→jsonb, get_patient_session_counts sem filtro tenant_id). get_entity_primary_phone (interno) herda search_path. can_delete_patient/_first_response_runs já feitas em D/E. FE: p_tenant_id nas 3 RPCs financeiras. + +## ✅✅ F6.2 COMPLETA (2026-06-13) — 66 funções migradas +Triggers (A agnósticos + B schema-aware + C notif) + RPCs (D usuário + E cron + F anon/token + G SQL→plpgsql). Tudo smoke-testado, build passa. Próximo: **wiring no clone** + **F6.3 DROP** (com OK do Leonardo). - Depois: re-anexar todos triggers reescritos nos 9 + clone. Então **F6.3 DROP** (com OK). ## F5 — entregue (commit 6b542cd) — PRIMEIRO teste real via HTTP do PostgREST