PR#3 (A): RLS de escrita p/ print_area_techniques e supplier_branches#527
Conversation
…supplier_branches Fecha os 2 únicos gaps de RLS de escrita encontrados na auditoria das 13 tabelas do Plano A (as outras 11 já tinham insert/update/delete por role/org). - print_area_techniques (filha de products via product_id): espelha product_variants — insert/update via user_is_org_member, delete via is_org_owner_or_admin, resolvendo a org pelo produto-pai. A policy service_role (pat_all_service) fica intacta. - supplier_branches (filha de suppliers via supplier_id): espelha suppliers — insert/update/delete via is_org_owner_or_admin, org resolvida pelo fornecedor-pai. Idempotente (DROP POLICY IF EXISTS + CREATE). Expressões validadas via EXPLAIN contra o schema real (colunas/funções/joins resolvem). tecnica_gravacao_variante e fornecedor_gravacao não existem como tabelas — fora de escopo (escrita a elas é LOUD). Inócuo sem o código do PR#2; pode mergear primeiro/independente.
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughMigration habilita RLS em ChangesRLS Write Policies — print_area_techniques e supplier_branches
Pontos de Atenção de Segurança
🎯 2 (Simple) | ⏱️ ~12 minutos ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Updates to Preview Branch (feat/a-rls-write-policies) ↗︎
Tasks are run on every commit but only new migration files are pushed.
❌ Branch Error • Sat, 30 May 2026 16:49:15 UTC View logs for this Workflow Run ↗︎. |
…destrutivo) O passo destrutivo do PR#4 (deletar a Edge Function + limpar kill-switch) é GATED em "A verde" (merge de #525/#527 + soak em prod) — A ainda está em draft. Em vez de disparar a remoção fora de ordem (que quebraria o fallback do main e o rollback do PR#2), este PR entrega o runbook com a ordem correta e duas armadilhas documentadas: 1. fail-open do kill-switch: DELETE da linha RELIGA a bridge (enabled=true) — nunca deletar a linha enquanto o cliente ainda a lê. 2. main ainda usa a bridge como fallback até o PR#2 mergear — não deletar a função antes. Inclui ordem de execução, critérios de soak e rollback. Nenhuma alteração de código ou DDL; nada destrutivo é executado aqui.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Rebase limpo sobre main atual (inclui #526 telemetria, #527 RLS, #530). - bridge.ts: WRITE_OPERATIONS + isWriteOperation() + WriteUnavailableError; escrita com bridge OFF / kill-switch / CORS agora LANCA em vez de retornar vazio. Leitura mantem vazio silencioso. Telemetria do #526 preservada (recordBridgeCall/recordKillSwitchHit) — recordCall roda ANTES do throw. - index.ts: exporta isWriteOperation + WriteUnavailableError. Apenas estes 2 arquivos (rest-native writes + testes ficam no #525).
…A) (#531) * PR#1 (C): escrita falha LOUD em vez de no-op silencioso Rebase limpo sobre main atual (inclui #526 telemetria, #527 RLS, #530). - bridge.ts: WRITE_OPERATIONS + isWriteOperation() + WriteUnavailableError; escrita com bridge OFF / kill-switch / CORS agora LANCA em vez de retornar vazio. Leitura mantem vazio silencioso. Telemetria do #526 preservada (recordBridgeCall/recordKillSwitchHit) — recordCall roda ANTES do throw. - index.ts: exporta isWriteOperation + WriteUnavailableError. Apenas estes 2 arquivos (rest-native writes + testes ficam no #525). * test(A): cobertura do caminho de escrita REST nativo (Plano A) — 12 testes das 6 guardas + remap + LOUD * feat(A): escrita REST nativo (Plano A) em rest-native.ts — 6 guardas, remap EN→PT, fail LOUD; preserva telemetria #526 * style(A): normaliza separadores de comentário em rest-native.ts (byte-exato ao artefato validado) * style(A): separadores uniformes em rest-native.ts (determinístico, byte-exato 32a30c5c) * feat(A)+test: wire write fast-path em bridge.ts (tryExecuteRestNativeWrite) + corrige bridge.test.ts (evita REST path no mock) — 23/23 verde
…destrutivo) (#528) O passo destrutivo do PR#4 (deletar a Edge Function + limpar kill-switch) é GATED em "A verde" (merge de #525/#527 + soak em prod) — A ainda está em draft. Em vez de disparar a remoção fora de ordem (que quebraria o fallback do main e o rollback do PR#2), este PR entrega o runbook com a ordem correta e duas armadilhas documentadas: 1. fail-open do kill-switch: DELETE da linha RELIGA a bridge (enabled=true) — nunca deletar a linha enquanto o cliente ainda a lê. 2. main ainda usa a bridge como fallback até o PR#2 mergear — não deletar a função antes. Inclui ordem de execução, critérios de soak e rollback. Nenhuma alteração de código ou DDL; nada destrutivo é executado aqui.
O que faz
Fecha os 2 únicos gaps de RLS de escrita encontrados na auditoria das 13 tabelas-base do Plano A. As outras 11 (
products,suppliers,categories,product_variants,variant_supplier_sources,collections,collection_products,tecnicas_gravacao,tabela_preco_gravacao_oficial) já tinham insert/update/delete por role/org — o "write gap" era client-side (rest-native não roteava escrita), resolvido no PR#2.Gaps fechados:
print_area_techniques(filha deproductsviaproduct_id): só tinhapat_all_service(service_role). Espelhaproduct_variants— insert/update viauser_is_org_member, delete viais_org_owner_or_admin, org resolvida pelo produto-pai. A policypat_all_servicefica intacta.supplier_branches(filha desuppliersviasupplier_id): nenhuma policy de escrita. Espelhasuppliers— insert/update/delete viais_org_owner_or_admin, org resolvida pelo fornecedor-pai.Segurança
Modelo idêntico ao das tabelas-irmãs (anon não escreve: os helpers
is_org_owner_or_admin/user_is_org_memberretornam false semauth.uid()). Isso elimina a única superfície de risco que a simulação do Plano A apontou (policy permissiva demais) — aqui as policies são role/org-scoped, espelhadas de policies já auditadas.Validação
DROP POLICY IF EXISTS+CREATE(+ENABLE RLSno-op).EXPLAINcontra o schema de produção (colunasproduct_id/supplier_id/organization_id, funçõesis_org_owner_or_admin/user_is_org_membere os joins resolvem).tecnica_gravacao_varianteefornecedor_gravacaonão existem como tabelas — fora de escopo (escrita a elas falha LOUD via PR#1/fix(imports): corrigir 32 imports quebrados pelo refactor T1 (19/mai) #2, nunca silenciosa).Ordem de merge
Inócuo sem o código do PR#2 → pode/deve mergear primeiro ou junto. Com #3 aplicado, a escrita do Plano A (PR#2) passa a persistir nas 13 tabelas; sem #3, falha LOUD nas 2 (honesto).
Série: #1 (C) → #2 (A núcleo) → #3 (A RLS) → #4 (aposentar bridge).
Summary by cubic
Adds write RLS policies for
print_area_techniquesandsupplier_branches, mirroring their parent tables’ org-scoped rules. This closes the last two write gaps so authenticated native REST writes work across all 13 tables.print_area_techniques: insert/update allowed foruser_is_org_memberof parentproducts; delete requiresis_org_owner_or_admin. Keepspat_all_serviceunchanged.supplier_branches: insert/update/delete allowed only foris_org_owner_or_adminof parentsuppliers.product_id/supplier_id; anonymous users cannot write.Written for commit d64f6ec. Summary will update on new commits.
Summary by CodeRabbit
Bug Fixes
Chores