70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package home
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/internal/component"
|
|
"github.com/FAU-CDI/wisski-distillery/internal/component/instances"
|
|
"github.com/FAU-CDI/wisski-distillery/pkg/lazy"
|
|
"github.com/tkw1536/goprogram/stream"
|
|
)
|
|
|
|
type Home struct {
|
|
component.Base
|
|
|
|
Instances *instances.Instances
|
|
|
|
RefreshInterval time.Duration
|
|
|
|
redirect lazy.Lazy[*Redirect]
|
|
instanceNames lazy.Lazy[map[string]struct{}]
|
|
homeBytes lazy.Lazy[[]byte]
|
|
}
|
|
|
|
func (*Home) Routes() []string { return []string{"/"} }
|
|
|
|
func (home *Home) Handler(route string, context context.Context, io stream.IOStream) (http.Handler, error) {
|
|
home.updateRedirect(context, io)
|
|
home.updateInstances(context, io)
|
|
home.updateRender(context, io)
|
|
return home, nil
|
|
}
|
|
|
|
func (home *Home) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
slug, ok := home.Config.SlugFromHost(r.Host)
|
|
switch {
|
|
case !ok:
|
|
http.NotFound(w, r)
|
|
case slug != "":
|
|
home.serveWissKI(w, slug, r)
|
|
default:
|
|
home.serveRoot(w, r)
|
|
}
|
|
}
|
|
|
|
func (home *Home) serveRoot(w http.ResponseWriter, r *http.Request) {
|
|
// not the root url => server the fallback
|
|
if !(r.URL.Path == "" || r.URL.Path == "/") {
|
|
home.redirect.Get(nil).ServeHTTP(w, r)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "text/html")
|
|
w.WriteHeader(http.StatusAccepted)
|
|
w.Write(home.homeBytes.Get(nil))
|
|
}
|
|
|
|
func (home *Home) serveWissKI(w http.ResponseWriter, slug string, r *http.Request) {
|
|
if _, ok := home.instanceNames.Get(nil)[slug]; !ok {
|
|
// Get(nil) guaranteed to work by precondition
|
|
w.WriteHeader(http.StatusNotFound)
|
|
fmt.Fprintf(w, "WissKI %q not found\n", slug)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusBadGateway)
|
|
fmt.Fprintf(w, "WissKI %q is currently offline\n", slug)
|
|
}
|