Move webhook pages to /hook/ID and inbound URLs to /h/UUID (closes #367)
check / check (push) Successful in 4m49s

The webhook page and everything under it move from /source/ID to
/hook/ID, the list and new-webhook form to /hooks and /hooks/new, and
the event log from .../logs to /hook/ID/events, body download
included. Entrypoint URLs move from /webhook/UUID to /h/UUID, and the
webhook page shows only that form. The old paths are gone.

Links, redirects, form actions, tests, comments and the README follow.
Both links to the event log page, and its title and heading, now read
"Full Event Log". Go identifiers and template file names are
unchanged. A new route test posts to the entrypoint URL the webhook
page shows and checks that the receiver rate limit applies to it.

Model: opus-5-5
This commit is contained in:
2026-10-01 22:31:01 +00:00
parent 30e65dce53
commit 4ce2116a1e
47 changed files with 319 additions and 221 deletions
+9 -9
View File
@@ -330,7 +330,7 @@ func (h *Handlers) createWebhookWithEntrypoint(
)
http.Redirect(
w, r, "/source/"+webhook.ID, http.StatusSeeOther,
w, r, "/hook/"+webhook.ID, http.StatusSeeOther,
)
}
@@ -588,7 +588,7 @@ func (h *Handlers) applyWebhookEdit(
}
http.Redirect(
w, r, "/source/"+webhook.ID, http.StatusSeeOther,
w, r, "/hook/"+webhook.ID, http.StatusSeeOther,
)
}
@@ -671,7 +671,7 @@ func (h *Handlers) deleteWebhookResources(
return
}
http.Redirect(w, r, "/sources", http.StatusSeeOther)
http.Redirect(w, r, "/hooks", http.StatusSeeOther)
}
// commitWebhookDeletion soft-deletes a webhook's entrypoints,
@@ -1264,7 +1264,7 @@ func (h *Handlers) HandleEntrypointCreate() http.HandlerFunc {
}
http.Redirect(
w, r, "/source/"+webhook.ID, http.StatusSeeOther,
w, r, "/hook/"+webhook.ID, http.StatusSeeOther,
)
}
}
@@ -1320,7 +1320,7 @@ func (h *Handlers) processTargetCreate(
//
// Every field here is read with PostFormValue, not FormValue.
// FormValue falls back to the query string, which would let
// `POST /source/{id}/targets?url=https://hooks.slack.com/...`
// `POST /hook/{id}/targets?url=https://hooks.slack.com/...`
// configure a target from a value the request line carries — and
// the request line, unlike the body, is what logs, proxies,
// Referer headers and error trackers record.
@@ -1377,7 +1377,7 @@ func (h *Handlers) processTargetCreate(
}
http.Redirect(
w, r, "/source/"+webhook.ID, http.StatusSeeOther,
w, r, "/hook/"+webhook.ID, http.StatusSeeOther,
)
}
@@ -1435,7 +1435,7 @@ type targetFormInput struct {
//
// Every field is read with PostFormValue, not FormValue. FormValue
// falls back to the query string, which would let
// `POST /source/{id}/targets?url=https://hooks.slack.com/...`
// `POST /hook/{id}/targets?url=https://hooks.slack.com/...`
// configure a target from a value the request line carries — and the
// request line, unlike the body, is what logs, proxies, Referer
// headers and error trackers record. The headers field is under the
@@ -1714,7 +1714,7 @@ func (h *Handlers) deleteChildResource(
http.Redirect(
w, r,
"/source/"+webhook.ID,
"/hook/"+webhook.ID,
http.StatusSeeOther,
)
}
@@ -1811,7 +1811,7 @@ func (h *Handlers) toggleChildResource(
http.Redirect(
w, r,
"/source/"+webhook.ID,
"/hook/"+webhook.ID,
http.StatusSeeOther,
)
}