package main import ( "fmt" "log" "net/http" "time" "github.com/alexedwards/scs/v2" ) type GlobalState struct { Count int } var global GlobalState var sessionManager *scs.SessionManager func getHandler(w http.ResponseWriter, r *http.Request) { userCount := sessionManager.GetInt(r.Context(), "count") component := page(global.Count, userCount) component.Render(r.Context(), w) } func postHandler(w http.ResponseWriter, r *http.Request) { // Update state. r.ParseForm() // Check to see if the global button was pressed. if r.Form.Has("global") { global.Count++ } if r.Form.Has("user") { currentCount := sessionManager.GetInt(r.Context(), "count") sessionManager.Put(r.Context(), "count", currentCount+1) } // Display the form. getHandler(w, r) } func main() { // Initialize the session. sessionManager = scs.New() sessionManager.Lifetime = 24 * time.Hour mux := http.NewServeMux() // Handle POST and GET requests. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodPost { postHandler(w, r) return } getHandler(w, r) }) // Include the static content. mux.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets")))) // Add the middleware. muxWithSessionMiddleware := sessionManager.LoadAndSave(mux) // Start the server. fmt.Println("listening on :8080") if err := http.ListenAndServe("127.0.0.1:8080", muxWithSessionMiddleware); err != nil { log.Printf("error listening: %v", err) } }