From 8a7cc6ea66a5438883a51fa3f194058329af5267 Mon Sep 17 00:00:00 2001 From: Thomas Karpiniec Date: Thu, 4 Dec 2025 14:47:48 +1100 Subject: [PATCH] appview/pages: include LoggedInUser on error pages Signed-off-by: Thomas Karpiniec --- appview/issues/issues.go | 24 +++++++++---------- appview/middleware/middleware.go | 18 +++++++-------- appview/notifications/notifications.go | 4 ++-- appview/pages/pages.go | 20 +++++++++------- appview/pulls/pulls.go | 20 ++++++++-------- appview/repo/archive.go | 3 ++- appview/repo/blob.go | 7 +++--- appview/repo/branches.go | 6 ++--- appview/repo/compare.go | 12 +++++----- appview/repo/feed.go | 5 ++-- appview/repo/index.go | 2 +- appview/repo/log.go | 19 ++++++++------- appview/repo/settings.go | 8 +++---- appview/repo/tags.go | 6 ++--- appview/repo/tree.go | 4 ++-- appview/state/gfi.go | 6 ++--- appview/state/profile.go | 32 +++++++++++++++----------- appview/state/router.go | 5 ++-- appview/strings/strings.go | 4 ++-- 19 files changed, 107 insertions(+), 98 deletions(-) diff --git a/appview/issues/issues.go b/appview/issues/issues.go index 89254819..7ebcdc80 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -83,7 +83,7 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -104,7 +104,7 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { ) if err != nil { l.Error("failed to fetch labels", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -137,7 +137,7 @@ func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -282,7 +282,7 @@ func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -333,7 +333,7 @@ func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -383,7 +383,7 @@ func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -481,7 +481,7 @@ func (rp *Issues) IssueComment(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -522,7 +522,7 @@ func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -626,7 +626,7 @@ func (rp *Issues) ReplyIssueCommentPlaceholder(w http.ResponseWriter, r *http.Re issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -667,7 +667,7 @@ func (rp *Issues) ReplyIssueComment(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -708,7 +708,7 @@ func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) { issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { l.Error("failed to get issue") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -864,7 +864,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { ) if err != nil { l.Error("failed to fetch labels", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go index 8ec71059..f149a8af 100644 --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -191,7 +191,7 @@ func (mw Middleware) ResolveIdent() middlewareFunc { if err != nil { // invalid did or handle log.Printf("failed to resolve did/handle '%s': %s\n", didOrHandle, err) - mw.pages.Error404(w) + mw.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(req)}) return } @@ -222,7 +222,7 @@ func (mw Middleware) ResolveRepo() middlewareFunc { ) if err != nil { log.Println("failed to resolve repo", "err", err) - mw.pages.ErrorKnot404(w) + mw.pages.ErrorKnot404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(req)}) return } @@ -239,7 +239,7 @@ func (mw Middleware) ResolvePull() middlewareFunc { f, err := mw.repoResolver.Resolve(r) if err != nil { log.Println("failed to fully resolve repo", err) - mw.pages.ErrorKnot404(w) + mw.pages.ErrorKnot404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } @@ -247,14 +247,14 @@ func (mw Middleware) ResolvePull() middlewareFunc { prIdInt, err := strconv.Atoi(prId) if err != nil { log.Println("failed to parse pr id", err) - mw.pages.Error404(w) + mw.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } pr, err := db.GetPull(mw.db, f.RepoAt(), prIdInt) if err != nil { log.Println("failed to get pull and comments", err) - mw.pages.Error404(w) + mw.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } @@ -287,7 +287,7 @@ func (mw Middleware) ResolveIssue(next http.Handler) http.Handler { f, err := mw.repoResolver.Resolve(r) if err != nil { log.Println("failed to fully resolve repo", err) - mw.pages.ErrorKnot404(w) + mw.pages.ErrorKnot404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } @@ -295,14 +295,14 @@ func (mw Middleware) ResolveIssue(next http.Handler) http.Handler { issueId, err := strconv.Atoi(issueIdStr) if err != nil { log.Println("failed to fully resolve issue ID", err) - mw.pages.Error404(w) + mw.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } issue, err := db.GetIssue(mw.db, f.RepoAt(), issueId) if err != nil { log.Println("failed to get issues", "err", err) - mw.pages.Error404(w) + mw.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } @@ -323,7 +323,7 @@ func (mw Middleware) GoImport() middlewareFunc { f, err := mw.repoResolver.Resolve(r) if err != nil { log.Println("failed to fully resolve repo", err) - mw.pages.ErrorKnot404(w) + mw.pages.ErrorKnot404(w, pages.ErrorPageParams{LoggedInUser: mw.oauth.GetUser(r)}) return } diff --git a/appview/notifications/notifications.go b/appview/notifications/notifications.go index c0962e77..4683dc25 100644 --- a/appview/notifications/notifications.go +++ b/appview/notifications/notifications.go @@ -57,7 +57,7 @@ func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request ) if err != nil { l.Error("failed to get total notifications", "err", err) - n.pages.Error500(w) + n.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -68,7 +68,7 @@ func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request ) if err != nil { l.Error("failed to get notifications", "err", err) - n.pages.Error500(w) + n.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 3719d9b8..00f9af61 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -1437,18 +1437,22 @@ func (p *Pages) CssContentHash() string { return hex.EncodeToString(hasher.Sum(nil))[:8] // Use first 8 chars of hash } -func (p *Pages) Error500(w io.Writer) error { - return p.execute("errors/500", w, nil) +type ErrorPageParams struct { + LoggedInUser *oauth.User +} + +func (p *Pages) Error500(w io.Writer, params ErrorPageParams) error { + return p.execute("errors/500", w, params) } -func (p *Pages) Error404(w io.Writer) error { - return p.execute("errors/404", w, nil) +func (p *Pages) Error404(w io.Writer, params ErrorPageParams) error { + return p.execute("errors/404", w, params) } -func (p *Pages) ErrorKnot404(w io.Writer) error { - return p.execute("errors/knot404", w, nil) +func (p *Pages) ErrorKnot404(w io.Writer, params ErrorPageParams) error { + return p.execute("errors/knot404", w, params) } -func (p *Pages) Error503(w io.Writer) error { - return p.execute("errors/503", w, nil) +func (p *Pages) Error503(w io.Writer, params ErrorPageParams) error { + return p.execute("errors/503", w, params) } diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go index da384e8d..f460e937 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -211,7 +211,7 @@ func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) { ) if err != nil { log.Println("failed to fetch labels", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -671,7 +671,7 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { ) if err != nil { log.Println("failed to fetch labels", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -831,7 +831,7 @@ func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) { if err != nil { if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { log.Println("failed to call XRPC repo.branches", xrpcerr) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } log.Println("failed to fetch branches", err) @@ -841,7 +841,7 @@ func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) { var result types.RepoBranchesResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { log.Println("failed to decode XRPC response", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -1438,7 +1438,7 @@ func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) if err != nil { if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { log.Println("failed to call XRPC repo.branches", xrpcerr) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } log.Println("failed to fetch branches", err) @@ -1448,7 +1448,7 @@ func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) var result types.RepoBranchesResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { log.Println("failed to decode XRPC response", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -1530,7 +1530,7 @@ func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ if err != nil { if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { log.Println("failed to call XRPC repo.branches for source", xrpcerr) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } log.Println("failed to fetch source branches", err) @@ -1541,7 +1541,7 @@ func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ var sourceBranches types.RepoBranchesResponse if err := json.Unmarshal(sourceXrpcBytes, &sourceBranches); err != nil { log.Println("failed to decode source branches XRPC response", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -1559,7 +1559,7 @@ func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ if err != nil { if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { log.Println("failed to call XRPC repo.branches for target", xrpcerr) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } log.Println("failed to fetch target branches", err) @@ -1570,7 +1570,7 @@ func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ var targetBranches types.RepoBranchesResponse if err := json.Unmarshal(targetXrpcBytes, &targetBranches); err != nil { log.Println("failed to decode target branches XRPC response", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } diff --git a/appview/repo/archive.go b/appview/repo/archive.go index 3d3ee729..76513e98 100644 --- a/appview/repo/archive.go +++ b/appview/repo/archive.go @@ -7,6 +7,7 @@ import ( "strings" "tangled.org/core/api/tangled" + "tangled.org/core/appview/pages" xrpcclient "tangled.org/core/appview/xrpcclient" indigoxrpc "github.com/bluesky-social/indigo/xrpc" @@ -35,7 +36,7 @@ func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) { archiveBytes, err := tangled.RepoArchive(r.Context(), xrpcc, "tar.gz", "", ref, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.archive", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: rp.oauth.GetUser(r)}) return } // Set headers for file download, just pass along whatever the knot specifies diff --git a/appview/repo/blob.go b/appview/repo/blob.go index 481753bb..928071b7 100644 --- a/appview/repo/blob.go +++ b/appview/repo/blob.go @@ -33,6 +33,7 @@ import ( // - rest : | | func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoBlob") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -58,7 +59,7 @@ func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { resp, err := tangled.RepoBlob(r.Context(), xrpcc, filePath, false, ref, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.blob", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -74,8 +75,6 @@ func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { // Create the blob view blobView := NewBlobView(resp, rp.config, f, ref, filePath, r.URL.Query()) - user := rp.oauth.GetUser(r) - rp.pages.RepoBlob(w, pages.RepoBlobParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), @@ -133,7 +132,7 @@ func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { l.Error("failed to reach knotserver", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: rp.oauth.GetUser(r)}) return } diff --git a/appview/repo/branches.go b/appview/repo/branches.go index ffd9baab..9e2d6dae 100644 --- a/appview/repo/branches.go +++ b/appview/repo/branches.go @@ -16,6 +16,7 @@ import ( func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoBranches") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -33,17 +34,16 @@ func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) { xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.branches", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } var result types.RepoBranchesResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { l.Error("failed to decode XRPC response", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } sortBranches(result.Branches) - user := rp.oauth.GetUser(r) rp.pages.RepoBranches(w, pages.RepoBranchesParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), diff --git a/appview/repo/compare.go b/appview/repo/compare.go index b0b85d3e..7b076d97 100644 --- a/appview/repo/compare.go +++ b/appview/repo/compare.go @@ -40,7 +40,7 @@ func (rp *Repo) CompareNew(w http.ResponseWriter, r *http.Request) { branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.branches", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -77,7 +77,7 @@ func (rp *Repo) CompareNew(w http.ResponseWriter, r *http.Request) { tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tags", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -138,7 +138,7 @@ func (rp *Repo) Compare(w http.ResponseWriter, r *http.Request) { if base == "" || head == "" { l.Error("invalid comparison") - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -156,7 +156,7 @@ func (rp *Repo) Compare(w http.ResponseWriter, r *http.Request) { branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.branches", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -170,7 +170,7 @@ func (rp *Repo) Compare(w http.ResponseWriter, r *http.Request) { tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tags", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -184,7 +184,7 @@ func (rp *Repo) Compare(w http.ResponseWriter, r *http.Request) { compareBytes, err := tangled.RepoCompare(r.Context(), xrpcc, repo, base, head) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.compare", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } diff --git a/appview/repo/feed.go b/appview/repo/feed.go index 7d23faa0..60357c4a 100644 --- a/appview/repo/feed.go +++ b/appview/repo/feed.go @@ -10,6 +10,7 @@ import ( "tangled.org/core/appview/db" "tangled.org/core/appview/models" + "tangled.org/core/appview/pages" "tangled.org/core/appview/pagination" "tangled.org/core/appview/reporesolver" @@ -156,13 +157,13 @@ func (rp *Repo) AtomFeed(w http.ResponseWriter, r *http.Request) { feed, err := rp.getRepoFeed(r.Context(), f) if err != nil { log.Println("failed to get repo feed:", err) - rp.pages.Error500(w) + rp.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: nil}) return } atom, err := feed.ToAtom() if err != nil { - rp.pages.Error500(w) + rp.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: nil}) return } diff --git a/appview/repo/index.go b/appview/repo/index.go index 6815e5c7..a177c8ba 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -67,7 +67,7 @@ func (rp *Repo) Index(w http.ResponseWriter, r *http.Request) { return } - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) l.Error("failed to build index response", "err", err) return } diff --git a/appview/repo/log.go b/appview/repo/log.go index 89b22405..9a1b681d 100644 --- a/appview/repo/log.go +++ b/appview/repo/log.go @@ -22,6 +22,7 @@ import ( func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoLog") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -61,21 +62,21 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { xrpcBytes, err := tangled.RepoLog(r.Context(), xrpcc, cursor, limit, "", ref, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.log", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } var xrpcResp types.RepoLogResponse if err := json.Unmarshal(xrpcBytes, &xrpcResp); err != nil { l.Error("failed to decode XRPC response", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tags", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -96,7 +97,7 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.branches", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -109,8 +110,6 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { } } - user := rp.oauth.GetUser(r) - emailToDidMap, err := db.GetEmailToDid(rp.db, uniqueEmails(xrpcResp.Commits), true) if err != nil { l.Error("failed to fetch email to did mapping", "err", err) @@ -146,6 +145,7 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { func (rp *Repo) Commit(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoCommit") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -161,7 +161,7 @@ func (rp *Repo) Commit(w http.ResponseWriter, r *http.Request) { } if !plumbing.IsHash(ref) { - rp.pages.Error404(w) + rp.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -178,14 +178,14 @@ func (rp *Repo) Commit(w http.ResponseWriter, r *http.Request) { xrpcBytes, err := tangled.RepoDiff(r.Context(), xrpcc, ref, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.diff", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } var result types.RepoCommitResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { l.Error("failed to decode XRPC response", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -199,7 +199,6 @@ func (rp *Repo) Commit(w http.ResponseWriter, r *http.Request) { l.Error("failed to GetVerifiedCommits", "err", err) } - user := rp.oauth.GetUser(r) repoInfo := f.RepoInfo(user) pipelines, err := getPipelineStatuses(rp.db, repoInfo, []string{result.Diff.Commit.This}) if err != nil { diff --git a/appview/repo/settings.go b/appview/repo/settings.go index 1b54b342..86ff67c9 100644 --- a/appview/repo/settings.go +++ b/appview/repo/settings.go @@ -198,28 +198,28 @@ func (rp *Repo) generalSettings(w http.ResponseWriter, r *http.Request) { xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.branches", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } var result types.RepoBranchesResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { l.Error("failed to decode XRPC response", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", rp.config.Label.DefaultLabelDefs)) if err != nil { l.Error("failed to fetch labels", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } labels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels)) if err != nil { l.Error("failed to fetch labels", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } // remove default labels from the labels list, if present diff --git a/appview/repo/tags.go b/appview/repo/tags.go index 320ac93f..2db1c4d6 100644 --- a/appview/repo/tags.go +++ b/appview/repo/tags.go @@ -18,6 +18,7 @@ import ( func (rp *Repo) Tags(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoTags") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -35,13 +36,13 @@ func (rp *Repo) Tags(w http.ResponseWriter, r *http.Request) { xrpcBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tags", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } var result types.RepoTagsResponse if err := json.Unmarshal(xrpcBytes, &result); err != nil { l.Error("failed to decode XRPC response", "err", err) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } artifacts, err := db.GetArtifact(rp.db, db.FilterEq("repo_at", f.RepoAt())) @@ -68,7 +69,6 @@ func (rp *Repo) Tags(w http.ResponseWriter, r *http.Request) { danglingArtifacts = append(danglingArtifacts, a) } } - user := rp.oauth.GetUser(r) rp.pages.RepoTags(w, pages.RepoTagsParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), diff --git a/appview/repo/tree.go b/appview/repo/tree.go index 82f68352..c3dcbe6e 100644 --- a/appview/repo/tree.go +++ b/appview/repo/tree.go @@ -19,6 +19,7 @@ import ( func (rp *Repo) Tree(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoTree") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to fully resolve repo", "err", err) @@ -43,7 +44,7 @@ func (rp *Repo) Tree(w http.ResponseWriter, r *http.Request) { xrpcResp, err := tangled.RepoTree(r.Context(), xrpcc, treePath, ref, repo) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tree", "err", xrpcerr) - rp.pages.Error503(w) + rp.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } // Convert XRPC response to internal types.RepoTreeResponse @@ -86,7 +87,6 @@ func (rp *Repo) Tree(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, redirectTo, http.StatusFound) return } - user := rp.oauth.GetUser(r) var breadcrumbs [][]string breadcrumbs = append(breadcrumbs, []string{f.Name, fmt.Sprintf("/%s/tree/%s", f.OwnerSlashRepo(), url.PathEscape(ref))}) if treePath != "" { diff --git a/appview/state/gfi.go b/appview/state/gfi.go index 1f6ff42d..e8bd41a5 100644 --- a/appview/state/gfi.go +++ b/appview/state/gfi.go @@ -23,14 +23,14 @@ func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) { gfiLabelDef, err := db.GetLabelDefinition(s.db, db.FilterEq("at_uri", goodFirstIssueLabel)) if err != nil { log.Println("failed to get gfi label def", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } repoLabels, err := db.GetRepoLabels(s.db, db.FilterEq("label_at", goodFirstIssueLabel)) if err != nil { log.Println("failed to get repo labels", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } @@ -60,7 +60,7 @@ func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) { ) if err != nil { log.Println("failed to get issues", err) - s.pages.Error503(w) + s.pages.Error503(w, pages.ErrorPageParams{LoggedInUser: user}) return } diff --git a/appview/state/profile.go b/appview/state/profile.go index efc91e1c..d9f27bf9 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -112,11 +112,12 @@ func (s *State) profile(r *http.Request) (*pages.ProfileCard, error) { func (s *State) profileOverview(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "profileHomePage") + user := s.oauth.GetUser(r) profile, err := s.profile(r) if err != nil { l.Error("failed to build profile card", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) @@ -163,7 +164,7 @@ func (s *State) profileOverview(w http.ResponseWriter, r *http.Request) { } s.pages.ProfileOverview(w, pages.ProfileOverviewParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: user, Card: profile, Repos: pinnedRepos, CollaboratingRepos: pinnedCollaboratingRepos, @@ -173,11 +174,12 @@ func (s *State) profileOverview(w http.ResponseWriter, r *http.Request) { func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "reposPage") + user := s.oauth.GetUser(r) profile, err := s.profile(r) if err != nil { l.Error("failed to build profile card", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) @@ -189,12 +191,12 @@ func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { ) if err != nil { l.Error("failed to get repos", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } err = s.pages.ProfileRepos(w, pages.ProfileReposParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: user, Repos: repos, Card: profile, }) @@ -202,11 +204,12 @@ func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "starredPage") + user := s.oauth.GetUser(r) profile, err := s.profile(r) if err != nil { l.Error("failed to build profile card", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) @@ -214,7 +217,7 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { stars, err := db.GetRepoStars(s.db, 0, db.FilterEq("did", profile.UserDid)) if err != nil { l.Error("failed to get stars", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } var repos []models.Repo @@ -223,7 +226,7 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { } err = s.pages.ProfileStarred(w, pages.ProfileStarredParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: user, Repos: repos, Card: profile, }) @@ -231,11 +234,12 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "stringsPage") + user := s.oauth.GetUser(r) profile, err := s.profile(r) if err != nil { l.Error("failed to build profile card", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) @@ -243,12 +247,12 @@ func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) { strings, err := db.GetStrings(s.db, 0, db.FilterEq("did", profile.UserDid)) if err != nil { l.Error("failed to get strings", "err", err) - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: user}) return } err = s.pages.ProfileStrings(w, pages.ProfileStringsParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: user, Strings: strings, Card: profile, }) @@ -379,13 +383,13 @@ func (s *State) followingPage(w http.ResponseWriter, r *http.Request) { func (s *State) AtomFeedPage(w http.ResponseWriter, r *http.Request) { ident, ok := r.Context().Value("resolvedId").(identity.Identity) if !ok { - s.pages.Error404(w) + s.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: nil}) return } feed, err := s.getProfileFeed(r.Context(), &ident) if err != nil { - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: nil}) return } @@ -395,7 +399,7 @@ func (s *State) AtomFeedPage(w http.ResponseWriter, r *http.Request) { atom, err := feed.ToAtom() if err != nil { - s.pages.Error500(w) + s.pages.Error500(w, pages.ErrorPageParams{LoggedInUser: nil}) return } diff --git a/appview/state/router.go b/appview/state/router.go index 04ba3a10..4115a9d9 100644 --- a/appview/state/router.go +++ b/appview/state/router.go @@ -10,6 +10,7 @@ import ( "tangled.org/core/appview/labels" "tangled.org/core/appview/middleware" "tangled.org/core/appview/notifications" + "tangled.org/core/appview/pages" "tangled.org/core/appview/pipelines" "tangled.org/core/appview/pulls" "tangled.org/core/appview/repo" @@ -108,7 +109,7 @@ func (s *State) UserRouter(mw *middleware.Middleware) http.Handler { }) r.NotFound(func(w http.ResponseWriter, r *http.Request) { - s.pages.Error404(w) + s.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: s.oauth.GetUser(r)}) }) return r @@ -179,7 +180,7 @@ func (s *State) StandardRouter(mw *middleware.Middleware) http.Handler { r.Get("/brand", s.Brand) r.NotFound(func(w http.ResponseWriter, r *http.Request) { - s.pages.Error404(w) + s.pages.Error404(w, pages.ErrorPageParams{LoggedInUser: s.oauth.GetUser(r)}) }) return r } diff --git a/appview/strings/strings.go b/appview/strings/strings.go index f0029fa6..c6345ca0 100644 --- a/appview/strings/strings.go +++ b/appview/strings/strings.go @@ -88,6 +88,7 @@ func (s *Strings) timeline(w http.ResponseWriter, r *http.Request) { func (s *Strings) contents(w http.ResponseWriter, r *http.Request) { l := s.Logger.With("handler", "contents") + user := s.OAuth.GetUser(r) id, ok := r.Context().Value("resolvedId").(identity.Identity) if !ok { @@ -118,7 +119,7 @@ func (s *Strings) contents(w http.ResponseWriter, r *http.Request) { } if len(strings) < 1 { l.Error("string not found") - s.Pages.Error404(w) + s.Pages.Error404(w, pages.ErrorPageParams{LoggedInUser: user}) return } if len(strings) != 1 { @@ -152,7 +153,6 @@ func (s *Strings) contents(w http.ResponseWriter, r *http.Request) { if err != nil { l.Error("failed to get star count", "err", err) } - user := s.OAuth.GetUser(r) isStarred := false if user != nil { isStarred = db.GetStarStatus(s.Db, user.Did, string.AtUri()) -- 2.43.0