forked from tangled.org/core
this repo has no description

appview: knot upgrade banner

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.sh>

Changed files
+80 -8
appview
+28 -5
appview/knots/knots.go
···
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,
})
}
+6 -1
appview/pages/pages.go
···
}
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 {
···
VerifiedCommits commitverify.VerifiedCommits
Languages []types.RepoLanguageDetails
Pipelines map[string]db.Pipeline
+
NeedsKnotUpgrade bool
types.RepoIndexResponse
}
···
params.Active = "overview"
if params.IsEmpty {
return p.executeRepo("repo/empty", w, params)
+
}
+
+
if params.NeedsKnotUpgrade {
+
return p.executeRepo("repo/needsUpgrade", w, params)
}
p.rctx.RepoInfo = params.RepoInfo
+1 -2
appview/pages/templates/knots/fragments/banner.html appview/pages/templates/knots/fragments/bannerReadOnly.html
···
-
{{ define "knots/fragments/banner" }}
+
{{ define "knots/fragments/bannerReadOnly" }}
<div class="w-full px-6 py-2 -z-15 bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border border-yellow-200 dark:border-yellow-800 rounded-b drop-shadow-sm">
A knot ({{range $i, $r := .Registrations}}{{if ne $i 0}}, {{end}}{{ $r.Domain }}{{ end }})
that you administer is presently read-only. Consider upgrading this knot to
···
<a href="https://tangled.sh/@tangled.sh/core/blob/master/docs/migrations/knot-1.7.0.md">Click to read the upgrade guide</a>.
</div>
{{ end }}
-
+12
appview/pages/templates/knots/fragments/bannerRequiresUpgrade.html
···
+
{{ define "knots/fragments/bannerRequiresUpgrade" }}
+
<div class="prose mx-auto w-96 px-6 py-2 bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 border border-yellow-200 dark:border-yellow-800 rounded-b drop-shadow-sm">
+
The following knots that you administer require upgrade to be compatible with the latest version of Tangled:
+
<ul>
+
{{range $i, $r := .Registrations}}
+
<li>{{ $r.Domain }}</li>
+
{{ end }}
+
</ul>
+
Repositories hosted on these knots will not be accessible until upgraded.
+
<a href="https://tangled.sh/@tangled.sh/core/blob/master/docs/migrations/knot-1.8.0.md">Click to read the upgrade guide</a>.
+
</div>
+
{{ end }}
+24
appview/pages/templates/repo/needsUpgrade.html
···
+
{{ define "title" }}{{ .RepoInfo.FullName }}{{ end }}
+
+
{{ define "extrameta" }}
+
{{ template "repo/fragments/meta" . }}
+
{{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo) }}
+
{{ end }}
+
+
{{ define "repoContent" }}
+
<main>
+
<div class="w-full h-full flex place-content-center {{ if .LoggedInUser }} bg-yellow-100 dark:bg-yellow-900 {{ end }}">
+
<div class="py-6 w-fit flex flex-col gap-4 text-center">
+
{{ if .LoggedInUser }}
+
<p class=" text-yellow-800 dark:text-yellow-200 text-center">
+
Your knot needs an upgrade. This repository is currently unavailable to users.
+
</p>
+
{{ else }}
+
<p class="text-gray-400 dark:text-gray-500 py-6 text-center">
+
The knot hosting this repository needs an upgrade. This repository is currently unavailable.
+
</p>
+
{{ end }}
+
</div>
+
</div>
+
</main>
+
{{ end }}
+9
appview/repo/index.go
···
package repo
import (
+
"errors"
"fmt"
"log"
"net/http"
···
Host: host,
}
+
var needsKnotUpgrade bool
// Build index response from multiple XRPC calls
result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref)
if err != nil {
+
if errors.Is(err, xrpcclient.ErrXrpcUnsupported) {
+
log.Println("failed to call XRPC repo.index", err)
+
needsKnotUpgrade = true
+
return
+
}
+
rp.pages.Error503(w)
log.Println("failed to build index response", err)
return
···
rp.pages.RepoIndexPage(w, pages.RepoIndexParams{
LoggedInUser: user,
+
NeedsKnotUpgrade: needsKnotUpgrade,
RepoInfo: repoInfo,
TagMap: tagMap,
RepoIndexResponse: *result,