package publisher
import (
"context"
"net/http"
"tailscale.com/tailcfg"
"alin.ovh/homestead/domain/content/publisher/templates"
basetpl "alin.ovh/homestead/domain/web/templates"
ihttp "alin.ovh/homestead/shared/http"
)
type user struct{}
var (
ErrCannotDetermineUser = ihttp.NewError("cannot determine user", http.StatusInternalServerError)
ErrRenderFailure = ihttp.NewError("failed to render page", http.StatusInternalServerError)
)
func (app *App) WithUserContext(fn ihttp.HandleFunc) ihttp.HandleFunc {
return func(w http.ResponseWriter, r *http.Request) ihttp.Error {
ctx := r.Context()
who, err := app.localClient.WhoIs(ctx, r.RemoteAddr)
if err != nil {
return ErrCannotDetermineUser
}
return fn(w, r.WithContext(
context.WithValue(ctx, user{}, who.UserProfile.Clone()),
))
}
}
func (app *App) Index(w http.ResponseWriter, r *http.Request) ihttp.Error {
user := r.Context().Value(user{}).(*tailcfg.UserProfile)
err := templates.IndexPage(app.siteSettings, templates.PageSettings{
PageSettings: basetpl.PageSettings{
Title: "Home",
},
User: user.LoginName,
}).Render(w)
if err != nil {
return ErrRenderFailure
}
return nil
}
func (app *App) Style(w http.ResponseWriter, r *http.Request) ihttp.Error {
w.Header().Set("Content-Type", "text/css")
http.ServeFileFS(w, r, basetpl.Files, "style.css")
return nil
}
domain/content/publisher/mux.go (view raw)