package router import ( "bookhoard/internal/handlers" ) func registerSyncRoutes(cfg *Config) { e := cfg.Echo // JWT middleware for protected routes jwtMiddleware := createJWTMiddleware(cfg) protected := e.Group("/api", jwtMiddleware) // Create handler for sync-specific routes h := handlers.NewHandler(cfg.Queries, cfg.ConnManager, cfg.QueueProcessor, cfg.Cfg) // Book matching and unlinked book resolution routes sync := protected.Group("/sync") sync.POST("/bulk-link-books", h.BulkLinkBooks) sync.POST("/auto-link-books", h.AutoLinkBooks) sync.GET("/unlinked-books/:id/suggestions", h.GetUnlinkedBookSuggestions) // KOReader sync routes (device authentication required) koreaderSync := e.Group("/api/sync/koreader") koreaderSync.POST("/progress", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.SyncProgress)) koreaderSync.GET("/metadata/:uuid", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.GetMetadata)) koreaderSync.GET("/library", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.GetLibrary)) koreaderSync.POST("/bookmarks", cfg.DeviceAuthMiddleware.Authenticate(cfg.KOReaderHandler.SyncBookmarks)) // Kobo sync routes (device authentication required) // Kobo devices use URL path: /api/sync/kobo/{token}/markup // API clients can use Authorization header: Authorization: Bearer {token} koboHandler := handlers.NewKoboHandler(cfg.Queries, cfg.ConnManager) koboHandler.SetProgressService(cfg.ProgressService) koboSync := e.Group("/api/sync/kobo/:token") koboSync.POST("/markup", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Markup)) koboSync.POST("/bookmark", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Bookmark)) koboSync.POST("/v1/analytics/gettests", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.AnalyticsGettests)) koboSync.GET("/v1/initialization", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.Initialization)) koboSync.POST("/sync-from-server", cfg.DeviceAuthMiddleware.Authenticate(koboHandler.SyncFromServer)) } func registerWebSocketRoutes(cfg *Config) { e := cfg.Echo wsGroup := e.Group("/ws/sync") wsGroup.GET("", cfg.WSHandler.HandleWebSocket) }