package main import ( "embed" "fmt" "io/fs" "log" "net/http" ) //go:embed build/frontend/public var frontendEmbed embed.FS func init() { router.HandleFunc("/api/version", version) router.HandleFunc("/api/registration", registration).Methods("POST") // frontend must come last to make sure /api takes precedence frontend, err := fs.Sub(frontendEmbed, "build/frontend/public") if err != nil { log.Fatalf("No embedded frontend: %v.", err) } router.PathPrefix("/").Handler(http.FileServerFS(frontend)) } func version(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, versionTxt) } func registration(w http.ResponseWriter, r *http.Request) { token, err := NewToken() if err != nil { http.Error(w, "Failed to generate token.", http.StatusInternalServerError) return } cookie := http.Cookie{ Name: "token", Value: token.Private(), HttpOnly: true, Secure: true, SameSite: http.SameSiteStrictMode, } http.SetCookie(w, &cookie) fmt.Fprintf(w, "%s\n", token.Public()) }