package router import ( "bookhoard/internal/handlers" ) func registerMediaRoutes(cfg *Config) { e := cfg.Echo // JWT middleware for protected routes jwtMiddleware := createJWTMiddleware(cfg) protected := e.Group("/api", jwtMiddleware) admin := protected.Group("", handlers.AdminMiddleware) // Media item routes (all authenticated users) protected.GET("/media-items", cfg.MediaHandler.ListMediaItems) protected.GET("/media-items/:id", cfg.MediaHandler.GetMediaItem) // Media rating routes (all authenticated users) protected.POST("/media-items/:id/rating", cfg.MediaHandler.CreateMediaRating) protected.GET("/media-items/:id/rating", cfg.MediaHandler.GetMediaRating) protected.PUT("/media-items/:id/rating", cfg.MediaHandler.UpdateMediaRating) protected.DELETE("/media-items/:id/rating", cfg.MediaHandler.DeleteMediaRating) // Progress routes (all authenticated users) protected.GET("/media-items/:id/progress", cfg.MediaHandler.GetMediaReadingProgress) protected.PUT("/media-items/:id/progress", cfg.MediaHandler.UpdateMediaReadingProgress) protected.DELETE("/media-items/:id/progress", cfg.MediaHandler.DeleteMediaReadingProgress) // Notes routes (all authenticated users) protected.GET("/media-items/:id/notes", cfg.MediaHandler.GetMediaNotes) protected.POST("/media-items/:id/notes", cfg.MediaHandler.CreateMediaNote) protected.GET("/media-items/:id/notes/:noteId", cfg.MediaHandler.GetMediaNote) protected.PUT("/media-items/:id/notes/:noteId", cfg.MediaHandler.UpdateMediaNote) protected.DELETE("/media-items/:id/notes/:noteId", cfg.MediaHandler.DeleteMediaNote) // Highlights routes (all authenticated users) protected.GET("/media-items/:id/highlights", cfg.MediaHandler.GetMediaHighlights) protected.POST("/media-items/:id/highlights", cfg.MediaHandler.CreateMediaHighlight) protected.GET("/media-items/:id/highlights/:highlightId", cfg.MediaHandler.GetMediaHighlight) protected.PUT("/media-items/:id/highlights/:highlightId", cfg.MediaHandler.UpdateMediaHighlight) protected.DELETE("/media-items/:id/highlights/:highlightId", cfg.MediaHandler.DeleteMediaHighlight) // Bookmark routes (all authenticated users) protected.GET("/media-items/:id/bookmarks", cfg.MediaHandler.GetMediaBookmarks) protected.POST("/media-items/:id/bookmarks", cfg.MediaHandler.CreateMediaBookmark) protected.PUT("/media-items/:id/bookmarks/:bookmarkId", cfg.MediaHandler.UpdateMediaBookmark) protected.DELETE("/media-items/:id/bookmarks/:bookmarkId", cfg.MediaHandler.DeleteMediaBookmark) // Deleted-annotation history (all authenticated users): tombstoned // highlights/notes/bookmarks restorable or permanently removable from the // book page's "recently deleted" list. protected.GET("/media-items/:id/annotations/deleted", cfg.MediaHandler.GetDeletedAnnotations) protected.POST("/media-items/:id/annotations/:annotationId/restore", cfg.MediaHandler.RestoreDeletedAnnotation) protected.DELETE("/media-items/:id/annotations/:annotationId", cfg.MediaHandler.PurgeDeletedAnnotation) // Admin-only media routes admin.POST("/media-items", cfg.MediaHandler.CreateMediaItem) admin.PUT("/media-items/:id", cfg.MediaHandler.UpdateMediaItem) admin.DELETE("/media-items/:id", cfg.MediaHandler.DeleteMediaItem) // Shelf management (protected) protected.POST("/devices/:id/shelves", cfg.MediaHandler.AddToShelf) protected.GET("/devices/:id/shelves", cfg.MediaHandler.GetShelf) protected.DELETE("/devices/:id/shelves", cfg.MediaHandler.RemoveFromShelf) protected.DELETE("/devices/:id/shelves/clear", cfg.MediaHandler.ClearShelf) // Bulk media operations (protected) mediaItems := protected.Group("/media-items") mediaItems.POST("/bulk-delete", cfg.MediaHandler.HandleBulkDelete) mediaItems.POST("/bulk-update", cfg.MediaHandler.HandleBulkUpdate) // File serving - authenticated (registered on Echo to avoid /api prefix) // Create a group with JWT middleware for routes outside /api authenticated := e.Group("", createJWTMiddleware(cfg)) // Note: Must be registered LAST as it's a wildcard route authenticated.GET("/uploads/library-:id/*", cfg.MediaHandler.ServeFile) }