Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2

appview/repo: webhook deliveries endpoint

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.org>

authored by anirudh.fi and committed by tangled.org 137098c6 4a3b21b4

+67 -3
+1
appview/repo/router.go
··· 93 93 r.Put("/{id}", rp.UpdateWebhook) 94 94 r.Delete("/{id}", rp.DeleteWebhook) 95 95 r.Post("/{id}/toggle", rp.ToggleWebhook) 96 + r.Get("/{id}/deliveries", rp.WebhookDeliveries) 96 97 }) 97 98 }) 98 99 })
+66 -3
appview/repo/webhooks.go
··· 31 31 return 32 32 } 33 33 34 + // fetch recent deliveries for each webhook 35 + deliveriesMap := make(map[int64][]models.WebhookDelivery) 36 + for _, webhook := range webhooks { 37 + deliveries, err := db.GetWebhookDeliveries(rp.db, webhook.Id, 4) 38 + if err != nil { 39 + l.Error("failed to get webhook deliveries", "webhook_id", webhook.Id, "err", err) 40 + // continue even if we can't get deliveries for one webhook 41 + continue 42 + } 43 + deliveriesMap[webhook.Id] = deliveries 44 + } 45 + 34 46 rp.pages.RepoWebhooksSettings(w, pages.RepoWebhooksSettingsParams{ 35 - LoggedInUser: user, 36 - RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 37 - Webhooks: webhooks, 47 + LoggedInUser: user, 48 + RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 49 + Webhooks: webhooks, 50 + WebhookDeliveries: deliveriesMap, 38 51 }) 39 52 } 40 53 ··· 314 301 } 315 302 316 303 rp.pages.HxRefresh(w) 304 + } 305 + 306 + // WebhookDeliveries returns all deliveries for a webhook (for modal display) 307 + func (rp *Repo) WebhookDeliveries(w http.ResponseWriter, r *http.Request) { 308 + l := rp.logger.With("handler", "WebhookDeliveries") 309 + 310 + f, err := rp.repoResolver.Resolve(r) 311 + if err != nil { 312 + l.Error("failed to get repo and knot", "err", err) 313 + w.WriteHeader(http.StatusBadRequest) 314 + return 315 + } 316 + 317 + idStr := chi.URLParam(r, "id") 318 + id, err := strconv.ParseInt(idStr, 10, 64) 319 + if err != nil { 320 + l.Error("invalid webhook id", "err", err) 321 + w.WriteHeader(http.StatusBadRequest) 322 + return 323 + } 324 + 325 + webhook, err := db.GetWebhook(rp.db, id) 326 + if err != nil { 327 + l.Error("failed to get webhook", "err", err) 328 + w.WriteHeader(http.StatusNotFound) 329 + return 330 + } 331 + 332 + // Verify webhook belongs to this repo 333 + if webhook.RepoAt != f.RepoAt() { 334 + l.Error("webhook does not belong to repo", "webhook_repo", webhook.RepoAt, "current_repo", f.RepoAt()) 335 + w.WriteHeader(http.StatusForbidden) 336 + return 337 + } 338 + 339 + deliveries, err := db.GetWebhookDeliveries(rp.db, webhook.Id, 100) 340 + if err != nil { 341 + l.Error("failed to get webhook deliveries", "err", err) 342 + rp.pages.Notice(w, "webhooks-error", "Failed to load deliveries") 343 + return 344 + } 345 + 346 + user := rp.oauth.GetMultiAccountUser(r) 347 + 348 + rp.pages.WebhookDeliveriesList(w, pages.WebhookDeliveriesListParams{ 349 + LoggedInUser: user, 350 + RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 351 + Webhook: webhook, 352 + Deliveries: deliveries, 353 + }) 317 354 }