···275 }
276}
2770000000000000000000000000000000000000000278// this should serve the go-import meta tag even if the path is technically
279// a 404 like tangled.sh/oppi.li/go-git/v5
280func (mw Middleware) GoImport() middlewareFunc {
···275 }
276}
277278+// middleware that is tacked on top of /{user}/{repo}/issues/{issue}
279+func (mw Middleware) ResolveIssue() middlewareFunc {
280+ return func(next http.Handler) http.Handler {
281+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
282+ f, err := mw.repoResolver.Resolve(r)
283+ if err != nil {
284+ log.Println("failed to fully resolve repo", err)
285+ mw.pages.ErrorKnot404(w)
286+ return
287+ }
288+289+ issueIdStr := chi.URLParam(r, "issue")
290+ issueId, err := strconv.Atoi(issueIdStr)
291+ if err != nil {
292+ log.Println("failed to fully resolve issue ID", err)
293+ mw.pages.ErrorKnot404(w)
294+ return
295+ }
296+297+ issues, err := db.GetIssues(
298+ mw.db,
299+ db.FilterEq("repo_at", f.RepoAt()),
300+ db.FilterEq("issue_id", issueId),
301+ )
302+ if err != nil {
303+ log.Println("failed to get issues", "err", err)
304+ return
305+ }
306+ if len(issues) != 1 {
307+ log.Println("got incorrect number of issues", "len(issuse)", len(issues))
308+ return
309+ }
310+ issue := issues[0]
311+312+ ctx := context.WithValue(r.Context(), "issue", &issue)
313+ next.ServeHTTP(w, r.WithContext(ctx))
314+ })
315+ }
316+}
317+318// this should serve the go-import meta tag even if the path is technically
319// a 404 like tangled.sh/oppi.li/go-git/v5
320func (mw Middleware) GoImport() middlewareFunc {