feat(web): webhook subscriptions CRUD UI + global nav expansion - #69
Merged
Merged
Conversation
Roddygithub
force-pushed
the
feat/webhook-subscriptions-ui
branch
from
July 24, 2026 15:08
6e65f2c to
4668ce1
Compare
Roddygithub
force-pushed
the
feat/webhook-subscriptions-ui
branch
from
July 24, 2026 16:46
15a452b to
b2c59f1
Compare
… grid Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
… API Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
…ret reveal Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
…eader nav Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
…ionsGrid) Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
… Pydantic closed set) Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
…pendabot notice Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
Signed-off-by: Roddy GitHub <roddy@users.noreply.github.com>
… drop CODEOWNERS touch) Signed-off-by: RoddyGitHub <roddy@users.noreply.github.com>
Roddygithub
force-pushed
the
feat/webhook-subscriptions-ui
branch
from
July 24, 2026 16:48
b2c59f1 to
cfdd615
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CreateWebhookPanelClient Component: 3-phase state machine (closed -> form -> reveal) where the form opens on click, URL/description/filter JSON submit viaPOST /api/v1/webhooks, and the reveal phase shows the ONE-SHOT plaintextsecretwith copy-to-clipboard + a mandatoryI have securely stored this secretacknowledgement checkbox beforeDone(which callsrouter.refresh()so the new row appears in the grid).WebhookSubscriptionsGridClient Component (AG Grid): id / url / description / filter (key-sorted summary) / created_at columns + a per-rowRevokebutton. CallsDELETE /api/v1/webhooks/{id}thenrouter.refresh().GET /api/v1/webhooksclient (fetchWebhookSubscriptions) +createWebhook+revokeWebhookexport (api/webhooks.ts).web/src/app/webhooks/page.tsxas aforce-dynamicServer Component thatPromise.allSettled-fetches subscriptions + DLQ in parallel with per-section error isolation (one section failing does NOT block the other)./players+/players/compare+/webhooks+/account+/uploadto the global header nav (layout.tsx). The pre-PR2 nav surfaced only Players + Compare.formatDateTimeutil inweb/src/lib/format.ts(DRY acrossWebhookDlqGrid+WebhookSubscriptionsGrid).Commits
feat(web): extract shared formatDateTime in lib/format + refactor DLQ gridfeat(web): add WebhookSubscriptionRow/Out types + fetch/create/revoke APIfeat(web): CreateWebhookPanel -- 3-phase state machine + one-shot secret revealfeat(web): WebhookSubscriptionsGrid -- AG Grid table + revoke actionfeat(web): extend /webhooks to render subs + DLQ; expose 5 pages in header navtest(web): 13 webhook-UI tests (page + CreateWebhookPanel + SubscriptionsGrid)Why the inline create modal (not a separate route)
The backend returns the plaintext
secretONCE on the 201 response (Fernet envelope encryption-at-rest for every later fetch). A multi-page wizard would require server-side storage of the in-flight secret to survive a refresh, which we explicitly avoid. The single Client Component keeps the plaintext secret in React state for the lifetime of the wizard and only crosses the network once.Test plan
cd web && pnpm typecheck— passes (TypeScript valid).cd web && pnpm exec vitest run tests/app/webhooks-page.test.tsx tests/components/CreateWebhookPanel.test.tsx tests/components/WebhookSubscriptionsGrid.test.tsx— 13/13 pass./webhooksrenders the 2 section cards; clicking+ New subscriptionopens the form, mock-typing + submitting transitions to the reveal callout with the one-shot secret visible.Out of scope (deferred)
subscribed_event_typesfilter UX is JSON-as-text only; a structuredkey=valueUI is a v0.12 follow-up.whsec_prefix is the canonical GW2 community compatibility marker).