Lots of changes to the website
This commit is contained in:
@@ -8,11 +8,13 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"ridgwaysystems.org/website/internal/blog"
|
||||
"ridgwaysystems.org/website/internal/newsletter"
|
||||
"ridgwaysystems.org/website/internal/ratelimit"
|
||||
"ridgwaysystems.org/website/internal/status"
|
||||
)
|
||||
|
||||
// Handler holds shared dependencies for all HTTP handlers.
|
||||
@@ -84,12 +86,15 @@ func mustLoadTemplates() map[string]*template.Template {
|
||||
{"uses", "templates/uses.html"},
|
||||
{"projects", "templates/projects.html"},
|
||||
{"error", "templates/error.html"},
|
||||
{"changelog", "templates/changelog.html"},
|
||||
{"admin-login", "templates/admin/login.html"},
|
||||
{"admin-dashboard", "templates/admin/dashboard.html"},
|
||||
{"admin-editor", "templates/admin/editor.html"},
|
||||
{"admin-status", "templates/admin/status.html"},
|
||||
{"admin-uploads", "templates/admin/uploads.html"},
|
||||
{"admin-newsletter", "templates/admin/newsletter.html"},
|
||||
{"admin-changelog", "templates/admin/changelog.html"},
|
||||
{"admin-changelog-editor", "templates/admin/changelog-editor.html"},
|
||||
}
|
||||
|
||||
for _, p := range pages {
|
||||
@@ -103,6 +108,56 @@ func mustLoadTemplates() map[string]*template.Template {
|
||||
return m
|
||||
}
|
||||
|
||||
// baseEnvelope wraps page-specific data with shared layout data for the base template.
|
||||
type baseEnvelope struct {
|
||||
Banner *siteBanner
|
||||
Inner any
|
||||
}
|
||||
|
||||
// siteBanner holds the data for the site-wide status banner.
|
||||
type siteBanner struct {
|
||||
Level string // "danger" | "warning"
|
||||
Message string
|
||||
}
|
||||
|
||||
// computeBanner loads status.json and returns a banner if any services are down or degraded.
|
||||
func (h *Handler) computeBanner() *siteBanner {
|
||||
p, err := status.Load(filepath.Join(h.dataDir, "status.json"))
|
||||
if err != nil || p == nil {
|
||||
return nil
|
||||
}
|
||||
var down, degraded []string
|
||||
for _, s := range p.Services {
|
||||
switch s.Status {
|
||||
case "down":
|
||||
down = append(down, s.Name)
|
||||
case "degraded":
|
||||
degraded = append(degraded, s.Name)
|
||||
}
|
||||
}
|
||||
switch {
|
||||
case len(down) > 0:
|
||||
noun := "are unavailable"
|
||||
if len(down) == 1 {
|
||||
noun = "is unavailable"
|
||||
}
|
||||
return &siteBanner{
|
||||
Level: "danger",
|
||||
Message: "Major Outage \u2014 " + strings.Join(down, ", ") + " " + noun + ".",
|
||||
}
|
||||
case len(degraded) > 0:
|
||||
noun := "are experiencing issues"
|
||||
if len(degraded) == 1 {
|
||||
noun = "is experiencing issues"
|
||||
}
|
||||
return &siteBanner{
|
||||
Level: "warning",
|
||||
Message: "Partial Outage \u2014 " + strings.Join(degraded, ", ") + " " + noun + ".",
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Handler) render(w http.ResponseWriter, name string, data any) {
|
||||
t := h.tmpl(name)
|
||||
if t == nil {
|
||||
@@ -110,7 +165,7 @@ func (h *Handler) render(w http.ResponseWriter, name string, data any) {
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
if err := t.ExecuteTemplate(w, "base", data); err != nil {
|
||||
if err := t.ExecuteTemplate(w, "base", baseEnvelope{Banner: h.computeBanner(), Inner: data}); err != nil {
|
||||
log.Printf("render %s: %v", name, err)
|
||||
}
|
||||
}
|
||||
@@ -132,7 +187,7 @@ func (h *Handler) renderErr(w http.ResponseWriter, code int, msg string) {
|
||||
code, http.StatusText(code), msg)
|
||||
return
|
||||
}
|
||||
if err := t.ExecuteTemplate(w, "base", data); err != nil {
|
||||
if err := t.ExecuteTemplate(w, "base", baseEnvelope{Banner: h.computeBanner(), Inner: data}); err != nil {
|
||||
log.Printf("renderErr %d: %v", code, err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user