From 1e05470fbb222228bfd3d6df4aab8539e1358a73 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Fri, 6 Mar 2026 14:00:28 -0500 Subject: [PATCH] refactor(handlers): update all handlers for Echo v5 compatibility Update all handler functions to use *echo.Context (pointer) instead of echo.Context (value) as required by Echo v5. Changes across all handler files: - analytics.go: Update handler signatures - auth.go: Update authentication handler signatures - book_matching.go: Update matching handler signatures - collections.go: Update collection handler signatures - collections_preview_test.go: Update test signatures - commonhandlers.go: Update common handler signatures - conflicts.go: Update conflict handler signatures - context.go: Update context handler signatures - dashboard.go: Update dashboard handler signatures - devices.go: Update device handler signatures - jobs.go: Update job handler signatures - kobo.go: Update Kobo handler signatures - koreader.go: Update Koreader handler signatures - library.go: Update library handler signatures - matching.go: Update matching handler signatures - media.go: Update media handler signatures - opds.go: Update OPDS handler signatures - progress.go: Update progress handler signatures - queue.go: Update queue handler signatures - refresh_token.go: Update token handler signatures - scanner.go: Update scanner handler signatures - sidecar.go: Update sidecar handler signatures - sync.go: Update sync handler signatures - system_settings.go: Update settings handler signatures - websocket.go: Update WebSocket handler signatures All handlers now properly implement Echo v5's pointer-based context pattern. This change is necessary for type safety and compatibility with Echo v5's improved context handling and WebSocket support. --- internal/handlers/analytics.go | 8 +-- internal/handlers/auth.go | 26 ++++---- internal/handlers/book_matching.go | 24 +++---- internal/handlers/collections.go | 44 ++++++------- internal/handlers/collections_preview_test.go | 2 +- internal/handlers/commonhandlers.go | 2 +- internal/handlers/conflicts.go | 18 ++--- internal/handlers/context.go | 6 +- internal/handlers/dashboard.go | 10 +-- internal/handlers/devices.go | 26 ++++---- internal/handlers/jobs.go | 6 +- internal/handlers/kobo.go | 22 +++---- internal/handlers/koreader.go | 20 +++--- internal/handlers/library.go | 28 ++++---- internal/handlers/matching.go | 24 +++---- internal/handlers/media.go | 66 +++++++++---------- internal/handlers/opds.go | 18 ++--- internal/handlers/progress.go | 12 ++-- internal/handlers/queue.go | 16 ++--- internal/handlers/refresh_token.go | 6 +- internal/handlers/scanner.go | 16 ++--- internal/handlers/sidecar.go | 10 +-- internal/handlers/sync.go | 6 +- internal/handlers/system_settings.go | 6 +- internal/handlers/websocket.go | 4 +- 25 files changed, 213 insertions(+), 213 deletions(-) diff --git a/internal/handlers/analytics.go b/internal/handlers/analytics.go index 60f5cca..7be958c 100644 --- a/internal/handlers/analytics.go +++ b/internal/handlers/analytics.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type AnalyticsHandler struct { @@ -67,7 +67,7 @@ type PopularBook struct { LastRead string `json:"last_read"` } -func (h *AnalyticsHandler) GetReadingStats(c echo.Context) error { +func (h *AnalyticsHandler) GetReadingStats(c *echo.Context) error { user := c.Get("user").(database.Users) startDate := c.QueryParam("start_date") @@ -205,7 +205,7 @@ func (h *AnalyticsHandler) calculateMostActiveDay(history []database.GetUserRead return mostActive } -func (h *AnalyticsHandler) GetDeviceUsage(c echo.Context) error { +func (h *AnalyticsHandler) GetDeviceUsage(c *echo.Context) error { user := c.Get("user").(database.Users) ctx := context.Background() @@ -243,7 +243,7 @@ func (h *AnalyticsHandler) GetDeviceUsage(c echo.Context) error { }) } -func (h *AnalyticsHandler) GetPopularBooks(c echo.Context) error { +func (h *AnalyticsHandler) GetPopularBooks(c *echo.Context) error { user := c.Get("user").(database.Users) limit := c.QueryParam("limit") diff --git a/internal/handlers/auth.go b/internal/handlers/auth.go index 87a4b3c..c7ee9c1 100644 --- a/internal/handlers/auth.go +++ b/internal/handlers/auth.go @@ -16,7 +16,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "golang.org/x/crypto/bcrypt" ) @@ -95,7 +95,7 @@ type AdminUpdateUserRequest struct { } // Register handles POST /api/auth/register -func (h *AuthHandler) Register(c echo.Context) error { +func (h *AuthHandler) Register(c *echo.Context) error { email := c.FormValue("email") username := c.FormValue("username") password := c.FormValue("password") @@ -300,7 +300,7 @@ window.location.href = '/dashboard'; } // Login handles POST /api/auth/login -func (h *AuthHandler) Login(c echo.Context) error { +func (h *AuthHandler) Login(c *echo.Context) error { login := c.FormValue("login") password := c.FormValue("password") @@ -452,7 +452,7 @@ window.location.href = '%s'; } // GetProfile handles GET /api/auth/profile -func (h *AuthHandler) GetProfile(c echo.Context) error { +func (h *AuthHandler) GetProfile(c *echo.Context) error { user := MustGetAuthenticatedUser(c) firstName := "" @@ -475,7 +475,7 @@ func (h *AuthHandler) GetProfile(c echo.Context) error { // UpdateProfile handles PUT /api/auth/profile (self-edit) and PUT /api/auth/profile/:id (admin edit) // Combined handler for both self-service and admin profile updates -func (h *AuthHandler) UpdateProfile(c echo.Context) error { +func (h *AuthHandler) UpdateProfile(c *echo.Context) error { currentUser := MustGetAuthenticatedUser(c) // Determine target user: URL param (admin mode) or current user (self-edit) @@ -603,7 +603,7 @@ func (h *AuthHandler) UpdateProfile(c echo.Context) error { } // ListUsers handles GET /api/auth/users -func (h *AuthHandler) ListUsers(c echo.Context) error { +func (h *AuthHandler) ListUsers(c *echo.Context) error { users, err := h.db.ListUsers(c.Request().Context()) if err != nil { return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) @@ -641,7 +641,7 @@ type UpdateThemeRequest struct { } // UpdateTheme handles PUT /api/auth/theme -func (h *AuthHandler) UpdateTheme(c echo.Context) error { +func (h *AuthHandler) UpdateTheme(c *echo.Context) error { user := MustGetAuthenticatedUser(c) var req UpdateThemeRequest @@ -668,7 +668,7 @@ type UpdateUsernameRequest struct { } // UpdateUsername handles PUT /api/auth/username -func (h *AuthHandler) UpdateUsername(c echo.Context) error { +func (h *AuthHandler) UpdateUsername(c *echo.Context) error { user := MustGetAuthenticatedUser(c) var req UpdateUsernameRequest @@ -702,7 +702,7 @@ type UpdateEmailRequest struct { } // UpdateEmail handles PUT /api/auth/email -func (h *AuthHandler) UpdateEmail(c echo.Context) error { +func (h *AuthHandler) UpdateEmail(c *echo.Context) error { user := MustGetAuthenticatedUser(c) var req UpdateEmailRequest @@ -739,7 +739,7 @@ type UpdatePasswordRequest struct { // UpdatePassword handles PUT /api/auth/password (self-change) and PUT /api/auth/password/:id (admin reset) // Combined handler for both self-service password change and admin password reset -func (h *AuthHandler) UpdatePassword(c echo.Context) error { +func (h *AuthHandler) UpdatePassword(c *echo.Context) error { currentUser := MustGetAuthenticatedUser(c) // Determine target user: URL param (admin mode) or current user (self-change) @@ -820,7 +820,7 @@ func (h *AuthHandler) UpdatePassword(c echo.Context) error { // DeleteUser handles DELETE /api/auth/profile (self-deletion) and DELETE /api/auth/profile/:id (admin deletion) // Combined handler for both self-deletion and admin deletion of users -func (h *AuthHandler) DeleteUser(c echo.Context) error { +func (h *AuthHandler) DeleteUser(c *echo.Context) error { currentUser := MustGetAuthenticatedUser(c) // Get target user ID from URL param (admin mode) or use current user (self-deletion) @@ -912,7 +912,7 @@ type UpdateUserMaxDevicesRequest struct { } // UpdateUserMaxDevices handles PUT /api/auth/users/:id/max-devices (admin only) -func (h *AuthHandler) UpdateUserMaxDevices(c echo.Context) error { +func (h *AuthHandler) UpdateUserMaxDevices(c *echo.Context) error { userID := c.Param("id") if userID == "" { return c.JSON(http.StatusBadRequest, map[string]string{"error": "user id required"}) @@ -949,7 +949,7 @@ func (h *AuthHandler) UpdateUserMaxDevices(c echo.Context) error { // AdminMiddleware checks if the user has admin role func AdminMiddleware(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { + return func(c *echo.Context) error { userRole, exists := c.Get("user_role").(string) if !exists || userRole != "admin" { return c.JSON(http.StatusForbidden, map[string]string{"error": "admin access required"}) diff --git a/internal/handlers/book_matching.go b/internal/handlers/book_matching.go index dd7378a..7aaf139 100644 --- a/internal/handlers/book_matching.go +++ b/internal/handlers/book_matching.go @@ -9,7 +9,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // Book matching service (added to Handler struct in scanner.go initialization) @@ -40,7 +40,7 @@ func toFloat8(f float64) pgtype.Float8 { } // QueryBooks handles POST /api/sync/books/query -func (h *Handler) QueryBooks(c echo.Context) error { +func (h *Handler) QueryBooks(c *echo.Context) error { matchingService := h.getMatchingService() var req services.BookQueryRequest @@ -61,7 +61,7 @@ func (h *Handler) QueryBooks(c echo.Context) error { } // LinkBook handles POST /api/sync/link-book -func (h *Handler) LinkBook(c echo.Context) error { +func (h *Handler) LinkBook(c *echo.Context) error { matchingService := h.getMatchingService() var req services.LinkBookRequest @@ -101,7 +101,7 @@ func (h *Handler) LinkBook(c echo.Context) error { } // GetUnlinkedBooks handles GET /api/sync/unlinked-books -func (h *Handler) GetUnlinkedBooks(c echo.Context) error { +func (h *Handler) GetUnlinkedBooks(c *echo.Context) error { matchingService := h.getMatchingService() deviceIDStr := c.Param("deviceId") @@ -126,7 +126,7 @@ func (h *Handler) GetUnlinkedBooks(c echo.Context) error { } // GetDeviceFileAliases handles GET /api/devices/:id/file-aliases -func (h *Handler) GetDeviceFileAliases(c echo.Context) error { +func (h *Handler) GetDeviceFileAliases(c *echo.Context) error { deviceIDStr := c.Param("id") deviceID, err := uuid.Parse(deviceIDStr) if err != nil { @@ -172,7 +172,7 @@ func (h *Handler) GetDeviceFileAliases(c echo.Context) error { } // BulkLinkBooks handles POST /api/sync/bulk-link-books -func (h *Handler) BulkLinkBooks(c echo.Context) error { +func (h *Handler) BulkLinkBooks(c *echo.Context) error { ctx := c.Request().Context() var req BulkLinkBooksRequest @@ -250,7 +250,7 @@ func (h *Handler) BulkLinkBooks(c echo.Context) error { } // AutoLinkBooks handles POST /api/sync/auto-link-books -func (h *Handler) AutoLinkBooks(c echo.Context) error { +func (h *Handler) AutoLinkBooks(c *echo.Context) error { ctx := c.Request().Context() matchingService := h.getMatchingService() @@ -326,7 +326,7 @@ func (h *Handler) AutoLinkBooks(c echo.Context) error { } // GetUnlinkedBookSuggestions handles GET /api/sync/unlinked-books/:id/suggestions -func (h *Handler) GetUnlinkedBookSuggestions(c echo.Context) error { +func (h *Handler) GetUnlinkedBookSuggestions(c *echo.Context) error { ctx := c.Request().Context() matchingService := h.getMatchingService() @@ -366,7 +366,7 @@ func (h *Handler) GetUnlinkedBookSuggestions(c echo.Context) error { } // CreateDeviceFileAlias handles POST /api/devices/:id/file-aliases -func (h *Handler) CreateDeviceFileAlias(c echo.Context) error { +func (h *Handler) CreateDeviceFileAlias(c *echo.Context) error { deviceIDStr := c.Param("id") deviceID, err := uuid.Parse(deviceIDStr) if err != nil { @@ -421,7 +421,7 @@ func (h *Handler) CreateDeviceFileAlias(c echo.Context) error { } // UpdateDeviceFileAlias handles PUT /api/devices/:id/file-aliases/:aliasId -func (h *Handler) UpdateDeviceFileAlias(c echo.Context) error { +func (h *Handler) UpdateDeviceFileAlias(c *echo.Context) error { aliasIDStr := c.Param("aliasId") aliasID, err := uuid.Parse(aliasIDStr) if err != nil { @@ -488,7 +488,7 @@ func (h *Handler) UpdateDeviceFileAlias(c echo.Context) error { } // DeleteDeviceFileAlias handles DELETE /api/devices/:id/file-aliases/:aliasId -func (h *Handler) DeleteDeviceFileAlias(c echo.Context) error { +func (h *Handler) DeleteDeviceFileAlias(c *echo.Context) error { aliasIDStr := c.Param("aliasId") aliasID, err := uuid.Parse(aliasIDStr) if err != nil { @@ -510,7 +510,7 @@ func (h *Handler) DeleteDeviceFileAlias(c echo.Context) error { } // GetBookMatches handles GET /api/books/match -func (h *Handler) GetBookMatches(c echo.Context) error { +func (h *Handler) GetBookMatches(c *echo.Context) error { matchingService := h.getMatchingService() // Get query parameters diff --git a/internal/handlers/collections.go b/internal/handlers/collections.go index 2a1ec7e..a1384c7 100644 --- a/internal/handlers/collections.go +++ b/internal/handlers/collections.go @@ -15,7 +15,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type CollectionHandler struct { @@ -86,7 +86,7 @@ type SectionData struct { Priority int `json:"priority"` } -func (h *CollectionHandler) CreateCollection(c echo.Context) error { +func (h *CollectionHandler) CreateCollection(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) @@ -134,7 +134,7 @@ func (h *CollectionHandler) CreateCollection(c echo.Context) error { return c.JSON(http.StatusCreated, response) } -func (h *CollectionHandler) GetCollections(c echo.Context) error { +func (h *CollectionHandler) GetCollections(c *echo.Context) error { includeAuto := c.QueryParam("include_auto") == "true" sortBy := c.QueryParam("sort_by") @@ -185,7 +185,7 @@ func (h *CollectionHandler) GetCollections(c echo.Context) error { }) } -func (h *CollectionHandler) GetCollection(c echo.Context) error { +func (h *CollectionHandler) GetCollection(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -231,7 +231,7 @@ func (h *CollectionHandler) GetCollection(c echo.Context) error { }) } -func (h *CollectionHandler) UpdateCollection(c echo.Context) error { +func (h *CollectionHandler) UpdateCollection(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -279,7 +279,7 @@ func (h *CollectionHandler) UpdateCollection(c echo.Context) error { return c.JSON(http.StatusCreated, response) } -func (h *CollectionHandler) DeleteCollection(c echo.Context) error { +func (h *CollectionHandler) DeleteCollection(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -298,7 +298,7 @@ func (h *CollectionHandler) DeleteCollection(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *CollectionHandler) AddBooks(c echo.Context) error { +func (h *CollectionHandler) AddBooks(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -345,7 +345,7 @@ func (h *CollectionHandler) AddBooks(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *CollectionHandler) RemoveBook(c echo.Context) error { +func (h *CollectionHandler) RemoveBook(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -385,7 +385,7 @@ type BulkRemoveBooksRequest struct { BookIDs []string `json:"book_ids" validate:"required"` } -func (h *CollectionHandler) BulkRemoveBooks(c echo.Context) error { +func (h *CollectionHandler) BulkRemoveBooks(c *echo.Context) error { collectionID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid collection id"}) @@ -436,7 +436,7 @@ func (h *CollectionHandler) BulkRemoveBooks(c echo.Context) error { }) } -func (h *CollectionHandler) GetDeviceMappings(c echo.Context) error { +func (h *CollectionHandler) GetDeviceMappings(c *echo.Context) error { deviceID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device id"}) @@ -475,7 +475,7 @@ func (h *CollectionHandler) GetDeviceMappings(c echo.Context) error { }) } -func (h *CollectionHandler) CreateDeviceMapping(c echo.Context) error { +func (h *CollectionHandler) CreateDeviceMapping(c *echo.Context) error { deviceID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device id"}) @@ -515,7 +515,7 @@ func (h *CollectionHandler) CreateDeviceMapping(c echo.Context) error { }) } -func (h *CollectionHandler) UpdateDeviceMapping(c echo.Context) error { +func (h *CollectionHandler) UpdateDeviceMapping(c *echo.Context) error { mappingID, err := uuid.Parse(c.Param("mappingId")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid mapping id"}) @@ -549,7 +549,7 @@ func (h *CollectionHandler) UpdateDeviceMapping(c echo.Context) error { }) } -func (h *CollectionHandler) DeleteDeviceMapping(c echo.Context) error { +func (h *CollectionHandler) DeleteDeviceMapping(c *echo.Context) error { mappingID, err := uuid.Parse(c.Param("mappingId")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid mapping id"}) @@ -563,7 +563,7 @@ func (h *CollectionHandler) DeleteDeviceMapping(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *CollectionHandler) GetBookCollections(c echo.Context) error { +func (h *CollectionHandler) GetBookCollections(c *echo.Context) error { bookID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid book id"}) @@ -607,25 +607,25 @@ func textToString(t pgtype.Text) string { return "" } -func (h *CollectionHandler) GetCollectionsData(c echo.Context) ([]database.Collections, error) { +func (h *CollectionHandler) GetCollectionsData(c *echo.Context) ([]database.Collections, error) { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) return h.collectionService.GetUserCollections(c.Request().Context(), userUUID) } -func (h *CollectionHandler) GetCollectionData(c echo.Context, collectionID uuid.UUID) (database.Collections, error) { +func (h *CollectionHandler) GetCollectionData(c *echo.Context, collectionID uuid.UUID) (database.Collections, error) { return h.collectionService.GetCollection(c.Request().Context(), collectionID) } -func (h *CollectionHandler) GetCollectionBooksData(c echo.Context, collectionID uuid.UUID) ([]database.GetCollectionItemsRow, error) { +func (h *CollectionHandler) GetCollectionBooksData(c *echo.Context, collectionID uuid.UUID) ([]database.GetCollectionItemsRow, error) { return h.collectionService.GetCollectionBooks(c.Request().Context(), collectionID) } -func (h *CollectionHandler) GetDeviceMappingsData(c echo.Context, deviceID uuid.UUID) ([]database.GetDeviceShelfMappingsRow, error) { +func (h *CollectionHandler) GetDeviceMappingsData(c *echo.Context, deviceID uuid.UUID) ([]database.GetDeviceShelfMappingsRow, error) { return h.collectionService.GetDeviceShelfMappings(c.Request().Context(), deviceID) } -func (h *CollectionHandler) GetUserCollectionsList(c echo.Context) ([]database.Collections, error) { +func (h *CollectionHandler) GetUserCollectionsList(c *echo.Context) ([]database.Collections, error) { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) return h.collectionService.GetUserCollections(c.Request().Context(), userUUID) @@ -643,7 +643,7 @@ type BookMatch struct { MatchReason string `json:"match_reason"` } -func (h *CollectionHandler) TestRules(c echo.Context) error { +func (h *CollectionHandler) TestRules(c *echo.Context) error { var req TestRulesRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"}) @@ -771,7 +771,7 @@ func (h *CollectionHandler) compareValues(itemValue, operator, ruleValue string) // POST /api/collections/bulk-add-books // Bulk add books to multiple collections -func (h *CollectionHandler) HandleBulkAddBooks(c echo.Context) error { +func (h *CollectionHandler) HandleBulkAddBooks(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) @@ -867,7 +867,7 @@ func (h *CollectionHandler) HandleBulkAddBooks(c echo.Context) error { }) } -func (h *CollectionHandler) PreviewCollection(c echo.Context) error { +func (h *CollectionHandler) PreviewCollection(c *echo.Context) error { user := c.Get("user") if user == nil { return c.JSON(http.StatusUnauthorized, map[string]string{"error": "unauthorized"}) diff --git a/internal/handlers/collections_preview_test.go b/internal/handlers/collections_preview_test.go index 401f2ca..852d804 100644 --- a/internal/handlers/collections_preview_test.go +++ b/internal/handlers/collections_preview_test.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/stretchr/testify/assert" ) diff --git a/internal/handlers/commonhandlers.go b/internal/handlers/commonhandlers.go index c773019..f213df9 100644 --- a/internal/handlers/commonhandlers.go +++ b/internal/handlers/commonhandlers.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type Handler struct { diff --git a/internal/handlers/conflicts.go b/internal/handlers/conflicts.go index d3cb069..d3acdb2 100644 --- a/internal/handlers/conflicts.go +++ b/internal/handlers/conflicts.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type ConflictHandler struct { @@ -64,7 +64,7 @@ type ConflictResolveResponse struct { DevicesSynced []string `json:"devices_synced"` } -func (h *ConflictHandler) GetConflictsData(c echo.Context) ([]ConflictDetailResponse, int, int, error) { +func (h *ConflictHandler) GetConflictsData(c *echo.Context) ([]ConflictDetailResponse, int, int, error) { user := c.Get("user").(database.Users) status := c.QueryParam("status") @@ -126,7 +126,7 @@ func (h *ConflictHandler) GetConflictsData(c echo.Context) ([]ConflictDetailResp return response, len(response), unresolvedCount, nil } -func (h *ConflictHandler) ListConflicts(c echo.Context) error { +func (h *ConflictHandler) ListConflicts(c *echo.Context) error { conflicts, total, unresolved, err := h.GetConflictsData(c) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "failed to list conflicts") @@ -139,7 +139,7 @@ func (h *ConflictHandler) ListConflicts(c echo.Context) error { }) } -func (h *ConflictHandler) GetConflict(c echo.Context) error { +func (h *ConflictHandler) GetConflict(c *echo.Context) error { user := c.Get("user").(database.Users) conflictID, err := uuid.Parse(c.Param("id")) @@ -194,7 +194,7 @@ func (h *ConflictHandler) GetConflict(c echo.Context) error { return c.JSON(http.StatusOK, detail) } -func (h *ConflictHandler) ResolveConflict(c echo.Context) error { +func (h *ConflictHandler) ResolveConflict(c *echo.Context) error { user := c.Get("user").(database.Users) conflictID, err := uuid.Parse(c.Param("id")) @@ -365,7 +365,7 @@ func (h *ConflictHandler) notifyDevicesOfResolution(mediaItemID pgtype.UUID, dat return synced } -func (h *ConflictHandler) DeleteConflict(c echo.Context) error { +func (h *ConflictHandler) DeleteConflict(c *echo.Context) error { user := c.Get("user").(database.Users) conflictID, err := uuid.Parse(c.Param("id")) @@ -393,7 +393,7 @@ func (h *ConflictHandler) DeleteConflict(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *ConflictHandler) DismissAllResolved(c echo.Context) error { +func (h *ConflictHandler) DismissAllResolved(c *echo.Context) error { user := c.Get("user").(database.Users) conflicts, err := h.db.ListSyncConflictsByUser(context.Background(), user.ID) @@ -435,7 +435,7 @@ type ConflictResult struct { Winner string `json:"winner,omitempty"` } -func (h *ConflictHandler) BulkResolveConflicts(c echo.Context) error { +func (h *ConflictHandler) BulkResolveConflicts(c *echo.Context) error { user := c.Get("user").(database.Users) var req BulkResolveRequest @@ -694,7 +694,7 @@ func (h *ConflictHandler) applyResolution(mediaItemID pgtype.UUID, userID pgtype return err } -func (h *ConflictHandler) BulkDismissConflicts(c echo.Context) error { +func (h *ConflictHandler) BulkDismissConflicts(c *echo.Context) error { user := c.Get("user").(database.Users) var req struct { diff --git a/internal/handlers/context.go b/internal/handlers/context.go index be35a02..8c85c25 100644 --- a/internal/handlers/context.go +++ b/internal/handlers/context.go @@ -4,12 +4,12 @@ import ( "bookhoard/internal/database" "net/http" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // GetAuthenticatedUser safely retrieves the authenticated user from context // Returns an error if the user is not found in context or type assertion fails -func GetAuthenticatedUser(c echo.Context) (database.Users, error) { +func GetAuthenticatedUser(c *echo.Context) (database.Users, error) { user, ok := c.Get("user").(database.Users) if !ok { return database.Users{}, echo.NewHTTPError(http.StatusInternalServerError, "authentication context error") @@ -20,7 +20,7 @@ func GetAuthenticatedUser(c echo.Context) (database.Users, error) { // MustGetAuthenticatedUser gets user or panics // Only use this after authentication middleware has verified the user // Panicking here indicates a serious bug in the middleware chain -func MustGetAuthenticatedUser(c echo.Context) database.Users { +func MustGetAuthenticatedUser(c *echo.Context) database.Users { user, err := GetAuthenticatedUser(c) if err != nil { panic(err) // Should never happen if authentication middleware is working correctly diff --git a/internal/handlers/dashboard.go b/internal/handlers/dashboard.go index 0d834cb..1de1d5b 100644 --- a/internal/handlers/dashboard.go +++ b/internal/handlers/dashboard.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type DashboardHandler struct { @@ -25,7 +25,7 @@ func NewDashboardHandler(db *database.Queries) *DashboardHandler { } } -func (h *DashboardHandler) GetSections(c echo.Context) error { +func (h *DashboardHandler) GetSections(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) @@ -67,7 +67,7 @@ func (h *DashboardHandler) GetSections(c echo.Context) error { return c.JSON(http.StatusOK, map[string]interface{}{"sections": sectionData}) } -func (h *DashboardHandler) UpdatePreferences(c echo.Context) error { +func (h *DashboardHandler) UpdatePreferences(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) @@ -107,7 +107,7 @@ func (h *DashboardHandler) UpdatePreferences(c echo.Context) error { return c.JSON(http.StatusOK, prefs) } -func (h *DashboardHandler) RestoreSystemCollection(c echo.Context) error { +func (h *DashboardHandler) RestoreSystemCollection(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) @@ -196,7 +196,7 @@ func getViewAllURL(collectionID string, libraryID string) string { return "" } -func (h *DashboardHandler) GetPreferences(c echo.Context) error { +func (h *DashboardHandler) GetPreferences(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := uuid.UUID(user.ID.Bytes) libraryID := c.QueryParam("library_id") diff --git a/internal/handlers/devices.go b/internal/handlers/devices.go index 7349197..8aa68bd 100644 --- a/internal/handlers/devices.go +++ b/internal/handlers/devices.go @@ -12,7 +12,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "github.com/skip2/go-qrcode" "golang.org/x/crypto/bcrypt" ) @@ -104,7 +104,7 @@ type PendingRegistration struct { var pendingRegistrations = make(map[string]*PendingRegistration) -func (h *DeviceHandler) InitiateRegistration(c echo.Context) error { +func (h *DeviceHandler) InitiateRegistration(c *echo.Context) error { req := DeviceRegistrationRequest{} if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request format"}) @@ -157,7 +157,7 @@ func (h *DeviceHandler) InitiateRegistration(c echo.Context) error { return c.JSON(http.StatusCreated, response) } -func (h *DeviceHandler) CheckRegistrationStatus(c echo.Context) error { +func (h *DeviceHandler) CheckRegistrationStatus(c *echo.Context) error { req := DeviceAuthStatusRequest{} if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request format"}) @@ -230,7 +230,7 @@ func (h *DeviceHandler) CheckRegistrationStatus(c echo.Context) error { }) } -func (h *DeviceHandler) ListDevices(c echo.Context) error { +func (h *DeviceHandler) ListDevices(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -274,7 +274,7 @@ func (h *DeviceHandler) ListDevices(c echo.Context) error { }) } -func (h *DeviceHandler) GetDevicesData(c echo.Context) ([]DeviceInfo, error) { +func (h *DeviceHandler) GetDevicesData(c *echo.Context) ([]DeviceInfo, error) { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -315,7 +315,7 @@ func (h *DeviceHandler) GetDevicesData(c echo.Context) ([]DeviceInfo, error) { return deviceList, nil } -func (h *DeviceHandler) GetDevice(c echo.Context) error { +func (h *DeviceHandler) GetDevice(c *echo.Context) error { userID := c.Get("user_id") if userID == nil { return c.JSON(http.StatusUnauthorized, map[string]string{"error": "unauthorized"}) @@ -363,7 +363,7 @@ func (h *DeviceHandler) GetDevice(c echo.Context) error { }) } -func (h *DeviceHandler) UpdateDevice(c echo.Context) error { +func (h *DeviceHandler) UpdateDevice(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -458,7 +458,7 @@ func (h *DeviceHandler) UpdateDevice(c echo.Context) error { }) } -func (h *DeviceHandler) DeleteDevice(c echo.Context) error { +func (h *DeviceHandler) DeleteDevice(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -488,7 +488,7 @@ func (h *DeviceHandler) DeleteDevice(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *DeviceHandler) RegenerateDeviceToken(c echo.Context) error { +func (h *DeviceHandler) RegenerateDeviceToken(c *echo.Context) error { // Verify JWT authentication userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) @@ -573,7 +573,7 @@ func (h *DeviceHandler) RegenerateDeviceToken(c echo.Context) error { }) } -func (h *DeviceHandler) ApproveDevice(c echo.Context) error { +func (h *DeviceHandler) ApproveDevice(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -603,7 +603,7 @@ func (h *DeviceHandler) ApproveDevice(c echo.Context) error { }) } -func (h *DeviceHandler) RejectDevice(c echo.Context) error { +func (h *DeviceHandler) RejectDevice(c *echo.Context) error { registrationID := c.Param("registration_id") _, exists := pendingRegistrations[registrationID] @@ -618,7 +618,7 @@ func (h *DeviceHandler) RejectDevice(c echo.Context) error { }) } -func (h *DeviceHandler) GetPendingRegistrationsData(c echo.Context) ([]map[string]interface{}, error) { +func (h *DeviceHandler) GetPendingRegistrationsData(c *echo.Context) ([]map[string]interface{}, error) { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -643,7 +643,7 @@ func (h *DeviceHandler) GetPendingRegistrationsData(c echo.Context) ([]map[strin return registrations, nil } -func (h *DeviceHandler) ListPendingRegistrations(c echo.Context) error { +func (h *DeviceHandler) ListPendingRegistrations(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { diff --git a/internal/handlers/jobs.go b/internal/handlers/jobs.go index 6ee5e3c..a512bbd 100644 --- a/internal/handlers/jobs.go +++ b/internal/handlers/jobs.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/google/uuid" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" "bookhoard/internal/database" "bookhoard/internal/services" @@ -23,7 +23,7 @@ func NewJobsHandler(db *database.Queries, worker *services.Worker) *JobsHandler } // CreateJob creates a new job based on type -func (h *JobsHandler) CreateJob(c echo.Context) error { +func (h *JobsHandler) CreateJob(c *echo.Context) error { var req struct { Type string `json:"type"` Params map[string]interface{} `json:"params"` @@ -73,7 +73,7 @@ func (h *JobsHandler) CreateJob(c echo.Context) error { } // GetJobStatus returns the status of a specific job -func (h *JobsHandler) GetJobStatus(c echo.Context) error { +func (h *JobsHandler) GetJobStatus(c *echo.Context) error { jobID := c.Param("jobId") result, exists := h.worker.GetJobStatus(jobID) diff --git a/internal/handlers/kobo.go b/internal/handlers/kobo.go index a617a1e..a0eb73e 100644 --- a/internal/handlers/kobo.go +++ b/internal/handlers/kobo.go @@ -14,7 +14,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type KoboHandler struct { @@ -28,7 +28,7 @@ func NewKoboHandler(db *database.Queries, connManager *wsync.ConnectionManager) // mapContentIdToBookhoardUUID maps Kobo ContentId to Bookhoard UUID with multiple fallback strategies // Enhanced Kobo Sync - ContentId Mapping Logic -func (h *KoboHandler) mapContentIdToBookhoardUUID(ctx echo.Context, contentId string, deviceID uuid.UUID) (uuid.UUID, error, string) { +func (h *KoboHandler) mapContentIdToBookhoardUUID(ctx *echo.Context, contentId string, deviceID uuid.UUID) (uuid.UUID, error, string) { // Step 1: Try direct ContentId lookup in device_catalogs table catalog, err := h.db.GetDeviceCatalogByKoboContentId(ctx.Request().Context(), contentId) if err == nil && catalog.ID.Valid { @@ -82,7 +82,7 @@ func (h *KoboHandler) mapContentIdToBookhoardUUID(ctx echo.Context, contentId st // mapBookhoardUUIDToKoboContentId maps Bookhoard UUID to Kobo ContentId // Creates new entry in device_catalogs if not exists -func (h *KoboHandler) mapBookhoardUUIDToKoboContentId(c echo.Context, bookhoardUUID uuid.UUID, deviceID uuid.UUID) (string, error) { +func (h *KoboHandler) mapBookhoardUUIDToKoboContentId(c *echo.Context, bookhoardUUID uuid.UUID, deviceID uuid.UUID) (string, error) { // Check if catalog entry already exists catalog, err := h.db.GetDeviceCatalogByBookhoardUUID(c.Request().Context(), database.GetDeviceCatalogByBookhoardUUIDParams{ DeviceID: pgtype.UUID{Bytes: deviceID, Valid: true}, @@ -136,7 +136,7 @@ func (h *KoboHandler) mapBookhoardUUIDToKoboContentId(c echo.Context, bookhoardU } // getCollectionMetadataForBook retrieves collection names for a book -func (h *KoboHandler) getCollectionMetadataForBook(c echo.Context, bookhoardUUID uuid.UUID, deviceID uuid.UUID) ([]string, error) { +func (h *KoboHandler) getCollectionMetadataForBook(c *echo.Context, bookhoardUUID uuid.UUID, deviceID uuid.UUID) ([]string, error) { device := c.Get("device").(database.Devices) pgDeviceID := pgtype.UUID{Bytes: device.ID.Bytes, Valid: true} @@ -269,7 +269,7 @@ type KoboAnalyticsTest struct { PercentRead float64 `json:"PercentRead"` } -func (h *KoboHandler) Initialization(c echo.Context) error { +func (h *KoboHandler) Initialization(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes deviceID := device.ID.Bytes @@ -379,11 +379,11 @@ func (h *KoboHandler) Initialization(c echo.Context) error { }) } -func (h *KoboHandler) LibrarySync(c echo.Context) error { +func (h *KoboHandler) LibrarySync(c *echo.Context) error { return h.Initialization(c) } -func (h *KoboHandler) Markup(c echo.Context) error { +func (h *KoboHandler) Markup(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes deviceID := device.ID.Bytes @@ -521,7 +521,7 @@ func (h *KoboHandler) Markup(c echo.Context) error { return c.JSON(http.StatusOK, response) } -func (h *KoboHandler) Bookmark(c echo.Context) error { +func (h *KoboHandler) Bookmark(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes deviceID := device.ID.Bytes @@ -590,7 +590,7 @@ func (h *KoboHandler) Bookmark(c echo.Context) error { }) } -func (h *KoboHandler) AnalyticsGettests(c echo.Context) error { +func (h *KoboHandler) AnalyticsGettests(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes deviceID := device.ID.Bytes @@ -649,7 +649,7 @@ func (h *KoboHandler) AnalyticsGettests(c echo.Context) error { }) } -func parseKoboDeviceHeader(c echo.Context) (KoboDeviceInfo, error) { +func parseKoboDeviceHeader(c *echo.Context) (KoboDeviceInfo, error) { deviceHeader := c.Request().Header.Get("x-kobo-device") if deviceHeader == "" { return KoboDeviceInfo{}, fmt.Errorf("missing x-kobo-device header") @@ -663,7 +663,7 @@ func parseKoboDeviceHeader(c echo.Context) (KoboDeviceInfo, error) { return device, nil } -func (h *KoboHandler) SyncFromServer(c echo.Context) error { +func (h *KoboHandler) SyncFromServer(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes deviceID := device.ID.Bytes diff --git a/internal/handlers/koreader.go b/internal/handlers/koreader.go index 1d8c539..3bd3d71 100644 --- a/internal/handlers/koreader.go +++ b/internal/handlers/koreader.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type KOReaderHandler struct { @@ -153,7 +153,7 @@ type KOReaderLibraryBook struct { LastModified string `json:"last_modified"` } -func (h *KOReaderHandler) SyncProgress(c echo.Context) error { +func (h *KOReaderHandler) SyncProgress(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes @@ -223,7 +223,7 @@ func (h *KOReaderHandler) SyncProgress(c echo.Context) error { }) } -func (h *KOReaderHandler) resolveBookToMediaItem(c echo.Context, deviceID pgtype.UUID, userID pgtype.UUID, book KOReaderBookProgress) (pgtype.UUID, float64) { +func (h *KOReaderHandler) resolveBookToMediaItem(c *echo.Context, deviceID pgtype.UUID, userID pgtype.UUID, book KOReaderBookProgress) (pgtype.UUID, float64) { ctx := c.Request().Context() // Priority 1: UUID provided (highest confidence - 1.0) @@ -307,7 +307,7 @@ func (h *KOReaderHandler) resolveBookToMediaItem(c echo.Context, deviceID pgtype return pgtype.UUID{}, 0.0 } -func (h *KOReaderHandler) createDeviceFileAlias(c echo.Context, deviceID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) { +func (h *KOReaderHandler) createDeviceFileAlias(c *echo.Context, deviceID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) { ctx := c.Request().Context() if book.FilePath == "" { @@ -341,7 +341,7 @@ func (h *KOReaderHandler) createDeviceFileAlias(c echo.Context, deviceID pgtype. } } -func (h *KOReaderHandler) handleCheckpointSync(c echo.Context, device database.Devices, userID pgtype.UUID, req KOReaderProgressRequest) error { +func (h *KOReaderHandler) handleCheckpointSync(c *echo.Context, device database.Devices, userID pgtype.UUID, req KOReaderProgressRequest) error { booksEnqueued := 0 for _, book := range req.Books { @@ -371,7 +371,7 @@ func (h *KOReaderHandler) handleCheckpointSync(c echo.Context, device database.D }) } -func (h *KOReaderHandler) enqueueProgressForBook(c echo.Context, deviceID pgtype.UUID, userID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) error { +func (h *KOReaderHandler) enqueueProgressForBook(c *echo.Context, deviceID pgtype.UUID, userID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) error { if h.queue == nil { return fmt.Errorf("sync queue not available") } @@ -393,7 +393,7 @@ func (h *KOReaderHandler) enqueueProgressForBook(c echo.Context, deviceID pgtype return h.queue.EnqueueProgress(update) } -func (h *KOReaderHandler) updateProgressForBook(c echo.Context, userID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) error { +func (h *KOReaderHandler) updateProgressForBook(c *echo.Context, userID pgtype.UUID, mediaItemID pgtype.UUID, book KOReaderBookProgress) error { ctx := c.Request().Context() existingProgress, err := h.db.GetReadingProgress(ctx, database.GetReadingProgressParams{ @@ -557,7 +557,7 @@ func (h *KOReaderHandler) updateProgressForBook(c echo.Context, userID pgtype.UU return err } -func (h *KOReaderHandler) GetMetadata(c echo.Context) error { +func (h *KOReaderHandler) GetMetadata(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes @@ -667,7 +667,7 @@ func (h *KOReaderHandler) GetMetadata(c echo.Context) error { return c.JSON(http.StatusOK, metadata) } -func (h *KOReaderHandler) GetLibrary(c echo.Context) error { +func (h *KOReaderHandler) GetLibrary(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes @@ -731,7 +731,7 @@ func (h *KOReaderHandler) GetLibrary(c echo.Context) error { }) } -func (h *KOReaderHandler) SyncBookmarks(c echo.Context) error { +func (h *KOReaderHandler) SyncBookmarks(c *echo.Context) error { device := c.Get("device").(database.Devices) userID := device.UserID.Bytes diff --git a/internal/handlers/library.go b/internal/handlers/library.go index 0cfc895..60a5473 100644 --- a/internal/handlers/library.go +++ b/internal/handlers/library.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type LibraryHandler struct { @@ -48,7 +48,7 @@ type SetLibraryVisibilityRequest struct { } // GetLibraryTypes retrieves all available library types -func (h *LibraryHandler) GetLibraryTypes(c echo.Context) error { +func (h *LibraryHandler) GetLibraryTypes(c *echo.Context) error { types, err := h.libraryService.GetLibraryTypes(c.Request().Context()) if err != nil { return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) @@ -57,7 +57,7 @@ func (h *LibraryHandler) GetLibraryTypes(c echo.Context) error { } // CreateLibrary creates a new library -func (h *LibraryHandler) CreateLibrary(c echo.Context) error { +func (h *LibraryHandler) CreateLibrary(c *echo.Context) error { user := c.Get("user").(database.Users) userUUID := user.ID.Bytes @@ -84,7 +84,7 @@ func (h *LibraryHandler) CreateLibrary(c echo.Context) error { } // GetLibrary retrieves a specific library -func (h *LibraryHandler) GetLibrary(c echo.Context) error { +func (h *LibraryHandler) GetLibrary(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -99,7 +99,7 @@ func (h *LibraryHandler) GetLibrary(c echo.Context) error { } // ListLibraries retrieves all libraries (admin only) -func (h *LibraryHandler) ListLibraries(c echo.Context) error { +func (h *LibraryHandler) ListLibraries(c *echo.Context) error { libraries, err := h.libraryService.ListLibraries(c.Request().Context()) if err != nil { return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) @@ -109,7 +109,7 @@ func (h *LibraryHandler) ListLibraries(c echo.Context) error { } // GetUserVisibleLibraries retrieves libraries visible to the current user -func (h *LibraryHandler) GetUserVisibleLibraries(c echo.Context) error { +func (h *LibraryHandler) GetUserVisibleLibraries(c *echo.Context) error { user := MustGetAuthenticatedUser(c) libraries, err := h.libraryService.GetUserVisibleLibraries(c.Request().Context(), user.ID) @@ -121,7 +121,7 @@ func (h *LibraryHandler) GetUserVisibleLibraries(c echo.Context) error { } // UpdateLibrary updates an existing library -func (h *LibraryHandler) UpdateLibrary(c echo.Context) error { +func (h *LibraryHandler) UpdateLibrary(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -149,7 +149,7 @@ func (h *LibraryHandler) UpdateLibrary(c echo.Context) error { } // DeleteLibrary deletes a library -func (h *LibraryHandler) DeleteLibrary(c echo.Context) error { +func (h *LibraryHandler) DeleteLibrary(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -164,7 +164,7 @@ func (h *LibraryHandler) DeleteLibrary(c echo.Context) error { } // AddLibraryFolder adds a folder to a library -func (h *LibraryHandler) AddLibraryFolder(c echo.Context) error { +func (h *LibraryHandler) AddLibraryFolder(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -213,7 +213,7 @@ func (h *LibraryHandler) AddLibraryFolder(c echo.Context) error { } // GetLibraryFolders retrieves all folders for a library -func (h *LibraryHandler) GetLibraryFolders(c echo.Context) error { +func (h *LibraryHandler) GetLibraryFolders(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -228,7 +228,7 @@ func (h *LibraryHandler) GetLibraryFolders(c echo.Context) error { } // DeleteLibraryFolder removes a folder from a library -func (h *LibraryHandler) DeleteLibraryFolder(c echo.Context) error { +func (h *LibraryHandler) DeleteLibraryFolder(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) @@ -251,7 +251,7 @@ func (h *LibraryHandler) DeleteLibraryFolder(c echo.Context) error { } // BrowseDirectories returns directory listings for folder browser UI -func (h *LibraryHandler) BrowseDirectories(c echo.Context) error { +func (h *LibraryHandler) BrowseDirectories(c *echo.Context) error { path := c.QueryParam("path") if path == "" { path = "/" // Start from root @@ -270,7 +270,7 @@ func (h *LibraryHandler) BrowseDirectories(c echo.Context) error { } // SetLibraryVisibility sets library visibility for a user -func (h *LibraryHandler) SetLibraryVisibility(c echo.Context) error { +func (h *LibraryHandler) SetLibraryVisibility(c *echo.Context) error { user := c.Get("user").(database.Users) var req SetLibraryVisibilityRequest @@ -300,7 +300,7 @@ func (h *LibraryHandler) SetLibraryVisibility(c echo.Context) error { } // GetLibraryStats retrieves statistics for a library -func (h *LibraryHandler) GetLibraryStats(c echo.Context) error { +func (h *LibraryHandler) GetLibraryStats(c *echo.Context) error { libraryID, err := parseUUID(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid library id"}) diff --git a/internal/handlers/matching.go b/internal/handlers/matching.go index 962ab3c..954d2ae 100644 --- a/internal/handlers/matching.go +++ b/internal/handlers/matching.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // MatchingHandler handles book matching, linking, and file alias operations @@ -33,7 +33,7 @@ func (mh *MatchingHandler) getMatchingService() *services.BookMatchingService { } // QueryBooks handles POST /api/sync/books/query -func (mh *MatchingHandler) QueryBooks(c echo.Context) error { +func (mh *MatchingHandler) QueryBooks(c *echo.Context) error { matchingService := mh.getMatchingService() var req services.BookQueryRequest @@ -54,7 +54,7 @@ func (mh *MatchingHandler) QueryBooks(c echo.Context) error { } // LinkBook handles POST /api/devices/:deviceId/sync/link-book -func (mh *MatchingHandler) LinkBook(c echo.Context) error { +func (mh *MatchingHandler) LinkBook(c *echo.Context) error { matchingService := mh.getMatchingService() var req services.LinkBookRequest @@ -93,7 +93,7 @@ func (mh *MatchingHandler) LinkBook(c echo.Context) error { } // GetUnlinkedBooks handles GET /api/devices/:deviceId/sync/unlinked-books -func (mh *MatchingHandler) GetUnlinkedBooks(c echo.Context) error { +func (mh *MatchingHandler) GetUnlinkedBooks(c *echo.Context) error { matchingService := mh.getMatchingService() deviceIDStr := c.Param("deviceId") @@ -118,7 +118,7 @@ func (mh *MatchingHandler) GetUnlinkedBooks(c echo.Context) error { } // GetDeviceFileAliases handles GET /api/devices/:id/file-aliases -func (mh *MatchingHandler) GetDeviceFileAliases(c echo.Context) error { +func (mh *MatchingHandler) GetDeviceFileAliases(c *echo.Context) error { deviceIDStr := c.Param("id") deviceID, err := uuid.Parse(deviceIDStr) if err != nil { @@ -163,7 +163,7 @@ func (mh *MatchingHandler) GetDeviceFileAliases(c echo.Context) error { } // CreateDeviceFileAlias handles POST /api/devices/:id/file-aliases -func (mh *MatchingHandler) CreateDeviceFileAlias(c echo.Context) error { +func (mh *MatchingHandler) CreateDeviceFileAlias(c *echo.Context) error { deviceIDStr := c.Param("id") deviceID, err := uuid.Parse(deviceIDStr) if err != nil { @@ -218,7 +218,7 @@ func (mh *MatchingHandler) CreateDeviceFileAlias(c echo.Context) error { } // UpdateDeviceFileAlias handles PUT /api/devices/:id/file-aliases/:aliasId -func (mh *MatchingHandler) UpdateDeviceFileAlias(c echo.Context) error { +func (mh *MatchingHandler) UpdateDeviceFileAlias(c *echo.Context) error { aliasIDStr := c.Param("aliasId") aliasID, err := uuid.Parse(aliasIDStr) if err != nil { @@ -284,7 +284,7 @@ func (mh *MatchingHandler) UpdateDeviceFileAlias(c echo.Context) error { } // DeleteDeviceFileAlias handles DELETE /api/devices/:id/file-aliases/:aliasId -func (mh *MatchingHandler) DeleteDeviceFileAlias(c echo.Context) error { +func (mh *MatchingHandler) DeleteDeviceFileAlias(c *echo.Context) error { aliasIDStr := c.Param("aliasId") aliasID, err := uuid.Parse(aliasIDStr) if err != nil { @@ -306,7 +306,7 @@ func (mh *MatchingHandler) DeleteDeviceFileAlias(c echo.Context) error { } // GetBookMatches handles GET /api/books/match -func (mh *MatchingHandler) GetBookMatches(c echo.Context) error { +func (mh *MatchingHandler) GetBookMatches(c *echo.Context) error { matchingService := mh.getMatchingService() identifiers := c.QueryParams()["identifier"] @@ -345,7 +345,7 @@ func (mh *MatchingHandler) GetBookMatches(c echo.Context) error { } // BulkLinkBooks handles POST /api/sync/bulk-link-books -func (mh *MatchingHandler) BulkLinkBooks(c echo.Context) error { +func (mh *MatchingHandler) BulkLinkBooks(c *echo.Context) error { ctx := c.Request().Context() var req BulkLinkBooksRequest @@ -423,7 +423,7 @@ func (mh *MatchingHandler) BulkLinkBooks(c echo.Context) error { } // AutoLinkBooks handles POST /api/sync/auto-link-books -func (mh *MatchingHandler) AutoLinkBooks(c echo.Context) error { +func (mh *MatchingHandler) AutoLinkBooks(c *echo.Context) error { ctx := c.Request().Context() matchingService := mh.getMatchingService() @@ -499,7 +499,7 @@ func (mh *MatchingHandler) AutoLinkBooks(c echo.Context) error { } // GetUnlinkedBookSuggestions handles GET /api/sync/unlinked-books/:id/suggestions -func (mh *MatchingHandler) GetUnlinkedBookSuggestions(c echo.Context) error { +func (mh *MatchingHandler) GetUnlinkedBookSuggestions(c *echo.Context) error { ctx := c.Request().Context() matchingService := mh.getMatchingService() diff --git a/internal/handlers/media.go b/internal/handlers/media.go index 1bddebc..0067f39 100644 --- a/internal/handlers/media.go +++ b/internal/handlers/media.go @@ -18,7 +18,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // CreateMediaItemRequest represents the request for creating a media item @@ -104,7 +104,7 @@ func NewMediaHandler(db *database.Queries, libraryService *services.LibraryServi return mh } -func (h *MediaHandler) DownloadBook(c echo.Context) error { +func (h *MediaHandler) DownloadBook(c *echo.Context) error { bookUUID, err := uuid.Parse(c.Param("uuid")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid book UUID"}) @@ -159,7 +159,7 @@ type AddToShelfRequest struct { ShelfPosition int `json:"shelf_position"` } -func (h *MediaHandler) AddToShelf(c echo.Context) error { +func (h *MediaHandler) AddToShelf(c *echo.Context) error { deviceUUID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device ID"}) @@ -204,7 +204,7 @@ func (h *MediaHandler) AddToShelf(c echo.Context) error { }) } -func (h *MediaHandler) GetShelf(c echo.Context) error { +func (h *MediaHandler) GetShelf(c *echo.Context) error { deviceUUID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device ID"}) @@ -287,7 +287,7 @@ func (h *MediaHandler) GetShelf(c echo.Context) error { }) } -func (h *MediaHandler) RemoveFromShelf(c echo.Context) error { +func (h *MediaHandler) RemoveFromShelf(c *echo.Context) error { deviceUUID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device ID"}) @@ -316,7 +316,7 @@ func (h *MediaHandler) RemoveFromShelf(c echo.Context) error { }) } -func (h *MediaHandler) ClearShelf(c echo.Context) error { +func (h *MediaHandler) ClearShelf(c *echo.Context) error { deviceUUID, err := uuid.Parse(c.Param("id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid device ID"}) @@ -351,7 +351,7 @@ func (h *MediaHandler) ClearShelf(c echo.Context) error { // POST /api/media-items/bulk-delete // Bulk delete media items -func (h *MediaHandler) HandleBulkDelete(c echo.Context) error { +func (h *MediaHandler) HandleBulkDelete(c *echo.Context) error { var req struct { MediaItemIDs []string `json:"media_item_ids" validate:"required"` } @@ -425,7 +425,7 @@ func (h *MediaHandler) HandleBulkDelete(c echo.Context) error { // POST /api/media-items/bulk-update // Bulk update media item metadata -func (h *MediaHandler) HandleBulkUpdate(c echo.Context) error { +func (h *MediaHandler) HandleBulkUpdate(c *echo.Context) error { var req struct { MediaItemUpdates []struct { MediaItemID string `json:"media_item_id" validate:"required"` @@ -553,7 +553,7 @@ func (h *MediaHandler) HandleBulkUpdate(c echo.Context) error { } // ListMediaItems handles GET /api/media-items -func (mh *MediaHandler) ListMediaItems(c echo.Context) error { +func (mh *MediaHandler) ListMediaItems(c *echo.Context) error { libraryID := c.QueryParam("library_id") sort := c.QueryParam("sort") limit, _ := strconv.Atoi(c.QueryParam("limit")) @@ -658,7 +658,7 @@ func (mh *MediaHandler) ListMediaItems(c echo.Context) error { } // GetMediaItem handles GET /api/media-items/:id -func (mh *MediaHandler) GetMediaItem(c echo.Context) error { +func (mh *MediaHandler) GetMediaItem(c *echo.Context) error { mediaID := c.Param("id") mediaUUID, err := uuid.Parse(mediaID) if err != nil { @@ -703,7 +703,7 @@ func (mh *MediaHandler) GetMediaItem(c echo.Context) error { } // ListMediaItemsFiltered handles GET /api/media-items/filtered -func (mh *MediaHandler) ListMediaItemsFiltered(c echo.Context) error { +func (mh *MediaHandler) ListMediaItemsFiltered(c *echo.Context) error { userID := c.Get("user_id").(string) libraryID := c.QueryParam("library_id") sort := c.QueryParam("sort") @@ -766,7 +766,7 @@ func (mh *MediaHandler) ListMediaItemsFiltered(c echo.Context) error { } // CreateMediaRating handles POST /api/media-items/:id/rating -func (mh *MediaHandler) CreateMediaRating(c echo.Context) error { +func (mh *MediaHandler) CreateMediaRating(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -802,7 +802,7 @@ func (mh *MediaHandler) CreateMediaRating(c echo.Context) error { } // GetMediaRating handles GET /api/media-items/:id/rating -func (mh *MediaHandler) GetMediaRating(c echo.Context) error { +func (mh *MediaHandler) GetMediaRating(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -830,12 +830,12 @@ func (mh *MediaHandler) GetMediaRating(c echo.Context) error { } // UpdateMediaRating handles PUT /api/media-items/:id/rating -func (mh *MediaHandler) UpdateMediaRating(c echo.Context) error { +func (mh *MediaHandler) UpdateMediaRating(c *echo.Context) error { return mh.CreateMediaRating(c) } // DeleteMediaRating handles DELETE /api/media-items/:id/rating -func (mh *MediaHandler) DeleteMediaRating(c echo.Context) error { +func (mh *MediaHandler) DeleteMediaRating(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -860,7 +860,7 @@ func (mh *MediaHandler) DeleteMediaRating(c echo.Context) error { } // GetMediaReadingProgress handles GET /api/media-items/:id/progress -func (mh *MediaHandler) GetMediaReadingProgress(c echo.Context) error { +func (mh *MediaHandler) GetMediaReadingProgress(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -891,7 +891,7 @@ func (mh *MediaHandler) GetMediaReadingProgress(c echo.Context) error { } // UpdateMediaReadingProgress handles PUT /api/media-items/:id/progress -func (mh *MediaHandler) UpdateMediaReadingProgress(c echo.Context) error { +func (mh *MediaHandler) UpdateMediaReadingProgress(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -929,7 +929,7 @@ func (mh *MediaHandler) UpdateMediaReadingProgress(c echo.Context) error { } // DeleteMediaReadingProgress handles DELETE /api/media-items/:id/progress -func (mh *MediaHandler) DeleteMediaReadingProgress(c echo.Context) error { +func (mh *MediaHandler) DeleteMediaReadingProgress(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -954,7 +954,7 @@ func (mh *MediaHandler) DeleteMediaReadingProgress(c echo.Context) error { } // CreateMediaItem handles POST /api/media-items (admin only) -func (mh *MediaHandler) CreateMediaItem(c echo.Context) error { +func (mh *MediaHandler) CreateMediaItem(c *echo.Context) error { user := MustGetAuthenticatedUser(c) if user.Role != "admin" { @@ -1045,7 +1045,7 @@ func (mh *MediaHandler) CreateMediaItem(c echo.Context) error { } // UpdateMediaItem handles PUT /api/media-items/:id (admin only) -func (mh *MediaHandler) UpdateMediaItem(c echo.Context) error { +func (mh *MediaHandler) UpdateMediaItem(c *echo.Context) error { user := MustGetAuthenticatedUser(c) if user.Role != "admin" { @@ -1114,7 +1114,7 @@ func (mh *MediaHandler) UpdateMediaItem(c echo.Context) error { } // DeleteMediaItem handles DELETE /api/media-items/:id (admin only) -func (mh *MediaHandler) DeleteMediaItem(c echo.Context) error { +func (mh *MediaHandler) DeleteMediaItem(c *echo.Context) error { user := MustGetAuthenticatedUser(c) if user.Role != "admin" { @@ -1136,7 +1136,7 @@ func (mh *MediaHandler) DeleteMediaItem(c echo.Context) error { } // GetMediaNotes handles GET /api/media-items/:id/notes -func (mh *MediaHandler) GetMediaNotes(c echo.Context) error { +func (mh *MediaHandler) GetMediaNotes(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -1161,7 +1161,7 @@ func (mh *MediaHandler) GetMediaNotes(c echo.Context) error { } // CreateMediaNote handles POST /api/media-items/:id/notes -func (mh *MediaHandler) CreateMediaNote(c echo.Context) error { +func (mh *MediaHandler) CreateMediaNote(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -1196,7 +1196,7 @@ func (mh *MediaHandler) CreateMediaNote(c echo.Context) error { } // GetMediaNote handles GET /api/media-items/:id/notes/:noteId -func (mh *MediaHandler) GetMediaNote(c echo.Context) error { +func (mh *MediaHandler) GetMediaNote(c *echo.Context) error { noteID := c.Param("noteId") noteUUID, err := uuid.Parse(noteID) if err != nil { @@ -1215,7 +1215,7 @@ func (mh *MediaHandler) GetMediaNote(c echo.Context) error { } // UpdateMediaNote handles PUT /api/media-items/:id/notes/:noteId -func (mh *MediaHandler) UpdateMediaNote(c echo.Context) error { +func (mh *MediaHandler) UpdateMediaNote(c *echo.Context) error { noteID := c.Param("noteId") noteUUID, err := uuid.Parse(noteID) if err != nil { @@ -1243,7 +1243,7 @@ func (mh *MediaHandler) UpdateMediaNote(c echo.Context) error { } // DeleteMediaNote handles DELETE /api/media-items/:id/notes/:noteId -func (mh *MediaHandler) DeleteMediaNote(c echo.Context) error { +func (mh *MediaHandler) DeleteMediaNote(c *echo.Context) error { noteID := c.Param("noteId") noteUUID, err := uuid.Parse(noteID) if err != nil { @@ -1259,7 +1259,7 @@ func (mh *MediaHandler) DeleteMediaNote(c echo.Context) error { } // GetMediaHighlights handles GET /api/media-items/:id/highlights -func (mh *MediaHandler) GetMediaHighlights(c echo.Context) error { +func (mh *MediaHandler) GetMediaHighlights(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -1284,7 +1284,7 @@ func (mh *MediaHandler) GetMediaHighlights(c echo.Context) error { } // CreateMediaHighlight handles POST /api/media-items/:id/highlights -func (mh *MediaHandler) CreateMediaHighlight(c echo.Context) error { +func (mh *MediaHandler) CreateMediaHighlight(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -1336,7 +1336,7 @@ func (mh *MediaHandler) CreateMediaHighlight(c echo.Context) error { } // GetMediaHighlight handles GET /api/media-items/:id/highlights/:highlightId -func (mh *MediaHandler) GetMediaHighlight(c echo.Context) error { +func (mh *MediaHandler) GetMediaHighlight(c *echo.Context) error { highlightID := c.Param("highlightId") highlightUUID, err := uuid.Parse(highlightID) if err != nil { @@ -1355,7 +1355,7 @@ func (mh *MediaHandler) GetMediaHighlight(c echo.Context) error { } // UpdateMediaHighlight handles PUT /api/media-items/:id/highlights/:highlightId -func (mh *MediaHandler) UpdateMediaHighlight(c echo.Context) error { +func (mh *MediaHandler) UpdateMediaHighlight(c *echo.Context) error { highlightID := c.Param("highlightId") highlightUUID, err := uuid.Parse(highlightID) if err != nil { @@ -1400,7 +1400,7 @@ func (mh *MediaHandler) UpdateMediaHighlight(c echo.Context) error { } // DeleteMediaHighlight handles DELETE /api/media-items/:id/highlights/:highlightId -func (mh *MediaHandler) DeleteMediaHighlight(c echo.Context) error { +func (mh *MediaHandler) DeleteMediaHighlight(c *echo.Context) error { highlightID := c.Param("highlightId") highlightUUID, err := uuid.Parse(highlightID) if err != nil { @@ -1416,7 +1416,7 @@ func (mh *MediaHandler) DeleteMediaHighlight(c echo.Context) error { } // SearchMediaItems handles GET /api/media-items/search -func (mh *MediaHandler) SearchMediaItems(c echo.Context) error { +func (mh *MediaHandler) SearchMediaItems(c *echo.Context) error { query := c.QueryParam("q") // Safely get user from context @@ -1510,7 +1510,7 @@ func (mh *MediaHandler) getFullFilePath(ctx context.Context, libraryID pgtype.UU // ServeFile serves files (covers or books) via /uploads/library-{id}/path // Requires JWT authentication -func (mh *MediaHandler) ServeFile(c echo.Context) error { +func (mh *MediaHandler) ServeFile(c *echo.Context) error { // URL format: /uploads/library-{libraryID}/{relativePath} // Get library ID directly from route parameter libraryIDStr := c.Param("id") diff --git a/internal/handlers/opds.go b/internal/handlers/opds.go index 84b0764..654643c 100644 --- a/internal/handlers/opds.go +++ b/internal/handlers/opds.go @@ -17,7 +17,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type OPDSHandler struct { @@ -39,7 +39,7 @@ func NewOPDSHandler(db *database.Queries, libraryService *services.LibraryServic } // Helper function to get base URLs from system config -func (h *OPDSHandler) getBaseURLs(c echo.Context) (string, string, error) { +func (h *OPDSHandler) getBaseURLs(c *echo.Context) (string, string, error) { baseURL, err := h.db.GetSystemConfig(c.Request().Context(), "base_url") if err != nil { return "", "", fmt.Errorf("failed to get base_url from config: %w", err) @@ -54,7 +54,7 @@ func (h *OPDSHandler) getBaseURLs(c echo.Context) (string, string, error) { } // GetDeviceCatalog returns the OPDS catalog feed for a device -func (h *OPDSHandler) GetDeviceCatalog(c echo.Context) error { +func (h *OPDSHandler) GetDeviceCatalog(c *echo.Context) error { deviceID := c.Param("deviceId") page := c.QueryParam("page") @@ -218,7 +218,7 @@ func (h *OPDSHandler) GetDeviceCatalog(c echo.Context) error { } // SearchDeviceCatalog searches the OPDS catalog for a device -func (h *OPDSHandler) SearchDeviceCatalog(c echo.Context) error { +func (h *OPDSHandler) SearchDeviceCatalog(c *echo.Context) error { deviceID := c.Param("deviceId") query := c.QueryParam("q") @@ -335,7 +335,7 @@ func (h *OPDSHandler) SearchDeviceCatalog(c echo.Context) error { } // DownloadBook downloads a book with optional format conversion -func (h *OPDSHandler) DownloadBook(c echo.Context) error { +func (h *OPDSHandler) DownloadBook(c *echo.Context) error { deviceID := c.Param("deviceId") bookID := c.Param("bookId") format := c.QueryParam("format") // epub, kepub, pdf, cbz @@ -488,7 +488,7 @@ func (h *OPDSHandler) DownloadBook(c echo.Context) error { } // GetCoverImage serves a book's cover image -func (h *OPDSHandler) GetCoverImage(c echo.Context) error { +func (h *OPDSHandler) GetCoverImage(c *echo.Context) error { deviceID := c.Param("deviceId") bookID := c.Param("bookId") @@ -578,7 +578,7 @@ func (h *OPDSHandler) GetCoverImage(c echo.Context) error { } // GetDeviceNavigation returns the OPDS navigation feed for a device -func (h *OPDSHandler) GetDeviceNavigation(c echo.Context) error { +func (h *OPDSHandler) GetDeviceNavigation(c *echo.Context) error { deviceID := c.Param("deviceId") // Get base URLs @@ -629,7 +629,7 @@ func (h *OPDSHandler) GetDeviceNavigation(c echo.Context) error { } // ListFormats lists available formats for a book -func (h *OPDSHandler) ListFormats(c echo.Context) error { +func (h *OPDSHandler) ListFormats(c *echo.Context) error { deviceID := c.Param("deviceId") bookID := c.Param("bookId") @@ -755,7 +755,7 @@ func (h *OPDSHandler) ListFormats(c echo.Context) error { } // RegisterOPDS registers a device for OPDS access -func (h *OPDSHandler) RegisterOPDS(c echo.Context) error { +func (h *OPDSHandler) RegisterOPDS(c *echo.Context) error { deviceID := c.Param("deviceId") // Parse device ID diff --git a/internal/handlers/progress.go b/internal/handlers/progress.go index 350c9d2..612f711 100644 --- a/internal/handlers/progress.go +++ b/internal/handlers/progress.go @@ -12,7 +12,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) // getDeviceIcon returns an emoji icon for device type @@ -30,7 +30,7 @@ func getDeviceIcon(deviceType string) string { } // GetUniversalProgress retrieves progress with all location references -func (h *Handler) GetUniversalProgress(c echo.Context) error { +func (h *Handler) GetUniversalProgress(c *echo.Context) error { user := MustGetAuthenticatedUser(c) mediaItemID, err := uuid.Parse(c.Param("id")) @@ -96,7 +96,7 @@ func (h *Handler) GetUniversalProgress(c echo.Context) error { } // UpdateUniversalProgress updates progress with automatic conversion -func (h *Handler) UpdateUniversalProgress(c echo.Context) error { +func (h *Handler) UpdateUniversalProgress(c *echo.Context) error { user := MustGetAuthenticatedUser(c) mediaItemID, err := uuid.Parse(c.Param("id")) @@ -212,7 +212,7 @@ func (h *Handler) UpdateUniversalProgress(c echo.Context) error { } // GetProgressHistory retrieves reading session history -func (h *Handler) GetProgressHistory(c echo.Context) error { +func (h *Handler) GetProgressHistory(c *echo.Context) error { user := MustGetAuthenticatedUser(c) mediaItemID, err := uuid.Parse(c.Param("id")) @@ -263,7 +263,7 @@ type ProgressWithMedia struct { } // GetAllProgress retrieves all progress for a user with sync source info -func (h *Handler) GetAllProgress(c echo.Context) error { +func (h *Handler) GetAllProgress(c *echo.Context) error { user := MustGetAuthenticatedUser(c) progressList := []ProgressWithMedia{} @@ -330,7 +330,7 @@ func (h *Handler) GetAllProgress(c echo.Context) error { }) } -func (h *Handler) GetAllProgressData(c echo.Context) ([]ProgressWithMedia, error) { +func (h *Handler) GetAllProgressData(c *echo.Context) ([]ProgressWithMedia, error) { user := MustGetAuthenticatedUser(c) progressList := []ProgressWithMedia{} diff --git a/internal/handlers/queue.go b/internal/handlers/queue.go index 5f121f4..ee5a137 100644 --- a/internal/handlers/queue.go +++ b/internal/handlers/queue.go @@ -8,7 +8,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type QueueHandler struct { @@ -50,7 +50,7 @@ type QueueItemResponse struct { ProcessedAt *string `json:"processed_at,omitempty"` } -func (h *QueueHandler) GetDeviceQueueStats(c echo.Context) error { +func (h *QueueHandler) GetDeviceQueueStats(c *echo.Context) error { user := MustGetAuthenticatedUser(c) deviceID, err := uuid.Parse(c.Param("device_id")) @@ -81,7 +81,7 @@ func (h *QueueHandler) GetDeviceQueueStats(c echo.Context) error { }) } -func (h *QueueHandler) ListDeviceQueueItems(c echo.Context) error { +func (h *QueueHandler) ListDeviceQueueItems(c *echo.Context) error { user := MustGetAuthenticatedUser(c) deviceID, err := uuid.Parse(c.Param("device_id")) @@ -146,7 +146,7 @@ func (h *QueueHandler) ListDeviceQueueItems(c echo.Context) error { }) } -func (h *QueueHandler) GetQueueData(c echo.Context) ([]QueueItemResponse, error) { +func (h *QueueHandler) GetQueueData(c *echo.Context) ([]QueueItemResponse, error) { user := MustGetAuthenticatedUser(c) if user.Role != "admin" { @@ -196,7 +196,7 @@ func (h *QueueHandler) GetQueueData(c echo.Context) ([]QueueItemResponse, error) return response, nil } -func (h *QueueHandler) ListAllQueueItems(c echo.Context) error { +func (h *QueueHandler) ListAllQueueItems(c *echo.Context) error { response, err := h.GetQueueData(c) if err != nil { return err @@ -208,7 +208,7 @@ func (h *QueueHandler) ListAllQueueItems(c echo.Context) error { }) } -func (h *QueueHandler) RetryQueueItem(c echo.Context) error { +func (h *QueueHandler) RetryQueueItem(c *echo.Context) error { user := MustGetAuthenticatedUser(c) itemID, err := uuid.Parse(c.Param("item_id")) @@ -249,7 +249,7 @@ func (h *QueueHandler) RetryQueueItem(c echo.Context) error { }) } -func (h *QueueHandler) DeleteQueueItem(c echo.Context) error { +func (h *QueueHandler) DeleteQueueItem(c *echo.Context) error { user := MustGetAuthenticatedUser(c) itemID, err := uuid.Parse(c.Param("item_id")) @@ -279,7 +279,7 @@ func (h *QueueHandler) DeleteQueueItem(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h *QueueHandler) ClearDeviceQueue(c echo.Context) error { +func (h *QueueHandler) ClearDeviceQueue(c *echo.Context) error { user := MustGetAuthenticatedUser(c) deviceID, err := uuid.Parse(c.Param("device_id")) diff --git a/internal/handlers/refresh_token.go b/internal/handlers/refresh_token.go index 4f44b5e..45db111 100644 --- a/internal/handlers/refresh_token.go +++ b/internal/handlers/refresh_token.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) const ( @@ -36,7 +36,7 @@ type RefreshTokenResponse struct { } // RefreshAccessToken handles POST /api/auth/refresh -func (h *AuthHandler) RefreshAccessToken(c echo.Context) error { +func (h *AuthHandler) RefreshAccessToken(c *echo.Context) error { var req RefreshTokenRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"}) @@ -76,7 +76,7 @@ func (h *AuthHandler) RefreshAccessToken(c echo.Context) error { } // Logout handles POST /api/auth/logout -func (h *AuthHandler) Logout(c echo.Context) error { +func (h *AuthHandler) Logout(c *echo.Context) error { var req RefreshTokenRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusOK, map[string]string{"message": "logged out successfully"}) diff --git a/internal/handlers/scanner.go b/internal/handlers/scanner.go index d2c1430..d55669e 100644 --- a/internal/handlers/scanner.go +++ b/internal/handlers/scanner.go @@ -8,7 +8,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) const ( @@ -30,7 +30,7 @@ type ScanLibraryRequest struct { } // ScanLibrary handles POST /api/scanner/scan (now runs in background) -func (h *Handler) ScanLibrary(c echo.Context) error { +func (h *Handler) ScanLibrary(c *echo.Context) error { var req ScanLibraryRequest // Check if scan_request is set in context (from library scan route) @@ -112,7 +112,7 @@ func (h *Handler) ScanLibrary(c echo.Context) error { } // StartScanner handles POST /api/scanner/start -func (h *Handler) StartScanner(c echo.Context) error { +func (h *Handler) StartScanner(c *echo.Context) error { h.mu.Lock() defer h.mu.Unlock() @@ -146,7 +146,7 @@ func (h *Handler) StartScanner(c echo.Context) error { } // StopScanner handles POST /api/scanner/stop -func (h *Handler) StopScanner(c echo.Context) error { +func (h *Handler) StopScanner(c *echo.Context) error { h.mu.Lock() defer h.mu.Unlock() @@ -157,7 +157,7 @@ func (h *Handler) StopScanner(c echo.Context) error { } // GetScanStatus handles GET /api/scanner/status/:jobId -func (h *Handler) GetScanStatus(c echo.Context) error { +func (h *Handler) GetScanStatus(c *echo.Context) error { jobID := c.Param("jobId") result, exists := h.worker.GetJobStatus(jobID) @@ -238,7 +238,7 @@ func (h *Handler) StopWatchModeForLibrary(libraryID pgtype.UUID) error { } // StartWatchMode handles POST /api/scanner/watch/start -func (h *Handler) StartWatchMode(c echo.Context) error { +func (h *Handler) StartWatchMode(c *echo.Context) error { userID := c.Get("user_id").(string) userUUID, err := uuid.Parse(userID) if err != nil { @@ -272,7 +272,7 @@ func (h *Handler) StartWatchMode(c echo.Context) error { } // StopWatchMode handles POST /api/scanner/watch/stop -func (h *Handler) StopWatchMode(c echo.Context) error { +func (h *Handler) StopWatchMode(c *echo.Context) error { var req struct { LibraryID string `json:"library_id"` } @@ -300,7 +300,7 @@ func (h *Handler) StopWatchMode(c echo.Context) error { } // GetWatchModeStatus handles GET /api/scanner/watch/status -func (h *Handler) GetWatchModeStatus(c echo.Context) error { +func (h *Handler) GetWatchModeStatus(c *echo.Context) error { h.mu.Lock() defer h.mu.Unlock() diff --git a/internal/handlers/sidecar.go b/internal/handlers/sidecar.go index 5cbb9cc..2bc89e5 100644 --- a/internal/handlers/sidecar.go +++ b/internal/handlers/sidecar.go @@ -9,7 +9,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type SidecarHandler struct { @@ -56,7 +56,7 @@ type SidecarCollection struct { // GetSidecarConfig generates and returns sidecar configuration for a device // GET /api/devices/:device_id/sidecar -func (h *SidecarHandler) GetSidecarConfig(c echo.Context) error { +func (h *SidecarHandler) GetSidecarConfig(c *echo.Context) error { deviceID, err := uuid.Parse(c.Param("device_id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{ @@ -189,7 +189,7 @@ func (h *SidecarHandler) GetSidecarConfig(c echo.Context) error { // DownloadSidecarConfig generates a .bookhoard.json file for device setup // GET /api/devices/:device_id/sidecar/download -func (h *SidecarHandler) DownloadSidecarConfig(c echo.Context) error { +func (h *SidecarHandler) DownloadSidecarConfig(c *echo.Context) error { deviceID, err := uuid.Parse(c.Param("device_id")) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{ @@ -333,7 +333,7 @@ func (h *SidecarHandler) DownloadSidecarConfig(c echo.Context) error { // GetSystemConfiguration returns system-wide configuration // GET /api/system/config -func (h *SidecarHandler) GetSystemConfiguration(c echo.Context) error { +func (h *SidecarHandler) GetSystemConfiguration(c *echo.Context) error { ctx := c.Request().Context() // Get all system config @@ -355,7 +355,7 @@ func (h *SidecarHandler) GetSystemConfiguration(c echo.Context) error { // UpdateSystemConfiguration updates system-wide configuration // PUT /api/system/config -func (h *SidecarHandler) UpdateSystemConfiguration(c echo.Context) error { +func (h *SidecarHandler) UpdateSystemConfiguration(c *echo.Context) error { user := c.Get("user") if user == nil { return c.JSON(http.StatusUnauthorized, map[string]string{ diff --git a/internal/handlers/sync.go b/internal/handlers/sync.go index 8618dcb..1e9fce7 100644 --- a/internal/handlers/sync.go +++ b/internal/handlers/sync.go @@ -7,7 +7,7 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type SyncHandler struct { @@ -52,7 +52,7 @@ type LinkBookResponse struct { // GetUnlinkedBooks returns all unlinked books for a user's devices // GET /api/sync/unlinked-books -func (h *SyncHandler) GetUnlinkedBooks(c echo.Context) error { +func (h *SyncHandler) GetUnlinkedBooks(c *echo.Context) error { // Get user from context (assuming auth middleware sets this) user := c.Get("user") if user == nil { @@ -105,7 +105,7 @@ func (h *SyncHandler) GetUnlinkedBooks(c echo.Context) error { // LinkBook manually links an unlinked book to a media item // POST /api/sync/link-book -func (h *SyncHandler) LinkBook(c echo.Context) error { +func (h *SyncHandler) LinkBook(c *echo.Context) error { var req LinkBookRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{ diff --git a/internal/handlers/system_settings.go b/internal/handlers/system_settings.go index 2eee33c..c7fad0b 100644 --- a/internal/handlers/system_settings.go +++ b/internal/handlers/system_settings.go @@ -6,7 +6,7 @@ import ( "strconv" "github.com/jackc/pgx/v5" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) type SystemSettingsHandler struct { @@ -30,7 +30,7 @@ type ScanSettingsResponse struct { Message string `json:"message,omitempty"` } -func (h *SystemSettingsHandler) UpdateScanSettings(c echo.Context) error { +func (h *SystemSettingsHandler) UpdateScanSettings(c *echo.Context) error { var req UpdateScanSettingsRequest if err := c.Bind(&req); err != nil { return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"}) @@ -71,7 +71,7 @@ func (h *SystemSettingsHandler) UpdateScanSettings(c echo.Context) error { }) } -func (h *SystemSettingsHandler) GetScanSettings(c echo.Context) error { +func (h *SystemSettingsHandler) GetScanSettings(c *echo.Context) error { scanFrequencySetting, err := h.db.GetSystemSetting(c.Request().Context(), "scan_poll_interval_seconds") if err != nil { if err == pgx.ErrNoRows { diff --git a/internal/handlers/websocket.go b/internal/handlers/websocket.go index b87f295..6899509 100644 --- a/internal/handlers/websocket.go +++ b/internal/handlers/websocket.go @@ -13,7 +13,7 @@ import ( "github.com/google/uuid" "github.com/gorilla/websocket" "github.com/jackc/pgx/v5/pgtype" - "github.com/labstack/echo/v4" + "github.com/labstack/echo/v5" ) var upgrader = websocket.Upgrader{ @@ -54,7 +54,7 @@ type ClientInfo struct { IsDevice bool } -func (h *WSHandler) HandleWebSocket(c echo.Context) error { +func (h *WSHandler) HandleWebSocket(c *echo.Context) error { token := c.QueryParam("token") if token == "" { return c.JSON(http.StatusUnauthorized, map[string]string{"error": "token required"})