pegasus/backend/routes.go

72 lines
1.8 KiB
Go
Raw Normal View History

2026-04-11 00:02:59 -03:00
// backend/routes.go
package main
import (
"embed"
"io/fs"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/prometheus/client_golang/prometheus/promhttp"
"scm.bstein.dev/bstein/Pegasus/backend/internal"
)
//go:embed web/dist
var webFS embed.FS
func buildRouter(um *internal.UserMap, jf jellyfinClient) http.Handler {
r := chi.NewRouter()
r.Use(corsForTus)
r.Get("/healthz", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("ok"))
})
r.Get("/version", func(w http.ResponseWriter, _ *http.Request) {
writeJSON(w, map[string]any{
"version": version,
"git": git,
"built_at": builtAt,
})
})
r.Post("/api/login", loginHandler(um, jf))
r.Post("/api/logout", logoutHandler())
r.Get("/api/whoami", whoamiHandler(um))
r.Get("/api/list", listHandler(um))
r.Post("/api/rename", renameHandler(um, jf))
r.Delete("/api/file", deleteHandler(um, jf))
r.Post("/api/mkdir", mkdirHandler(um, jf))
tusHandler := newTusHandler(um, jf)
r.Route("/tus", func(rt chi.Router) {
rt.Use(sessionRequired)
rt.Post("/", tusHandler.PostFile)
rt.Head("/{id}", tusHandler.HeadFile)
rt.Patch("/{id}", tusHandler.PatchFile)
rt.Delete("/{id}", tusHandler.DelFile)
rt.Get("/{id}", tusHandler.GetFile)
})
r.Handle("/metrics", promhttp.Handler())
appFS, err := fs.Sub(webFS, "web/dist")
if err == nil {
static := http.FileServer(http.FS(appFS))
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
static.ServeHTTP(w, r)
})
r.Method("GET", "/*", http.StripPrefix("/", static))
}
r.Get("/debug/env", debugEnvHandler())
r.Get("/debug/write-test", debugWriteTestHandler(um))
r.NotFound(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "no route for "+r.Method+" "+r.URL.Path, http.StatusNotFound)
})
return debugHandler(r)
}