- Add BrowseDirectories() to library service with path traversal protection - Add BrowseDirectories handler with proper error handling - Register GET /api/libraries/browse endpoint (admin-only) - Returns current path, parent path, and list of subdirectories - Security: blocks "..", validates path exists, checks is directory Fixes: Issue 2 (backend)
63 lines
2.2 KiB
Go
63 lines
2.2 KiB
Go
package router
|
|
|
|
import (
|
|
"bookhoard/internal/handlers"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
func registerLibraryRoutes(cfg *Config) {
|
|
e := cfg.Echo
|
|
|
|
// JWT middleware for protected routes
|
|
jwtMiddleware := createJWTMiddleware(cfg)
|
|
|
|
// Protected routes group
|
|
protected := e.Group("/api", jwtMiddleware)
|
|
|
|
// Create handler for library-specific convenience routes
|
|
h := handlers.NewHandler(cfg.Queries, cfg.ConnManager, cfg.QueueProcessor)
|
|
|
|
// Public library types endpoint
|
|
e.GET("/api/libraries/types", cfg.LibraryHandler.GetLibraryTypes)
|
|
|
|
// Library management routes
|
|
library := protected.Group("/libraries")
|
|
|
|
// Admin-only library routes
|
|
adminLibrary := library.Group("", handlers.AdminMiddleware)
|
|
adminLibrary.POST("", cfg.LibraryHandler.CreateLibrary)
|
|
adminLibrary.GET("", cfg.LibraryHandler.ListLibraries)
|
|
adminLibrary.GET("/browse", cfg.LibraryHandler.BrowseDirectories)
|
|
adminLibrary.GET("/:id", cfg.LibraryHandler.GetLibrary)
|
|
adminLibrary.PUT("/:id", cfg.LibraryHandler.UpdateLibrary)
|
|
adminLibrary.DELETE("/:id", cfg.LibraryHandler.DeleteLibrary)
|
|
adminLibrary.POST("/:id/folders", cfg.LibraryHandler.AddLibraryFolder)
|
|
adminLibrary.GET("/:id/folders", cfg.LibraryHandler.GetLibraryFolders)
|
|
adminLibrary.DELETE("/:id/folders", cfg.LibraryHandler.DeleteLibraryFolder)
|
|
adminLibrary.GET("/:id/stats", cfg.LibraryHandler.GetLibraryStats)
|
|
adminLibrary.POST("/:id/scan", func(c echo.Context) error {
|
|
libraryID := c.Param("id")
|
|
scanReq := map[string]interface{}{
|
|
"library_id": libraryID,
|
|
}
|
|
c.Set("scan_request", scanReq)
|
|
return h.ScanLibrary(c)
|
|
})
|
|
adminLibrary.GET("/:id/media-items", func(c echo.Context) error {
|
|
libraryID := c.Param("id")
|
|
c.QueryParams().Set("library_id", libraryID)
|
|
return cfg.MediaHandler.ListMediaItems(c)
|
|
})
|
|
|
|
// System scan settings (admin-only)
|
|
adminLibrary.GET("/scan-settings", cfg.SystemSettingsHandler.GetScanSettings)
|
|
adminLibrary.PUT("/scan-settings", cfg.SystemSettingsHandler.UpdateScanSettings)
|
|
|
|
// User library visibility control
|
|
userLibrary := library.Group("/visibility")
|
|
userLibrary.GET("", cfg.LibraryHandler.GetUserVisibleLibraries)
|
|
userLibrary.POST("", cfg.LibraryHandler.SetLibraryVisibility)
|
|
// Note: Remove endpoint may not exist - check handlers
|
|
}
|