From a85716b0eacdfc36e7b2f0ba8936af1c160e9fd0 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 13 Jun 2026 09:26:16 -0300 Subject: [PATCH] wiki: F5 schema-per-tenant Co-Authored-By: Claude Fable 5 --- Obsidian/Brain/log.md | 3 +++ Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Obsidian/Brain/log.md b/Obsidian/Brain/log.md index 3af18ef..91305d7 100644 --- a/Obsidian/Brain/log.md +++ b/Obsidian/Brain/log.md @@ -1654,3 +1654,6 @@ Touched: Migracao Schema-per-Tenant ## [2026-06-13 09:10] session | F4 edge functions + F1b anon-tables-public Touched: Migracao Schema-per-Tenant + +## [2026-06-13 09:26] session | F5 PostgREST expoe schemas tenant (E2E HTTP) +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 a818ec2..c6797c5 100644 --- a/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md +++ b/Obsidian/Brain/wiki/Migracao Schema-per-Tenant.md @@ -1,6 +1,16 @@ # Migração Schema-per-Tenant -**Status:** F4 concluída no branch `feat/schema-per-tenant` (2026-06-13). Próximo: decisão de roteamento anon-por-token, depois F5 (PostgREST). F0-F2 em `main`; F3+ no branch até cutover. +**Status:** F5 concluída e testada E2E via HTTP (2026-06-13). Próximo: F6 (rewrite funções + migração de dados + drops). F0-F2 em `main`; F3+/F1b/F5 no branch até cutover. + +## F5 — entregue (commit 6b542cd) — PRIMEIRO teste real via HTTP do PostgREST +- `postgres` NÃO é superuser neste stack → não consegue `ALTER ROLE authenticator`. Quem consegue: `supabase_admin` (superuser, conecta com senha `postgres` via `psql -U supabase_admin -h 127.0.0.1`). +- `database-novo/manual/f5_pgrst_refresh_schemas.supabase_admin.sql` (aplicar como supabase_admin, fora do db.cjs): `public.refresh_pgrst_schemas()` (SECDEF owned supabase_admin) deriva a lista de `tenant_schemas`, seta `pgrst.db_schemas` in-database na role authenticator, `NOTIFY pgrst reload config/schema`. **Expõe/retira schema SEM restart**; a GUC persiste em pg_db_role_setting (sobrevive a stop/start) e SUPERSEDE o config.toml em runtime. +- migration `20260613000002`: trigger em `tenant_schemas` (AFTER INSERT/DELETE/UPDATE, statement-level) dispara o refresh → clone_tenant_template e drop_tenant_schema NÃO precisaram ser tocados. +- config.toml (gitignored): baseline `public, graphql_public` + comentário; in-db config supersede. +- **E2E via curl**: clone → `pgrst.db_schemas` inclui tenant_x → `GET /rest/v1/patients` com `Accept-Profile: tenant_x` retorna **200** (vs **406** pra schema inexistente); drop → volta 406. Tudo sem restart de container. Primeira validação real do stack F1-F5 pelo caminho HTTP do PostgREST. + +### Gotcha F5 +- PostgREST in-database config (db-config ligada por padrão, sem `PGRST_DB_CONFIG=false`): `ALTER ROLE authenticator SET pgrst.db_schemas` + `NOTIFY pgrst, 'reload config'` é a via pra schemas dinâmicos sem restart. `reload schema` sozinho NÃO adiciona schema novo à lista exposta — só recarrega o cache dos já expostos. ## F4 — entregue (branch, commit 9b21642) - `_shared/tenant.ts`: helper das edge functions — `adminClient()` (service_role/public), `tenantDbForId(admin, tenantId)`, `schemaForTenant`, `listTenantSchemas` (crons varrem todos), `resolveTenantByChannel` (webhook→tenant via channel_routing), `tenantSchemaName`