From 9906ee35e7621060909db6ffa17311b98db34652 Mon Sep 17 00:00:00 2001 From: Shalabh Agarwal Date: Wed, 22 Oct 2025 00:02:37 +0530 Subject: [PATCH] appview: add user in 503 error pages Change-Id: prquzlvztlultvlxnupoyksqkquztxos Signed-off-by: Shalabh Agarwal --- appview/issues/issues.go | 8 ++- appview/pages/pages.go | 4 +- appview/pulls/pulls.go | 40 +++++++++++---- appview/repo/index.go | 4 +- appview/repo/repo.go | 107 +++++++++++++++++++++++++++------------ appview/state/gfi.go | 8 ++- 6 files changed, 123 insertions(+), 48 deletions(-) diff --git a/appview/issues/issues.go b/appview/issues/issues.go index a8f94d4d..a897cddf 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -101,7 +101,9 @@ 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 } @@ -826,7 +828,9 @@ 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/pages/pages.go b/appview/pages/pages.go index 858a1a05..51308c59 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -1534,6 +1534,6 @@ 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 926cf35c..d62eee7b 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -205,7 +205,9 @@ 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 } @@ -636,7 +638,9 @@ 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 } @@ -785,7 +789,9 @@ 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) @@ -795,7 +801,9 @@ 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 } @@ -1392,7 +1400,9 @@ 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) @@ -1402,7 +1412,9 @@ 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 } @@ -1484,7 +1496,9 @@ 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) @@ -1495,7 +1509,9 @@ 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 } @@ -1513,7 +1529,9 @@ 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) @@ -1524,7 +1542,9 @@ 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/index.go b/appview/repo/index.go index 3e3865cd..ccf8d85a 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -67,7 +67,9 @@ func (rp *Repo) RepoIndex(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/repo.go b/appview/repo/repo.go index 6bdd650f..ba70816a 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -90,6 +90,7 @@ func New( func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "DownloadArchive") + user := rp.oauth.GetUser(r) ref := chi.URLParam(r, "ref") ref, _ = url.PathUnescape(ref) @@ -113,7 +114,9 @@ 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: user, + }) return } @@ -130,6 +133,7 @@ func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoLog(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 { @@ -169,21 +173,27 @@ func (rp *Repo) RepoLog(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 } @@ -204,7 +214,9 @@ func (rp *Repo) RepoLog(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 } @@ -217,8 +229,6 @@ func (rp *Repo) RepoLog(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) @@ -388,14 +398,18 @@ func (rp *Repo) RepoCommit(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 } @@ -433,6 +447,7 @@ func (rp *Repo) RepoCommit(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoTree(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 { @@ -462,7 +477,9 @@ func (rp *Repo) RepoTree(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 } @@ -514,8 +531,6 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { 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 != "" { @@ -537,6 +552,7 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoTags(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 { @@ -557,14 +573,18 @@ func (rp *Repo) RepoTags(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 } @@ -596,7 +616,6 @@ func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) { } } - user := rp.oauth.GetUser(r) rp.pages.RepoTags(w, pages.RepoTagsParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(user), @@ -608,6 +627,7 @@ func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoBranches(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 { @@ -628,20 +648,23 @@ func (rp *Repo) RepoBranches(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), @@ -700,6 +723,7 @@ func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoBlob(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 { @@ -726,7 +750,9 @@ func (rp *Repo) RepoBlob(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 } @@ -798,8 +824,6 @@ func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) { sizeHint = uint64(len(resp.Content)) } - user := rp.oauth.GetUser(r) - // Determine if content is binary (dereference pointer) isBinary := false if resp.IsBinary != nil { @@ -826,6 +850,7 @@ func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) { func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoBlobRaw") + user := rp.oauth.GetUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -874,7 +899,9 @@ 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: user, + }) return } defer resp.Body.Close() @@ -1965,28 +1992,36 @@ 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", models.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 @@ -2420,7 +2455,9 @@ func (rp *Repo) RepoCompareNew(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 } @@ -2457,7 +2494,9 @@ func (rp *Repo) RepoCompareNew(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 } @@ -2534,7 +2573,9 @@ func (rp *Repo) RepoCompare(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 } @@ -2548,7 +2589,9 @@ func (rp *Repo) RepoCompare(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 } @@ -2562,7 +2605,9 @@ func (rp *Repo) RepoCompare(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/state/gfi.go b/appview/state/gfi.go index b0106813..9185b1e8 100644 --- a/appview/state/gfi.go +++ b/appview/state/gfi.go @@ -28,7 +28,9 @@ func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) { 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 } @@ -57,7 +59,9 @@ 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 } -- 2.43.0