[PR #2572] [MERGED] fix(webhook): per-webhook retry lifecycle to unblock siblings #10090

Closed
opened 2026-04-23 09:23:34 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/go-vikunja/vikunja/pull/2572
Author: @tink-bot
Created: 4/9/2026
Status: Merged
Merged: 4/9/2026
Merged by: @kolaente

Base: mainHead: fix-2569-per-webhook-retry


📝 Commits (10+)

  • 16f6d94 fix(webhook): return error from sendWebhookPayload on non-2xx responses
  • 37bc361 test(webhook): add failing test for #2569 sibling webhook blocking
  • a0ecfb1 feat(webhook): add WebhookDeliveryEvent for per-webhook fan out
  • 73cda27 feat(webhook): add WebhookDeliveryListener for per-webhook delivery
  • 13629d6 feat(webhook): register WebhookDeliveryListener on startup
  • 8fe9ac8 fix(webhook): dispatch one delivery event per webhook (#2569)
  • 5cc0c40 test(webhook): assert good webhook delivered once despite sibling retries
  • 8b145de test(webhook): assert flaky webhook is retried until it succeeds
  • 7355cb6 test(webhook): handle deleted webhook gracefully between fan-out and delivery
  • 2ef25f0 fix(webhook): return error from delivery listener on nil payload

📊 Changes

5 files changed (+400 additions, -12 deletions)

View changed files

pkg/e2etests/webhook_multi_test.go (+283 -0)
📝 pkg/e2etests/webhook_test.go (+5 -0)
📝 pkg/models/events.go (+25 -0)
📝 pkg/models/listeners.go (+82 -9)
📝 pkg/models/webhooks.go (+5 -3)

📄 Description

A failing webhook short-circuited the synchronous fan-out loop in WebhookListener.Handle, so every subsequent webhook for the same event was skipped and successful ones were re-delivered on every retry.

Each matching webhook now gets its own internal webhook.delivery event and is handled by a dedicated WebhookDeliveryListener, giving every delivery an independent retry lifecycle via the existing watermill retry middleware. No schema changes.

Fixes #2569


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/go-vikunja/vikunja/pull/2572 **Author:** [@tink-bot](https://github.com/tink-bot) **Created:** 4/9/2026 **Status:** ✅ Merged **Merged:** 4/9/2026 **Merged by:** [@kolaente](https://github.com/kolaente) **Base:** `main` ← **Head:** `fix-2569-per-webhook-retry` --- ### 📝 Commits (10+) - [`16f6d94`](https://github.com/go-vikunja/vikunja/commit/16f6d94e1bbe4cc7bbba189e4dae1a4cfb84f95e) fix(webhook): return error from sendWebhookPayload on non-2xx responses - [`37bc361`](https://github.com/go-vikunja/vikunja/commit/37bc3616fd0d1dad0c52f8bee1b71922348b8a89) test(webhook): add failing test for #2569 sibling webhook blocking - [`a0ecfb1`](https://github.com/go-vikunja/vikunja/commit/a0ecfb174095d96ef1b10ed32a567f3c6ec8eacf) feat(webhook): add WebhookDeliveryEvent for per-webhook fan out - [`73cda27`](https://github.com/go-vikunja/vikunja/commit/73cda275ea9014813e14266941a6e0563c534b46) feat(webhook): add WebhookDeliveryListener for per-webhook delivery - [`13629d6`](https://github.com/go-vikunja/vikunja/commit/13629d61aaa0f432915b8cf4f135f2f5dadb4198) feat(webhook): register WebhookDeliveryListener on startup - [`8fe9ac8`](https://github.com/go-vikunja/vikunja/commit/8fe9ac8e56b3abf7d5e0cfa9eeb25053d659b548) fix(webhook): dispatch one delivery event per webhook (#2569) - [`5cc0c40`](https://github.com/go-vikunja/vikunja/commit/5cc0c40bb71b71c62e7268337d12a4de04de8920) test(webhook): assert good webhook delivered once despite sibling retries - [`8b145de`](https://github.com/go-vikunja/vikunja/commit/8b145de15956709f1f6f32594238ed32bed02444) test(webhook): assert flaky webhook is retried until it succeeds - [`7355cb6`](https://github.com/go-vikunja/vikunja/commit/7355cb658a596a598b7d954bee63898301a1cbe3) test(webhook): handle deleted webhook gracefully between fan-out and delivery - [`2ef25f0`](https://github.com/go-vikunja/vikunja/commit/2ef25f04daea602605623ff02f664ea5a1879933) fix(webhook): return error from delivery listener on nil payload ### 📊 Changes **5 files changed** (+400 additions, -12 deletions) <details> <summary>View changed files</summary> ➕ `pkg/e2etests/webhook_multi_test.go` (+283 -0) 📝 `pkg/e2etests/webhook_test.go` (+5 -0) 📝 `pkg/models/events.go` (+25 -0) 📝 `pkg/models/listeners.go` (+82 -9) 📝 `pkg/models/webhooks.go` (+5 -3) </details> ### 📄 Description A failing webhook short-circuited the synchronous fan-out loop in `WebhookListener.Handle`, so every subsequent webhook for the same event was skipped and successful ones were re-delivered on every retry. Each matching webhook now gets its own internal `webhook.delivery` event and is handled by a dedicated `WebhookDeliveryListener`, giving every delivery an independent retry lifecycle via the existing watermill retry middleware. No schema changes. Fixes #2569 --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-23 09:23:34 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/vikunja#10090