Skip to content

fix(webhooks): CRUD account-scoped /v2/webhooks + release v3.1.0 - #21

Merged
andrenfe merged 2 commits into
masterfrom
release/v3.1.0
Jul 3, 2026
Merged

fix(webhooks): CRUD account-scoped /v2/webhooks + release v3.1.0#21
andrenfe merged 2 commits into
masterfrom
release/v3.1.0

Conversation

@andrenfe

@andrenfe andrenfe commented Jul 3, 2026

Copy link
Copy Markdown
Member

Resumo

O CRUD de webhooks do SDK estava 100% quebrado contra a API real: a rota company-scoped /v1/companies/{id}/webhooks retorna 404 incondicional (confirmado em 3 contas, 2026-07-02/03) — contrato herdado de alucinação do SDK Node. O contrato real é account-scoped: /v2/webhooks com envelope {"webHook": {...}} nos dois sentidos.

Inclui também o commit de release v3.1.0 (bump de Version.php + CHANGELOG). Após o merge, a tag v3.1.0 será criada na master (dispara o release.yml).

Mudanças

  • Novos métodos account-scoped em WebhooksResource: listAccountWebhooks, createAccountWebhook, retrieveAccountWebhook, updateAccountWebhook, deleteAccountWebhook, deleteAllAccountWebhooks (destrutivo, nome distinto), pingAccountWebhook, fetchEventTypes (lista viva — os literais invoice.* não existem)
  • Novo DTO AccountWebhook com o shape real do fio (contentType/status string; desvio vs enum int do spec OpenAPI pinado em teste de alinhamento YAML↔DTO)
  • Deprecations honestas: 6 métodos company-scoped + getAvailableEvents() + DTO Webhook — comportamento inalterado, remoção na próxima major
  • Gotchas no phpdoc/docs/README/sample/skill: NFE.io pinga a uri no create (exige 2xx); secret 32–64 chars ecoado só no create; PUT de update é substituição integral (sem status → desativa o hook)
  • Mecânica de path: apiVersion(): '' + paths versionados explícitos (precedente AddressesResource) — URLs company-scoped permanecem idênticas, zero mudança no core

Validação

  • ✅ 192 testes passando (12 novos: 9 unit com fixtures do transcript real + 3 de alinhamento YAML↔DTO); PHPStan nível 8 e cs-fixer limpos
  • Smoke CRUD completo contra api.nfe.io com webhook descartável: create 201 (envelope aceito, secret ecoado, ping 2xx), retrieve com secret omitido, update PUT integral 200, ping 204, delete 204 + retrieve pós-delete 404; estado da conta preservado (9 webhooks antes/depois)
  • ✅ Downstream verificado: módulo WHMCS usa cURL próprio já account-scoped; woo-nfe vendoriza client v1 e só recebe webhooks — remoção futura dos deprecated é segura

OpenSpec: fix-account-webhooks-contract (arquivado em openspec/changes/archive/2026-07-03-..., spec principal sincronizado)

andrenfe added 2 commits July 3, 2026 12:43
…real da API

A rota company-scoped /v1/companies/{id}/webhooks retorna 404 incondicional
(confirmado em 3 contas, 2026-07-02/03) — o contrato havia sido herdado de
alucinação do SDK Node. O contrato real é account-scoped com envelope
{"webHook": {...}} nos dois sentidos.

- Novos métodos: listAccountWebhooks, createAccountWebhook,
  retrieveAccountWebhook, updateAccountWebhook, deleteAccountWebhook,
  deleteAllAccountWebhooks (destrutivo, nome distinto), pingAccountWebhook,
  fetchEventTypes (lista viva — os literais invoice.* não existem)
- Novo DTO AccountWebhook com o shape real do fio (contentType/status
  string; desvio vs enum int do spec pinado em teste de alinhamento YAML↔DTO)
- Métodos company-scoped e getAvailableEvents @deprecated, comportamento
  inalterado; remoção na próxima major
- Gotchas documentados: NFE.io pinga a uri no create (exige 2xx), secret
  32-64 chars ecoado só no create, PUT de update é substituição integral
- Docs, README, sample e skill atualizados para o fluxo account

Validado ao vivo (CRUD completo com webhook descartável): create 201,
retrieve com secret omitido, update 200, ping 204, delete 204 + 404.

OpenSpec: fix-account-webhooks-contract
@andrenfe andrenfe self-assigned this Jul 3, 2026
@andrenfe
andrenfe merged commit be00f2d into master Jul 3, 2026
2 checks passed
@andrenfe
andrenfe deleted the release/v3.1.0 branch July 3, 2026 15:47
@joaokita

joaokita commented Jul 6, 2026

Copy link
Copy Markdown

Rastreabilidade retroativa (Review S11): #22

andrenfe added a commit that referenced this pull request Jul 7, 2026
Desde 45aa6e8 ("master passa a ser a linha canônica v3+"), o ci.yml continuou
disparando apenas em push/PR da branch `v3`. Efeito: nenhum PR contra master
rodou o CI funcional (matriz PHP 8.2/8.3/8.4 + PHPStan + CS + generate:check) —
só o CodeQL. Confirmado nos PRs #21 (release v3.1.0) e #23.

Adiciona `master` aos gatilhos push e pull_request (mantém `v3` por segurança;
a branch ainda existe, congelada em v3.0.0). Mudança não-destrutiva, só de
gatilho — sem uso de input não confiável.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants