package publisher import ( "context" "net/http" "alin.ovh/homestead/domain/content/publisher/templates" basetpl "alin.ovh/homestead/domain/web/templates" ihttp "alin.ovh/homestead/shared/http" "tailscale.com/tailcfg" ) 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 }