diff --git a/appview/issues/router.go b/appview/issues/router.go index f2420da7..b2f07713 100644 --- a/appview/issues/router.go +++ b/appview/issues/router.go @@ -12,21 +12,32 @@ func (i *Issues) Router(mw *middleware.Middleware) http.Handler { r.Route("/", func(r chi.Router) { r.With(middleware.Paginate).Get("/", i.RepoIssues) - r.Get("/{issue}", i.RepoSingleIssue) + + r.Route("/{issue}", func(r chi.Router) { + r.Use(mw.ResolveIssue()) + r.Get("/", i.RepoSingleIssue) + + // authenticated routes + r.Group(func(r chi.Router) { + r.Use(middleware.AuthMiddleware(i.oauth)) + r.Post("/comment", i.NewIssueComment) + r.Route("/comment/{commentId}/", func(r chi.Router) { + r.Get("/", i.IssueComment) + r.Delete("/", i.DeleteIssueComment) + r.Get("/edit", i.EditIssueComment) + r.Post("/edit", i.EditIssueComment) + r.Get("/reply", i.ReplyIssueComment) + r.Get("/replyPlaceholder", i.ReplyIssueCommentPlaceholder) + }) + r.Post("/close", i.CloseIssue) + r.Post("/reopen", i.ReopenIssue) + }) + }) r.Group(func(r chi.Router) { r.Use(middleware.AuthMiddleware(i.oauth)) r.Get("/new", i.NewIssue) r.Post("/new", i.NewIssue) - r.Post("/{issue}/comment", i.NewIssueComment) - r.Route("/{issue}/comment/{comment_id}/", func(r chi.Router) { - r.Get("/", i.IssueComment) - r.Delete("/", i.DeleteIssueComment) - r.Get("/edit", i.EditIssueComment) - r.Post("/edit", i.EditIssueComment) - }) - r.Post("/{issue}/close", i.CloseIssue) - r.Post("/{issue}/reopen", i.ReopenIssue) }) }) diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go index 093329d0..c15749bf 100644 --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -275,6 +275,46 @@ func (mw Middleware) ResolvePull() middlewareFunc { } } +// middleware that is tacked on top of /{user}/{repo}/issues/{issue} +func (mw Middleware) ResolveIssue() middlewareFunc { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + f, err := mw.repoResolver.Resolve(r) + if err != nil { + log.Println("failed to fully resolve repo", err) + mw.pages.ErrorKnot404(w) + return + } + + issueIdStr := chi.URLParam(r, "issue") + issueId, err := strconv.Atoi(issueIdStr) + if err != nil { + log.Println("failed to fully resolve issue ID", err) + mw.pages.ErrorKnot404(w) + return + } + + issues, err := db.GetIssues( + mw.db, + db.FilterEq("repo_at", f.RepoAt()), + db.FilterEq("issue_id", issueId), + ) + if err != nil { + log.Println("failed to get issues", "err", err) + return + } + if len(issues) != 1 { + log.Println("got incorrect number of issues", "len(issuse)", len(issues)) + return + } + issue := issues[0] + + ctx := context.WithValue(r.Context(), "issue", &issue) + next.ServeHTTP(w, r.WithContext(ctx)) + }) + } +} + // this should serve the go-import meta tag even if the path is technically // a 404 like tangled.sh/oppi.li/go-git/v5 func (mw Middleware) GoImport() middlewareFunc { diff --git a/appview/posthog/notifier.go b/appview/posthog/notifier.go index 8dbd1988..80ff75c0 100644 --- a/appview/posthog/notifier.go +++ b/appview/posthog/notifier.go @@ -58,7 +58,7 @@ func (n *posthogNotifier) DeleteStar(ctx context.Context, star *db.Star) { func (n *posthogNotifier) NewIssue(ctx context.Context, issue *db.Issue) { err := n.client.Enqueue(posthog.Capture{ - DistinctId: issue.OwnerDid, + DistinctId: issue.Did, Event: "new_issue", Properties: posthog.Properties{ "repo_at": issue.RepoAt.String(), diff --git a/appview/repo/feed.go b/appview/repo/feed.go index d41ccee5..33164b6f 100644 --- a/appview/repo/feed.go +++ b/appview/repo/feed.go @@ -104,7 +104,7 @@ func (rp *Repo) createPullItems(ctx context.Context, pull *db.Pull, f *reporesol } func (rp *Repo) createIssueItem(ctx context.Context, issue db.Issue, f *reporesolver.ResolvedRepo) (*feeds.Item, error) { - owner, err := rp.idResolver.ResolveIdent(ctx, issue.OwnerDid) + owner, err := rp.idResolver.ResolveIdent(ctx, issue.Did) if err != nil { return nil, err }