this repo has no description
1package middleware
2
3import (
4 "context"
5 "net/http"
6 "strconv"
7 "strings"
8
9 "github.com/go-chi/chi/v5"
10 "tangled.org/core/appview/db"
11 "tangled.org/core/appview/pages"
12 "tangled.org/core/appview/web/request"
13 "tangled.org/core/idresolver"
14 "tangled.org/core/log"
15 "tangled.org/core/orm"
16)
17
18func ResolveIdent(
19 idResolver *idresolver.Resolver,
20 pages *pages.Pages,
21) middlewareFunc {
22 return func(next http.Handler) http.Handler {
23 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
24 ctx := r.Context()
25 l := log.FromContext(ctx)
26 didOrHandle := chi.URLParam(r, "user")
27 didOrHandle = strings.TrimPrefix(didOrHandle, "@")
28
29 id, err := idResolver.ResolveIdent(ctx, didOrHandle)
30 if err != nil {
31 // invalid did or handle
32 l.Warn("failed to resolve did/handle", "handle", didOrHandle, "err", err)
33 pages.Error404(w)
34 return
35 }
36
37 ctx = request.WithOwner(ctx, id)
38 // TODO: reomove this later
39 ctx = context.WithValue(ctx, "resolvedId", *id)
40
41 next.ServeHTTP(w, r.WithContext(ctx))
42 })
43 }
44}
45
46func ResolveRepo(
47 e *db.DB,
48 pages *pages.Pages,
49) middlewareFunc {
50 return func(next http.Handler) http.Handler {
51 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
52 ctx := r.Context()
53 l := log.FromContext(ctx)
54 repoName := chi.URLParam(r, "repo")
55 repoOwner, ok := request.OwnerFromContext(ctx)
56 if !ok {
57 l.Error("malformed middleware")
58 w.WriteHeader(http.StatusInternalServerError)
59 return
60 }
61
62 repo, err := db.GetRepo(
63 e,
64 orm.FilterEq("did", repoOwner.DID.String()),
65 orm.FilterEq("name", repoName),
66 )
67 if err != nil {
68 l.Warn("failed to resolve repo", "err", err)
69 pages.ErrorKnot404(w)
70 return
71 }
72
73 // TODO: pass owner id into repository object
74
75 ctx = request.WithRepo(ctx, repo)
76 // TODO: reomove this later
77 ctx = context.WithValue(ctx, "repo", repo)
78
79 next.ServeHTTP(w, r.WithContext(ctx))
80 })
81 }
82}
83
84func ResolveIssue(
85 e *db.DB,
86 pages *pages.Pages,
87) middlewareFunc {
88 return func(next http.Handler) http.Handler {
89 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
90 ctx := r.Context()
91 l := log.FromContext(ctx)
92 issueIdStr := chi.URLParam(r, "issue")
93 issueId, err := strconv.Atoi(issueIdStr)
94 if err != nil {
95 l.Warn("failed to fully resolve issue ID", "err", err)
96 pages.Error404(w)
97 return
98 }
99 repo, ok := request.RepoFromContext(ctx)
100 if !ok {
101 l.Error("malformed middleware")
102 w.WriteHeader(http.StatusInternalServerError)
103 return
104 }
105
106 issue, err := db.GetIssue(e, repo.RepoAt(), issueId)
107 if err != nil {
108 l.Warn("failed to resolve issue", "err", err)
109 pages.ErrorKnot404(w)
110 return
111 }
112 issue.Repo = repo
113
114 ctx = request.WithIssue(ctx, issue)
115 // TODO: reomove this later
116 ctx = context.WithValue(ctx, "issue", issue)
117
118 next.ServeHTTP(w, r.WithContext(ctx))
119 })
120 }
121}