package api import ( "net/http" "github.com/gin-gonic/gin" "booklib/internal/config" "booklib/internal/redispkg" "booklib/internal/scanner" "booklib/internal/store" ) func NewRouter(cfg *config.Config, st *store.Store, rdb *redispkg.R, sc *scanner.Scanner) *gin.Engine { gin.SetMode(gin.ReleaseMode) a := &api{cfg: cfg, st: st, rdb: rdb, sc: sc} r := gin.New() r.Use(gin.Recovery()) g := r.Group("/api") g.GET("/healthz", func(c *gin.Context) { c.String(http.StatusOK, "ok") }) g.POST("/auth/login", a.login) p := g.Group("", a.authMw()) p.GET("/auth/me", a.me) users := p.Group("/users", a.adminOnly()) users.GET("", a.listUsers) users.POST("", a.createUser) users.DELETE("/:id", a.deleteUser) libs := p.Group("/libraries") libs.GET("", a.listLibraries) libs.POST("", a.adminOnly(), a.createLibrary) libs.POST("/:id/scan", a.adminOnly(), a.scanLibrary) libs.POST("/:id/upload", a.adminOnly(), a.upload) p.GET("/books", a.listBooks) p.GET("/books/:id", a.getBook) p.DELETE("/books/:id", a.adminOnly(), a.deleteBook) p.GET("/books/:id/cover", a.serveCover) p.GET("/books/:id/file", a.serveFile) p.GET("/books/:id/pages", a.pagesCount) p.GET("/books/:id/pages/:n", a.page) return r }