package app import ( "net/http" ) type pageData struct { Title string Email string Error string Notice string CSRF string Token string User User Sub Subscriber Counts struct{ Subs, Users, Catalog, Boms int } Catalog []CatalogEntry Edit *CatalogEntry Subs []SubscriberWithUsers BOMs []BOMSummary BOM *BOMDetail BackURL string } func (a *App) render(w http.ResponseWriter, r *http.Request, status int, name string, data pageData) { data.CSRF = csrfToken(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(status) _ = tmpl.ExecuteTemplate(w, name, data) } func (a *App) handleLoginForm(w http.ResponseWriter, r *http.Request) { a.render(w, r, http.StatusOK, "login", pageData{Title: "Sign in"}) } func (a *App) handleLogin(w http.ResponseWriter, r *http.Request) { email := r.PostFormValue("email") password := r.PostFormValue("password") u, err := a.authenticate(r.Context(), email, password) if err != nil { a.render(w, r, http.StatusUnauthorized, "login", pageData{ Title: "Sign in", Email: email, Error: "Invalid email or password.", }) return } raw, err := a.createSession(r.Context(), u.ID) if err != nil { http.Error(w, "could not start session", http.StatusInternalServerError) return } a.setSessionCookie(w, raw) sub, _ := a.subscriber(r.Context(), u.SubscriberID) dest := "/app" if sub.IsInternal { dest = "/admin" } http.Redirect(w, r, dest, http.StatusSeeOther) } func (a *App) handleLogout(w http.ResponseWriter, r *http.Request) { if c, err := r.Cookie(cookieName); err == nil && c.Value != "" { a.destroySession(r.Context(), c.Value) } a.clearSessionCookie(w) http.Redirect(w, r, "/login", http.StatusSeeOther) } func (a *App) handleApp(w http.ResponseWriter, r *http.Request) { u, s, _ := current(r) boms, err := a.listBOMs(r.Context(), &s.ID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } a.render(w, r, http.StatusOK, "app", pageData{ Title: "Dashboard", User: u, Sub: s, BOMs: boms, Notice: r.URL.Query().Get("notice"), Error: r.URL.Query().Get("err"), }) }