This repository has no description
1package pulls
2
3import (
4 "context"
5 "net/http"
6 "strconv"
7
8 "github.com/go-chi/chi/v5"
9 "tangled.org/core/appview/db"
10 "tangled.org/core/orm"
11)
12
13// middleware that is tacked on top of /{user}/{repo}/pulls/{pull}
14func (s *Pulls) ResolvePullMiddleware(next http.Handler) http.Handler {
15 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
16 l := s.logger.With("middleware", "ResolvePullMiddleware")
17 f, err := s.repoResolver.Resolve(r)
18 if err != nil {
19 l.Error("failed to fully resolve repo", "err", err)
20 w.WriteHeader(http.StatusNotFound)
21 s.pages.ErrorKnot404(w)
22 return
23 }
24
25 prId, err := strconv.Atoi(chi.URLParam(r, "pull"))
26 if err != nil {
27 l.Debug("failed to parse pr id", "err", err)
28 w.WriteHeader(http.StatusNotFound)
29 s.pages.Error404(w)
30 return
31 }
32
33 pr, err := db.GetPull(r.Context(), s.db, orm.FilterEq("repo_did", f.RepoDid), orm.FilterEq("pull_id", prId))
34 if err != nil {
35 l.Debug("failed to query PR", "err", err)
36 w.WriteHeader(http.StatusNotFound)
37 s.pages.Error404(w)
38 return
39 }
40
41 ctx := context.WithValue(r.Context(), "pull", pr)
42
43 next.ServeHTTP(w, r.WithContext(ctx))
44 })
45}