fix(webhook-inbound): refactor híbrido v1/v2 + idempotência + migrations seguras#460
Conversation
…ons seguras
Contexto:
- Lovable em 26/05 (commits 14:09-14:41 UTC) reescreveu webhook-inbound
com mensagem "Fast Visual Edit" mas removeu funcionalidades críticas
(versionamento de contrato v1/v2, allowlist legada, headers de sunset,
resposta 426 para v1 bloqueada, métrica de adoção de contrato).
- Trouxe também 3 migrations problemáticas que não foram aplicadas.
Webhook-inbound — versão híbrida:
✅ Preserva:
- Lógica v1/v2 com readRequestedVersion() e parseAllowlist()
- Headers Deprecation/Sunset/Warning para v1 deprecada
- Response 426 para v1 não-allowlisted
- WEBHOOK_INBOUND_V1_COMPAT_ENABLED e WEBHOOK_INBOUND_V1_ALLOWLIST
- Métrica estruturada webhook_inbound_contract_version_adoption
✅ Incorpora do refactor:
- Idempotency via x-idempotency-key, payload.idempotency_key ou hash da
assinatura HMAC (fallback). Validação 8-256 chars.
- Tratamento 23505 (unique_violation) como duplicate em race condition
- Structured logger + request-id propagado
- retrySupabaseCall em todas as queries críticas
- RPC increment_webhook_stats (atômico, sem race)
✅ Corrige bugs presentes em AMBAS as versões anteriores:
- INSERT usa colunas reais: ip_address (não source_ip), error_message
(não error). A versão antiga inseria em colunas inexistentes —
silenciosamente, com payload truncado.
Migrations:
- 20260526141234 (RLS user_roles/order_items/admin_audit_log): convertido
para NO-OP com comentário explicando por quê (DROP POLICY em massa sem
revisão; chama can_view_all_sales(auth.uid()) mas função tem 0 args;
modelo organization_members diverge do guarded atual).
- 20260526141615 (idempotency_key + contract_version): reescrito.
contract_version já existe NOT NULL — não tocar. idempotency_key
adicionado nullable com índice único parcial.
- 20260526141659 (increment_webhook_stats): mantido com ACL explícito
(service_role + postgres only).
Migrations seguras (141615 e 141659) JÁ APLICADAS no banco
doufsxqlfjyuvxuezpln. RLS rewrite (141234) deixado para PR humano dedicado.
Build local: ✅ npm run build 1m49s
Banco validado: ✅ idempotency_key existe, idx_webhook_idempotency criado,
increment_webhook_stats função criada com ACL correta
Co-authored-by: Claude <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
Warning Review limit reached
More reviews will be available in 48 minutes. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Implementa as 4 melhorias sugeridas no PR #460 para prevenir recorrência dos 3 padrões problemáticos identificados em 26/05. 1. .github/workflows/detect-base64-content.yml (NOVO) CI check que detecta arquivos texto acidentalmente commitados em base64 (linha >=200 chars com alfabeto [A-Za-z0-9+/=]). Roda em pull_request + push para main. Falha o check se achar. Self-tested: 0 false positives no repo atual, true positive em payload sintético, true negative em prosa longa. Cobre regressão dos PRs #319, #457, #459. 2. .coderabbit.yaml (UPDATE) Adiciona 3 alertas: - ALERTA DE DRIFT em supabase/functions/**/*.ts: flag PRs com título/commit "Fast Visual Edit"/"visual"/"stepper" tocando edge functions — caso PR #460. - ALERTA DE DRIFT em supabase/migrations/**/*.sql: idem para migrations, com checks específicos (DROP POLICY massa, ADD COLUMN no-op, SECURITY DEFINER sem REVOKE). - Detecção base64 em arquivos texto como reforço do workflow. 3. .github/workflows/required-checks-guard.yml (UPDATE) Estende verificação existente para também checar que algum check do Vercel/deploy está como required em main. Tolerante: emite warning ao invés de fail enquanto config é ajustada. Background: 26/05/2026 — 20 deploys ERROR não impediram 19 commits entrarem em main. 4. docs/RLS_REWRITE_PLAN.md (NOVO) + nota na migration 141234 Documento técnico explicando por que o RLS rewrite (migration 141234) foi convertido em NO-OP, com snapshot completo das policies atuais e checklist do que deve ser feito se alguém decidir retomar o rewrite no futuro. Substitui criar issue. Validações: ✅ yamllint nos 3 arquivos YAML ✅ Detector base64: 0 FP em supabase/functions/webhook-inbound, vercel.json, .coderabbit.yaml e ele mesmo ✅ Detector base64: TP em payload sintético >200 chars ✅ Detector base64: TN em prosa em PT-BR com acentos/espaços Co-authored-by: Claude <noreply@anthropic.com>
Implementa as 4 melhorias sugeridas no PR #460 para prevenir recorrência dos 3 padrões problemáticos identificados em 26/05. 1. .github/workflows/detect-base64-content.yml (NOVO) CI check que detecta arquivos texto acidentalmente commitados em base64 (linha >=200 chars com alfabeto [A-Za-z0-9+/=]). Roda em pull_request + push para main. Falha o check se achar. Self-tested: 0 false positives no repo atual, true positive em payload sintético, true negative em prosa longa. Cobre regressão dos PRs #319, #457, #459. 2. .coderabbit.yaml (UPDATE) Adiciona 3 alertas: - ALERTA DE DRIFT em supabase/functions/**/*.ts: flag PRs com título/commit "Fast Visual Edit"/"visual"/"stepper" tocando edge functions — caso PR #460. - ALERTA DE DRIFT em supabase/migrations/**/*.sql: idem para migrations, com checks específicos (DROP POLICY massa, ADD COLUMN no-op, SECURITY DEFINER sem REVOKE). - Detecção base64 em arquivos texto como reforço do workflow. 3. .github/workflows/required-checks-guard.yml (UPDATE) Estende verificação existente para também checar que algum check do Vercel/deploy está como required em main. Tolerante: emite warning ao invés de fail enquanto config é ajustada. Background: 26/05/2026 — 20 deploys ERROR não impediram 19 commits entrarem em main. 4. docs/RLS_REWRITE_PLAN.md (NOVO) + nota na migration 141234 Documento técnico explicando por que o RLS rewrite (migration 141234) foi convertido em NO-OP, com snapshot completo das policies atuais e checklist do que deve ser feito se alguém decidir retomar o rewrite no futuro. Substitui criar issue. Validações: ✅ yamllint nos 3 arquivos YAML ✅ Detector base64: 0 FP em supabase/functions/webhook-inbound, vercel.json, .coderabbit.yaml e ele mesmo ✅ Detector base64: TP em payload sintético >200 chars ✅ Detector base64: TN em prosa em PT-BR com acentos/espaços Co-authored-by: Claude <noreply@anthropic.com>
Resumo
Restaura funcionalidades críticas removidas pelo Lovable em 26/05 enquanto preserva os ganhos legítimos do refactor (idempotência, structured logging, retry).
Contexto
Em 26/05/2026 entre 14:09 e 14:41 UTC, o Lovable produziu 28 commits no projeto rotulados como "Fast Visual Edit" / "Centralizou stepper" / "Unificou ícones do header". Auditoria desses commits identificou:
webhook-inbound→ este PRMudanças
📁
supabase/functions/webhook-inbound/index.tsPreserva (regressão do Lovable):
readRequestedVersion,parseAllowlist)Deprecation/Sunset/Warningpara v1 deprecada426 Upgrade Requiredpara v1 não-allowlistedWEBHOOK_INBOUND_V1_COMPAT_ENABLEDeWEBHOOK_INBOUND_V1_ALLOWLISTwebhook_inbound_contract_version_adoption(observabilidade)Incorpora (ganhos do refactor):
x-idempotency-keyheader,payload.idempotency_key(v2) ou hash da assinatura HMAC (fallback). Validação 8-256 chars23505(unique_violation) comoduplicate=truepara resolver race conditionsretrySupabaseCallenvolvendo queries críticasincrement_webhook_statsatômica (substitui UPDATE direto com race)Corrige bugs presentes em AMBAS as versões anteriores:
ip_address(nãosource_ip),error_message(nãoerror). A versão pré-Lovable inseria em colunas inexistentes — provavelmente com payload silenciosamente truncado.📁 Migrations
20260526141234_31aaa458user_roles,order_items,admin_audit_logcomcan_view_all_sales(auth.uid())quando função tem 0 argsorganization_members) diverge do guarded atual20260526141615_52d285edidempotency_key+ ADDcontract_version(esta já existe NOT NULL)idempotency_keynullable + índice único parcial.contract_versionnão tocado20260526141659_5cd6e346increment_webhook_statssem ACLREVOKE ALL FROM PUBLIC, anon, authenticated; GRANT EXECUTE TO service_role, postgresStatus do banco
As migrations seguras (141615 e 141659) já foram aplicadas no banco
doufsxqlfjyuvxuezplnvia MCP. Validação:A migration RLS (141234) NÃO foi aplicada e está como NO-OP. Se o rewrite for desejado, abrir PR humano dedicado conforme nota no arquivo.
Validação
npm run build— 1m49s, sem errosnpm run lintreporta regressões TS pré-existentes do PR Claude/frontend supabase bugs spsu e #457 (baseline desatualizado), não causadas por este PRDeploy da edge function
Este PR atualiza o código da função. O Supabase auto-deploya edge functions a partir do push no
mainse o GitHub integration estiver configurado; caso contrário, rodar manualmente:Próximos passos sugeridos (fora do escopo deste PR)
.coderabbit.yamlflagando commits "visual" que tocamsupabase/functions/ousupabase/migrations/🤖 Generated with Claude Code
Co-Authored-By: Claude noreply@anthropic.com
Summary by cubic
Restores inbound webhook v1/v2 behavior (allowlist, deprecation/sunset headers, 426 for blocked v1) and adds idempotency with race-safe inserts and structured logging. Also fixes wrong column writes and replaces risky migrations with safe ones.
New Features
x-idempotency-key, payloadidempotency_key, or HMAC signature fallback; 23505 treated as duplicate using a partial unique index.increment_webhook_statsRPC for endpoint stats.Migration
20260526141234: RLS rewrite changed to NO-OP with guidance; not applied.20260526141615: add nullableidempotency_keyand partial unique index; do not touch existingcontract_version.20260526141659: createincrement_webhook_statswith strict ACL (service_role,postgres).Written for commit c9d8afa. Summary will update on new commits. Review in cubic