70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|