package main import ( "flag" "log" "net" "net/http" "os" "strconv" "github.com/gorilla/handlers" "gosten/model" "gosten/templ" ) // flags var ( port uint64 host string ) func init() { flag.StringVar(&host, "h", "localhost", "address to listen on") flag.Uint64Var(&port, "p", 8080, "port to listen on") } var Q *model.Queries func main() { flag.Parse() db := openDB("") if err := db.Ping(); err != nil { log.Fatal(err) } Q = model.New(db) mux := http.NewServeMux() mux.Handle("GET /login", loginPage()) mux.HandleFunc("POST /login", handleLogin) mux.Handle("GET /logout", handleLogout()) mux.Handle("/static/", http.StripPrefix("/static", http.FileServer(http.Dir("static")))) mux.Handle("/favicon.ico", http.NotFoundHandler()) handler := sessionHandler(csrfHandler(mux)) handler = handlers.CombinedLoggingHandler(os.Stderr, handler) handler = handlers.ProxyHeaders(handler) // the real content, needing authentification authMux := http.NewServeMux() mux.Handle("/", RequireAuth(authMux)) authMux.Handle("GET /{$}", indexPage()) address := net.JoinHostPort(host, strconv.FormatUint(port, 10)) log.Fatal(http.ListenAndServe(address, handler)) } func showTemplate(w http.ResponseWriter, tpl string, data any) { if err := templ.Lookup(tpl).Execute(w, data); err != nil { log.Panicf("Executing '%s' with %+v: %v", tpl, data, err) } } func indexPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { uid := userId(r) u, _ := Q.GetUserById(r.Context(), uid) showTemplate(w, "index", u.Name) } }