+ Your knot needs an upgrade. This repository is currently unavailable to users. +
+ {{ else }} ++ The knot hosting this repository needs an upgrade. This repository is currently unavailable. +
+ {{ end }} +diff --git a/appview/knots/knots.go b/appview/knots/knots.go index 742fe2d3..9487a9f2 100644 --- a/appview/knots/knots.go +++ b/appview/knots/knots.go @@ -681,25 +681,48 @@ func (k *Knots) removeMember(w http.ResponseWriter, r *http.Request) { func (k *Knots) banner(w http.ResponseWriter, r *http.Request) { user := k.OAuth.GetUser(r) - l := k.Logger.With("handler", "removeMember") + l := k.Logger.With("handler", "banner") l = l.With("did", user.Did) l = l.With("handle", user.Handle) - registrations, err := db.GetRegistrations( + allRegistrations, err := db.GetRegistrations( k.Db, db.FilterEq("did", user.Did), - db.FilterEq("read_only", 1), ) if err != nil { l.Error("non-fatal: failed to get registrations") return } - if registrations == nil { + httpClient := &http.Client{Timeout: 5 * time.Second} + regs404 := []db.Registration{} + for _, reg := range allRegistrations { + healthURL := fmt.Sprintf("http://%s/xrpc/_health", reg.Domain) + + fmt.Println(healthURL) + + req, err := http.NewRequestWithContext(r.Context(), http.MethodGet, healthURL, nil) + if err != nil { + l.Error("failed to create health check request", "domain", reg.Domain, "err", err) + continue + } + + resp, err := httpClient.Do(req) + if err != nil { + l.Error("failed to make health check request", "domain", reg.Domain, "err", err) + continue + } + defer resp.Body.Close() + + if resp.StatusCode == http.StatusNotFound { + regs404 = append(regs404, reg) + } + } + if len(regs404) == 0 { return } k.Pages.KnotBanner(w, pages.KnotBannerParams{ - Registrations: registrations, + Registrations: regs404, }) } diff --git a/appview/pages/pages.go b/appview/pages/pages.go index ee62bd02..5340a86c 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -356,7 +356,7 @@ type KnotBannerParams struct { } func (p *Pages) KnotBanner(w io.Writer, params KnotBannerParams) error { - return p.executePlain("knots/fragments/banner", w, params) + return p.executePlain("knots/fragments/bannerRequiresUpgrade", w, params) } type KnotsParams struct { @@ -616,6 +616,7 @@ type RepoIndexParams struct { VerifiedCommits commitverify.VerifiedCommits Languages []types.RepoLanguageDetails Pipelines map[string]db.Pipeline + NeedsKnotUpgrade bool types.RepoIndexResponse } @@ -625,6 +626,10 @@ func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { return p.executeRepo("repo/empty", w, params) } + if params.NeedsKnotUpgrade { + return p.executeRepo("repo/needsUpgrade", w, params) + } + p.rctx.RepoInfo = params.RepoInfo p.rctx.RepoInfo.Ref = params.Ref p.rctx.RendererType = markup.RendererTypeRepoMarkdown diff --git a/appview/pages/templates/knots/fragments/banner.html b/appview/pages/templates/knots/fragments/bannerReadOnly.html similarity index 92% rename from appview/pages/templates/knots/fragments/banner.html rename to appview/pages/templates/knots/fragments/bannerReadOnly.html index aa7c2f6c..1f200d79 100644 --- a/appview/pages/templates/knots/fragments/banner.html +++ b/appview/pages/templates/knots/fragments/bannerReadOnly.html @@ -1,4 +1,4 @@ -{{ define "knots/fragments/banner" }} +{{ define "knots/fragments/bannerReadOnly" }}
+ Your knot needs an upgrade. This repository is currently unavailable to users. +
+ {{ else }} ++ The knot hosting this repository needs an upgrade. This repository is currently unavailable. +
+ {{ end }} +