Redmage/server/routes/routes.go

86 lines
2.9 KiB
Go

package routes
import (
"io/fs"
"net/http"
"os"
"github.com/go-chi/chi/v5"
chimiddleware "github.com/go-chi/chi/v5/middleware"
"github.com/riandyrn/otelchi"
"github.com/tigorlazuardi/redmage/api"
"github.com/tigorlazuardi/redmage/config"
"github.com/tigorlazuardi/redmage/server/routes/middleware"
)
type Routes struct {
API *api.API
Config *config.Config
PublicDir fs.FS
}
func (routes *Routes) Register(router chi.Router) {
router.Use(chimiddleware.Compress(5, "text/html", "text/css", "application/javascript", "application/json", "image/svg+xml", "image/x-icon"))
router.HandleFunc("/ping", routes.HealthCheck)
router.HandleFunc("/health", routes.HealthCheck)
if routes.Config.Bool("http.hotreload") {
router.Get("/hot_reload", routes.CreateHotReloadRoute())
}
router.Route("/htmx", routes.registerHTMXRoutes)
router.Route("/api/v1", routes.registerV1APIRoutes)
router.Group(routes.registerWWWRoutes)
}
func (routes *Routes) registerV1APIRoutes(router chi.Router) {
router.Use(otelchi.Middleware("redmage"))
router.Use(chimiddleware.RequestLogger(middleware.ChiLogger{}))
router.Use(chimiddleware.SetHeader("Content-Type", "application/json"))
router.Post("/subreddits/start", routes.SubredditStartDownloadAPI)
router.Get("/subreddits", routes.SubredditsListAPI)
router.Post("/subreddits", routes.SubredditsCreateAPI)
router.Post("/subreddits/check", routes.SubredditsCheckAPI)
router.Get("/devices", routes.APIDeviceList)
router.Post("/devices", routes.APIDeviceCreate)
router.Patch("/devices/{slug}", routes.APIDeviceUpdate)
router.Get("/images", routes.ImagesListAPI)
router.Get("/events", routes.EventsAPI)
}
func (routes *Routes) registerHTMXRoutes(router chi.Router) {
router.Use(otelchi.Middleware("redmage"))
router.Use(chimiddleware.RequestLogger(middleware.ChiLogger{}))
router.Use(chimiddleware.SetHeader("Content-Type", "text/html; charset=utf-8"))
router.Post("/subreddits/add", routes.SubredditsCreateHTMX)
router.Post("/subreddits/start", routes.SubredditStartDownloadHTMX)
router.Post("/subreddits/check", routes.SubredditCheckHTMX)
router.Get("/subreddits/validate/schedule", routes.SubredditValidateScheduleHTMX)
}
func (routes *Routes) registerWWWRoutes(router chi.Router) {
router.Mount("/public", http.StripPrefix("/public", http.FileServer(http.FS(routes.PublicDir))))
imagesDir := http.FS(os.DirFS(routes.Config.String("download.directory")))
router.Mount("/img", http.StripPrefix("/img", http.FileServer(imagesDir)))
router.Group(func(r chi.Router) {
r.Use(otelchi.Middleware("redmage"))
r.Use(chimiddleware.RequestID)
r.Use(chimiddleware.RequestLogger(middleware.ChiLogger{}))
r.Use(chimiddleware.SetHeader("Content-Type", "text/html; charset=utf-8"))
r.Get("/", routes.PageHome)
r.Get("/subreddits", routes.PageSubreddits)
r.Get("/subreddits/details/{name}", routes.PageSubredditsDetails)
r.Get("/subreddits/add", routes.PageSubredditsAdd)
r.Get("/config", routes.PageConfig)
})
}