package api import ( "net/http" "github.com/gin-gonic/gin" "booklib/cmd/webui/handlers" "booklib/internal/config" "booklib/internal/ports" ) // NewRouter 只依赖 port 接口:main.go 传具体实现(*store.Store 满足 5 个 store // 接口,*redispkg.R 满足 RateLimiter),测试传 portsfake。 func NewRouter(cfg *config.Config, users ports.UserStore, libs ports.LibraryStore, books ports.BookStore, progress ports.ProgressStore, bookmarks ports.BookmarkStore, rl ports.RateLimiter, sc ports.Scanner, med ports.Media, up ports.UploadSessions) *gin.Engine { gin.SetMode(gin.ReleaseMode) h := handlers.New(cfg, users, libs, books, progress, bookmarks, rl, sc, med, up) r := gin.New() if e := r.SetTrustedProxies(cfg.TrustedProxies); e != nil { panic(e) } r.Use(gin.Recovery()) g := r.Group("/api") g.GET("/healthz", func(c *gin.Context) { c.String(http.StatusOK, "ok") }) g.POST("/auth/login", h.Login) p := g.Group("", h.AuthMw()) p.GET("/auth/me", h.Me) usersGrp := p.Group("/users", h.AdminOnly()) usersGrp.GET("", h.ListUsers) usersGrp.POST("", h.CreateUser) usersGrp.DELETE("/:id", h.DeleteUser) libsGrp := p.Group("/libraries") libsGrp.GET("", h.ListLibraries) libsGrp.POST("", h.AdminOnly(), h.CreateLibrary) libsGrp.POST("/:id/scan", h.AdminOnly(), h.ScanLibrary) libsGrp.POST("/:id/upload", h.AdminOnly(), h.Upload) libsGrp.POST("/:id/upload/init", h.AdminOnly(), h.UploadInit) uploads := p.Group("/uploads", h.AdminOnly()) uploads.GET("/:uid", h.UploadStatus) uploads.POST("/:uid/complete", h.UploadComplete) uploads.PUT("/:uid/parts/:index", h.UploadPart) p.GET("/books", h.ListBooks) p.GET("/books/:id", h.GetBook) p.DELETE("/books/:id", h.AdminOnly(), h.DeleteBook) p.GET("/books/:id/cover", h.ServeCover) p.GET("/books/:id/file", h.ServeFile) p.GET("/books/:id/pages", h.PagesCount) p.GET("/books/:id/pages/:n", h.Page) p.PUT("/books/:id/progress", h.PutProgress) p.GET("/progress", h.ListProgress) p.GET("/books/:id/bookmarks", h.ListBookmarks) p.POST("/books/:id/bookmarks", h.CreateBookmark) p.PATCH("/bookmarks/:id", h.PatchBookmark) p.DELETE("/bookmarks/:id", h.DeleteBookmark) return r }