Translate raw webhook payloads from each event source into the canonical Event schema.
Each source (Forgejo, ArgoCD, Gotify) has its own webhook format. Adapters normalize them so the router works with a single schema.
POST /v1/events/forgejo
POST /v1/events/argocd
POST /v1/events/gotify
pr.created
pr.merged
pr.closed
push
build.success
build.failure
sync.success
sync.failed
health.degraded
{source:"forgejo", type:"pr.created", subject:"owner/repo#N"}
{source:"forgejo", type:"pr.merged"}
data
title
author
branch
url
repo
403 Forbidden
label_updated
forgejo.unknown
{source:"argocd", type:"sync.success", subject:"app-name"}
{source:"argocd", type:"health.degraded", priority:10}
go test ./internal/events/adapters/
No dependencies set.
The note is not visible to the blocked user.
What
Translate raw webhook payloads from each event source into the canonical Event schema.
Why
Each source (Forgejo, ArgoCD, Gotify) has its own webhook format. Adapters normalize them so the router works with a single schema.
Endpoints
POST /v1/events/forgejo— raw Forgejo webhook → EventPOST /v1/events/argocd— raw ArgoCD webhook → EventPOST /v1/events/gotify— Gotify message → EventEvent Type Mapping
pr.createdpr.mergedpr.closedpushbuild.successbuild.failuresync.successsync.failedhealth.degradedDepends On
Acceptance
Forgejo Adapter
POST /v1/events/forgejowith PR opened payload → Event{source:"forgejo", type:"pr.created", subject:"owner/repo#N"}POST /v1/events/forgejowith PR merged payload → Event{source:"forgejo", type:"pr.merged"}datacontains:title,author,branch,url,repoPOST /v1/events/forgejowith valid HMAC signature header → 202POST /v1/events/forgejowith invalid HMAC →403 ForbiddenPOST /v1/events/forgejowith missing signature header →403 Forbiddenlabel_updated) → mapped toforgejo.unknownor dropped with 204ArgoCD Adapter
{source:"argocd", type:"sync.success", subject:"app-name"}{source:"argocd", type:"health.degraded", priority:10}Tests
go test ./internal/events/adapters/— Forgejo: test with captured real webhook JSON (PR open, merge, push, CI)go test ./internal/events/adapters/— ArgoCD: test with captured real webhook JSON (sync success, sync fail, health degraded)go test ./internal/events/adapters/— HMAC: valid signature passes, tampered body rejects, missing header rejects