Skip to content
This repository was archived by the owner on Jul 10, 2026. It is now read-only.

Sprint 2: religa o dispatcher de webhooks aos eventos de domínio - #112

Merged
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno
Jun 21, 2026
Merged

Sprint 2: religa o dispatcher de webhooks aos eventos de domínio#112
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno

Conversation

@danzeroum

Copy link
Copy Markdown
Owner

Webhooks deixam de ser órfãos — agora disparam de verdade

O crate webhooks (dispatcher com HMAC + retry em background) existia mas nunca era linkado ao api, então nenhum webhook era disparado apesar de a UI/CRUD existirem. Esta PR fecha esse gap.

Mudanças

  • api passa a depender do crate webhooks; AppState ganha webhooks: WebhookDispatcher (construído em main.rs com WebhookStore sobre o PgPool; worker roda em background)
  • dispatch (fire-and-forget) nos eventos de domínio:
    • chat_createdroutes/chats.rs::create
    • chat_completedroutes/chats.rs::send_message
    • document_uploadedroutes/documents.rs::upload
    • training_feedbackroutes/training.rs::approve

Verificação local

  • cargo build -p api ✓ · cargo clippy -p api -- -D warnings
  • Teste e2e novo (webhooks/tests/dispatch_e2e.rs): insere um webhook inscrito em chat_created, dispara o evento e confirma que um receiver HTTP local recebe um POST assinado (X-Webhook-Signature) com o tipo do evento — passa contra o Postgres local. Prova o caminho fim-a-fim (store query → entrega → assinatura).

Fora de escopo (anotado no roadmap)

  • retry_webhook_delivery (admin_service.rs:793) enfileirar no dispatcher
  • dispatch no caminho de streaming (insert do assistant roda em tarefa spawnada — requer clonar o dispatcher para dentro do spawn)

🤖 Generated with Claude Code


Generated by Claude Code

O crate `webhooks` (dispatcher HMAC + retry) existia mas era orfao — nunca
linkado ao `api`, entao nenhum webhook era disparado. Agora:

- `api` depende do crate `webhooks`; AppState ganha `webhooks: WebhookDispatcher`
  (construido em main.rs com WebhookStore sobre o PgPool; worker em background)
- dispatch fire-and-forget nos eventos:
  - chat_created      (routes/chats.rs::create)
  - chat_completed    (routes/chats.rs::send_message)
  - document_uploaded (routes/documents.rs::upload)
  - training_feedback (routes/training.rs::approve)
- payloads minimos com IDs (consumidor busca detalhes); workspace_id como String

Verificacao local: cargo build/clippy -D warnings limpos. Teste e2e novo
(webhooks/tests/dispatch_e2e.rs): insere um webhook inscrito em chat_created,
dispara o evento e confirma que o receiver HTTP local recebe um POST assinado
(X-Webhook-Signature) com o tipo do evento — passa contra o Postgres local.

Pendente (fora deste commit): retry_webhook_delivery (admin_service.rs:793)
enfileirar no dispatcher; dispatch no caminho de streaming (tarefa spawnada).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc
@danzeroum
danzeroum merged commit 52aea0c into main Jun 21, 2026
1 check failed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants