package routes import ( "log/slog" "net/http" "git.codemonkeysoftware.net/b/peachy-go" "git.codemonkeysoftware.net/b/peachy-go/desktop/components" "git.codemonkeysoftware.net/b/peachy-go/desktop/fields" "git.codemonkeysoftware.net/b/peachy-go/desktop/pages" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/httplog/v2" ) /* Create a new chi router, configure it and return it. */ func NewChiRouter(port string, db *peachy.DB) *chi.Mux { r := chi.NewRouter() logger := httplog.NewLogger("app-logger", httplog.Options{ LogLevel: slog.LevelInfo, Concise: true, }) // Use the logger and recoverer middleware. r.Use(httplog.RequestLogger(logger)) r.Use(middleware.Recoverer) /* // ULTRA IMPORTANT : This middleware is used to prevent caching of the pages. // Sometimes, HX requests may be cached by the browser, which may cause unexpected behavior. r.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-store") next.ServeHTTP(w, r) }) }) */ r.Handle("/static/*", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) r.Get("/", func(w http.ResponseWriter, r *http.Request) { HXRender(w, r, pages.Splash) }) r.Get("/site", func(w http.ResponseWriter, r *http.Request) { page, err := pages.HomePage(db) if err != nil { logger.Error("internal error", "path", r.URL.Path, "error", err) w.WriteHeader(http.StatusInternalServerError) return } HXRender(w, r, page) }) r.Patch("/site", func(w http.ResponseWriter, r *http.Request) { r.ParseForm() if r.Form.Has(fields.SiteName) { err := db.SetSiteName(r.Form.Get(fields.SiteName)) if err != nil { logger.Error("internal error", "path", r.URL.Path, "error", err) w.WriteHeader(http.StatusInternalServerError) return } } w.WriteHeader(http.StatusOK) }) r.Get("/hello", func(w http.ResponseWriter, r *http.Request) { HXRender(w, r, components.HelloWorld) }) go http.ListenAndServe(":"+port, r) return r }