package router func registerDeviceRoutes(cfg *Config) { e := cfg.Echo // JWT middleware jwtMiddleware := createJWTMiddleware(cfg) // Protected routes protected := e.Group("/api", jwtMiddleware) devices := protected.Group("/devices") // Public device registration routes (no auth required) e.POST("/api/devices/register", cfg.DeviceHandler.InitiateRegistration) e.POST("/api/devices/register/status", cfg.DeviceHandler.CheckRegistrationStatus) // The REGISTERING device may end its own pairing attempt (dismissed // waiting dialog); bearer is the registration UUID it holds, same // trust as the status poll. e.POST("/api/devices/register/cancel", cfg.DeviceHandler.CancelRegistration) // Device management routes (protected) devices.GET("", cfg.DeviceHandler.ListDevices) devices.GET("/:id", cfg.DeviceHandler.GetDevice) devices.PUT("/:id", cfg.DeviceHandler.UpdateDevice) devices.DELETE("/:id", cfg.DeviceHandler.DeleteDevice) // Token regeneration endpoint (JWT authentication required) devices.PUT("/:id/regenerate-token", cfg.DeviceHandler.RegenerateDeviceToken) devices.GET("/pending", cfg.DeviceHandler.ListPendingRegistrations) devices.GET("/approve/:registration_id", cfg.DeviceHandler.ApproveDevice) // Pairing-code claim flow (JWT): lookup is the confirm-card data, // claim binds the device to the caller's account. devices.POST("/claim/lookup", cfg.DeviceHandler.LookupPairingCode) devices.POST("/claim", cfg.DeviceHandler.ClaimDevice) // Device sidecar configuration routes devices.GET("/:id/sidecar", cfg.SidecarHandler.GetSidecarConfig) devices.GET("/:id/sidecar/download", cfg.SidecarHandler.DownloadSidecarConfig) }