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}