A read-then-write race in processMediaFile allowed the same file to be imported twice: two concurrent scan jobs (startup scan, fsnotify dirty- directory scan, periodic backup poll, or a manual scan each run on separate worker goroutines with separate MediaScanner instances) could both SELECT 'not found' and both INSERT. There was no transaction, no row lock, no unique constraint on (library_id, file_path), and no ON CONFLICT clause, so nothing stopped the double insert. Observed in production as two identical 'Head First SQL' rows created in the same second (same sha256, size, path, library). Database enforcement: - schema.sql: add UNIQUE(library_id, file_path) constraint, guarded so re-runs don't error - schema.sql: add self-healing migration that runs on every startup - dedup_media_items_by_path() collapses existing path-duplicates and reparent_media_item_children() moves all child rows (progress, highlights, bookmarks, notes, collections, formats, aliases, kobo entitlements, etc.) onto a survivor before deleting losers, so the constraint applies cleanly on already-duplicated servers without losing reading history. Survivor picks the row with the most user data, ties broken by lowest id - CreateMediaItem: upsert via ON CONFLICT (library_id, file_path) DO UPDATE so concurrent inserts collapse to one row and return it - CreateMediaItemFormat: upsert via ON CONFLICT (media_item_id, format_type), closing the same race on format rows Application-level guards: - media_scanner processMediaFile: after computing the file hash, check GetMediaItemBySHA256AndLibrary (new query) and treat the file as existing when identical content is already in the library under a different path (content dedup, library-scoped so multi-library setups still work) Ops tooling: - scripts/dedup_media_items.sql: standalone idempotent maintenance script with a dry-run report (path + content duplicate groups, child row counts) and transactional cleanup, for servers that prefer to dedup manually before upgrading Verified against the live database: the duplicate pair was collapsed (reading_progress preserved on the survivor), schema.sql re-runs are a no-op, and the constraint is in place with 62 unique books remaining.
439 lines
30 KiB
Go
439 lines
30 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
type Querier interface {
|
|
// COLLECTION ITEMS QUERIES
|
|
// Add book to collection
|
|
AddBookToCollection(ctx context.Context, arg AddBookToCollectionParams) (CollectionItems, error)
|
|
// ============================================
|
|
// KOBO SHELF MANAGEMENT QUERIES
|
|
// ============================================
|
|
AddBookToKoboShelf(ctx context.Context, arg AddBookToKoboShelfParams) (KoboShelves, error)
|
|
// Library Folders queries
|
|
AddLibraryFolder(ctx context.Context, arg AddLibraryFolderParams) (LibraryFolders, error)
|
|
// Bulk update format group for all media items
|
|
BulkUpdateFormatGroups(ctx context.Context) error
|
|
BulkUpdateProgressFromSync(ctx context.Context, arg BulkUpdateProgressFromSyncParams) ([]interface{}, error)
|
|
CheckForProgressConflicts(ctx context.Context, arg CheckForProgressConflictsParams) (int64, error)
|
|
// Cleanup expired OPDS tokens
|
|
CleanupExpiredOpdsTokens(ctx context.Context) error
|
|
CleanupExpiredRefreshTokens(ctx context.Context, dollar_1 float64) error
|
|
ClearDeviceSyncQueue(ctx context.Context, deviceID pgtype.UUID) error
|
|
ClearKoboShelf(ctx context.Context, deviceID pgtype.UUID) error
|
|
ClearKoboShelfByName(ctx context.Context, arg ClearKoboShelfByNameParams) error
|
|
CountAdmins(ctx context.Context) (int64, error)
|
|
// Count unlinked books for a device
|
|
CountUnlinkedBooks(ctx context.Context, deviceID pgtype.UUID) (int64, error)
|
|
CountUserDevices(ctx context.Context, userID pgtype.UUID) (int64, error)
|
|
CreateAutoResolvedSyncConflict(ctx context.Context, arg CreateAutoResolvedSyncConflictParams) (SyncConflicts, error)
|
|
// COLLECTIONS QUERIES
|
|
// Create collection
|
|
CreateCollection(ctx context.Context, arg CreateCollectionParams) (Collections, error)
|
|
// ============================================
|
|
// DEVICE MANAGEMENT & AUTH
|
|
// ============================================
|
|
// Device Registration & Management
|
|
CreateDevice(ctx context.Context, arg CreateDeviceParams) (Devices, error)
|
|
// DEVICE CATALOGS QUERIES
|
|
// Create device catalog entry
|
|
CreateDeviceCatalog(ctx context.Context, arg CreateDeviceCatalogParams) (DeviceCatalogs, error)
|
|
// DEVICE FILE ALIASES QUERIES
|
|
// Create device file alias
|
|
CreateDeviceFileAlias(ctx context.Context, arg CreateDeviceFileAliasParams) (DeviceFileAliases, error)
|
|
// DEVICE SHELF MAPPINGS QUERIES
|
|
// Create device shelf mapping
|
|
CreateDeviceShelfMapping(ctx context.Context, arg CreateDeviceShelfMappingParams) (DeviceShelfMappings, error)
|
|
CreateDictionaryEntry(ctx context.Context, arg CreateDictionaryEntryParams) (DictionaryCache, error)
|
|
// Libraries queries
|
|
CreateLibrary(ctx context.Context, arg CreateLibraryParams) (Libraries, error)
|
|
CreateMediaBookmark(ctx context.Context, arg CreateMediaBookmarkParams) (MediaBookmarks, error)
|
|
CreateMediaBookmarkFull(ctx context.Context, arg CreateMediaBookmarkFullParams) (MediaBookmarks, error)
|
|
// Media Highlights queries
|
|
CreateMediaHighlight(ctx context.Context, arg CreateMediaHighlightParams) (MediaHighlights, error)
|
|
CreateMediaHighlightFull(ctx context.Context, arg CreateMediaHighlightFullParams) (MediaHighlights, error)
|
|
// Media Items queries
|
|
CreateMediaItem(ctx context.Context, arg CreateMediaItemParams) (MediaItems, error)
|
|
// MEDIA ITEM FORMATS QUERIES
|
|
// Create media item format
|
|
CreateMediaItemFormat(ctx context.Context, arg CreateMediaItemFormatParams) (MediaItemFormats, error)
|
|
// Media Notes queries
|
|
CreateMediaNote(ctx context.Context, arg CreateMediaNoteParams) (MediaNotes, error)
|
|
CreateMediaNoteFull(ctx context.Context, arg CreateMediaNoteFullParams) (MediaNotes, error)
|
|
CreateMediaRating(ctx context.Context, arg CreateMediaRatingParams) (MediaRatings, error)
|
|
// OPDS TOKENS QUERIES
|
|
// Create OPDS token
|
|
CreateOpdsToken(ctx context.Context, arg CreateOpdsTokenParams) (OpdsTokens, error)
|
|
// ============================================
|
|
// KOBO ENTITLEMENT QUERIES
|
|
// ============================================
|
|
CreateOrUpdateKoboEntitlement(ctx context.Context, arg CreateOrUpdateKoboEntitlementParams) (KoboEntitlements, error)
|
|
// ============================================================================
|
|
// PROCESSING ISSUES QUERIES
|
|
// ============================================================================
|
|
CreateProcessingIssue(ctx context.Context, arg CreateProcessingIssueParams) (ProcessingIssues, error)
|
|
// Create reading history entry
|
|
CreateReadingHistory(ctx context.Context, arg CreateReadingHistoryParams) (ReadingHistory, error)
|
|
CreateReadingSpeed(ctx context.Context, arg CreateReadingSpeedParams) (ReadingSpeed, error)
|
|
// Refresh Tokens queries
|
|
CreateRefreshToken(ctx context.Context, arg CreateRefreshTokenParams) (RefreshTokens, error)
|
|
CreateSavedFilter(ctx context.Context, arg CreateSavedFilterParams) (SavedFilters, error)
|
|
// Conflict Resolution
|
|
CreateSyncConflict(ctx context.Context, arg CreateSyncConflictParams) (SyncConflicts, error)
|
|
CreateSyncHistoryEntry(ctx context.Context, arg CreateSyncHistoryEntryParams) (SyncQueue, error)
|
|
// Sync Queue Management
|
|
CreateSyncQueueItem(ctx context.Context, arg CreateSyncQueueItemParams) (SyncQueue, error)
|
|
CreateSystemCollection(ctx context.Context, arg CreateSystemCollectionParams) (Collections, error)
|
|
// ============================================
|
|
// ENHANCED KOBO SYNC
|
|
// ============================================
|
|
// Create unlinked book entry
|
|
CreateUnlinkedBook(ctx context.Context, arg CreateUnlinkedBookParams) (UnlinkedBooks, error)
|
|
CreateUser(ctx context.Context, arg CreateUserParams) (CreateUserRow, error)
|
|
// Delete collection
|
|
DeleteCollection(ctx context.Context, id pgtype.UUID) error
|
|
DeleteDevice(ctx context.Context, id pgtype.UUID) error
|
|
DeleteDeviceByToken(ctx context.Context, authToken string) error
|
|
// Delete device catalog entry
|
|
DeleteDeviceCatalog(ctx context.Context, id pgtype.UUID) error
|
|
// Delete device file alias
|
|
DeleteDeviceFileAlias(ctx context.Context, id pgtype.UUID) error
|
|
// Delete device shelf mapping
|
|
DeleteDeviceShelfMapping(ctx context.Context, id pgtype.UUID) error
|
|
DeleteKoboEntitlement(ctx context.Context, arg DeleteKoboEntitlementParams) error
|
|
DeleteLibrary(ctx context.Context, id pgtype.UUID) error
|
|
DeleteLibraryFolder(ctx context.Context, arg DeleteLibraryFolderParams) (LibraryFolders, error)
|
|
DeleteMediaBookmark(ctx context.Context, id pgtype.UUID) error
|
|
DeleteMediaHighlight(ctx context.Context, id pgtype.UUID) error
|
|
DeleteMediaItem(ctx context.Context, id pgtype.UUID) error
|
|
// Delete media item format
|
|
DeleteMediaItemFormat(ctx context.Context, id pgtype.UUID) error
|
|
DeleteMediaNote(ctx context.Context, id pgtype.UUID) error
|
|
DeleteMediaRating(ctx context.Context, arg DeleteMediaRatingParams) error
|
|
DeleteProcessingIssue(ctx context.Context, id pgtype.UUID) (ProcessingIssues, error)
|
|
DeleteReadingProgress(ctx context.Context, arg DeleteReadingProgressParams) error
|
|
DeleteSavedFilter(ctx context.Context, arg DeleteSavedFilterParams) (SavedFilters, error)
|
|
DeleteSyncConflict(ctx context.Context, id pgtype.UUID) error
|
|
DeleteSyncQueueItem(ctx context.Context, id pgtype.UUID) error
|
|
// Delete system config
|
|
DeleteSystemConfig(ctx context.Context, key string) error
|
|
// Delete unlinked book
|
|
DeleteUnlinkedBook(ctx context.Context, id pgtype.UUID) error
|
|
DeleteUser(ctx context.Context, id pgtype.UUID) error
|
|
DeleteUserSystemCollection(ctx context.Context, arg DeleteUserSystemCollectionParams) error
|
|
GenerateKoboEntitlementId(ctx context.Context) (interface{}, error)
|
|
// ============================================
|
|
// ANNOTATION SERVE QUERIES
|
|
// ============================================
|
|
GetActiveAnnotationsForBook(ctx context.Context, arg GetActiveAnnotationsForBookParams) ([]GetActiveAnnotationsForBookRow, error)
|
|
// Get all system config
|
|
GetAllSystemConfig(ctx context.Context) ([]SystemConfig, error)
|
|
GetAllSystemSettings(ctx context.Context) ([]GetAllSystemSettingsRow, error)
|
|
GetAllSystemSettingsFull(ctx context.Context) ([]SystemSettings, error)
|
|
GetAnnotationsForBook(ctx context.Context, arg GetAnnotationsForBookParams) ([]GetAnnotationsForBookRow, error)
|
|
GetBooksByTag(ctx context.Context, arg GetBooksByTagParams) ([]MediaItems, error)
|
|
// Get collection
|
|
GetCollection(ctx context.Context, id pgtype.UUID) (Collections, error)
|
|
// Get collection items
|
|
GetCollectionItems(ctx context.Context, collectionID pgtype.UUID) ([]GetCollectionItemsRow, error)
|
|
GetCollectionItemsForDashboard(ctx context.Context, arg GetCollectionItemsForDashboardParams) ([]GetCollectionItemsForDashboardRow, error)
|
|
// Get collection with book count
|
|
GetCollectionWithBookCount(ctx context.Context, id pgtype.UUID) (GetCollectionWithBookCountRow, error)
|
|
// Get collections by user
|
|
GetCollectionsByUser(ctx context.Context, userID pgtype.UUID) ([]Collections, error)
|
|
// Get collections for book
|
|
GetCollectionsForBook(ctx context.Context, mediaItemID pgtype.UUID) ([]Collections, error)
|
|
// Smart section queries (for system collections)
|
|
GetContinueReadingItems(ctx context.Context, arg GetContinueReadingItemsParams) ([]MediaItems, error)
|
|
GetContinueSeriesItems(ctx context.Context, arg GetContinueSeriesItemsParams) ([]GetContinueSeriesItemsRow, error)
|
|
// ============================================
|
|
// CAROUSEL-STYLE DASHBOARD
|
|
// ============================================
|
|
// Dashboard preferences queries
|
|
GetDashboardPreferences(ctx context.Context, arg GetDashboardPreferencesParams) (UserDashboardPreferences, error)
|
|
GetDevice(ctx context.Context, id pgtype.UUID) (Devices, error)
|
|
GetDeviceByAuthToken(ctx context.Context, authToken string) (Devices, error)
|
|
GetDeviceByIdentifier(ctx context.Context, deviceIdentifier string) (Devices, error)
|
|
// Get device catalog by Bookhoard UUID
|
|
GetDeviceCatalogByBookhoardUUID(ctx context.Context, arg GetDeviceCatalogByBookhoardUUIDParams) (DeviceCatalogs, error)
|
|
// Get device catalog by Kobo ContentId
|
|
GetDeviceCatalogByKoboContentId(ctx context.Context, koboContentID string) (DeviceCatalogs, error)
|
|
// Get device catalog entries
|
|
GetDeviceCatalogEntries(ctx context.Context, deviceID pgtype.UUID) ([]GetDeviceCatalogEntriesRow, error)
|
|
// Get device file alias
|
|
GetDeviceFileAlias(ctx context.Context, arg GetDeviceFileAliasParams) (DeviceFileAliases, error)
|
|
// Get device file alias by SHA-256
|
|
GetDeviceFileAliasBySHA256(ctx context.Context, fileSha256 pgtype.Text) (GetDeviceFileAliasBySHA256Row, error)
|
|
// Get device file aliases by device
|
|
GetDeviceFileAliasesByDevice(ctx context.Context, deviceID pgtype.UUID) ([]GetDeviceFileAliasesByDeviceRow, error)
|
|
// Get device shelf mapping
|
|
GetDeviceShelfMapping(ctx context.Context, arg GetDeviceShelfMappingParams) (DeviceShelfMappings, error)
|
|
// Get device shelf mappings
|
|
GetDeviceShelfMappings(ctx context.Context, deviceID pgtype.UUID) ([]GetDeviceShelfMappingsRow, error)
|
|
GetDictionaryEntry(ctx context.Context, word string) (DictionaryCache, error)
|
|
GetDistinctSeries(ctx context.Context, arg GetDistinctSeriesParams) ([]GetDistinctSeriesRow, error)
|
|
GetDistinctSeriesCount(ctx context.Context, libraryID pgtype.UUID) (int32, error)
|
|
GetFailedSyncQueueItems(ctx context.Context, limit int32) ([]SyncQueue, error)
|
|
GetFirstAdmin(ctx context.Context) (pgtype.UUID, error)
|
|
GetFirstAdminExclude(ctx context.Context, id pgtype.UUID) (GetFirstAdminExcludeRow, error)
|
|
GetKoboEntitlementByContentId(ctx context.Context, arg GetKoboEntitlementByContentIdParams) (GetKoboEntitlementByContentIdRow, error)
|
|
GetKoboEntitlementByEntitlementId(ctx context.Context, arg GetKoboEntitlementByEntitlementIdParams) (GetKoboEntitlementByEntitlementIdRow, error)
|
|
GetKoboEntitlementsForDevice(ctx context.Context, deviceID pgtype.UUID) ([]GetKoboEntitlementsForDeviceRow, error)
|
|
GetKoboShelfBookCount(ctx context.Context, deviceID pgtype.UUID) (int64, error)
|
|
GetKoboShelfBooks(ctx context.Context, deviceID pgtype.UUID) ([]GetKoboShelfBooksRow, error)
|
|
GetKoboShelfBooksByShelfName(ctx context.Context, arg GetKoboShelfBooksByShelfNameParams) ([]GetKoboShelfBooksByShelfNameRow, error)
|
|
// Get Kobo shelves by collection
|
|
GetKoboShelvesByCollection(ctx context.Context, arg GetKoboShelvesByCollectionParams) ([]GetKoboShelvesByCollectionRow, error)
|
|
GetLibrary(ctx context.Context, id pgtype.UUID) (GetLibraryRow, error)
|
|
GetLibraryByFolder(ctx context.Context, folderPath string) (GetLibraryByFolderRow, error)
|
|
GetLibraryByFolderPathPrefix(ctx context.Context, folderPath string) (GetLibraryByFolderPathPrefixRow, error)
|
|
GetLibraryFolders(ctx context.Context, libraryID pgtype.UUID) ([]LibraryFolders, error)
|
|
GetLibraryItems(ctx context.Context, libraryID pgtype.UUID) ([]MediaItems, error)
|
|
GetLibraryType(ctx context.Context, id pgtype.UUID) (LibraryTypes, error)
|
|
GetLibraryTypeByName(ctx context.Context, name string) (LibraryTypes, error)
|
|
// Library Types queries
|
|
GetLibraryTypes(ctx context.Context) ([]LibraryTypes, error)
|
|
GetLibraryVisibility(ctx context.Context, arg GetLibraryVisibilityParams) (LibraryVisibility, error)
|
|
// ============================================================================
|
|
// LIBRARY WITH TYPE INFO QUERIES
|
|
// ============================================================================
|
|
GetLibraryWithType(ctx context.Context, id pgtype.UUID) (GetLibraryWithTypeRow, error)
|
|
GetMediaBookmark(ctx context.Context, id pgtype.UUID) (MediaBookmarks, error)
|
|
// ============================================
|
|
// ANNOTATION SYNC QUERIES (bookmarks)
|
|
// ============================================
|
|
GetMediaBookmarkByDedupKey(ctx context.Context, arg GetMediaBookmarkByDedupKeyParams) (MediaBookmarks, error)
|
|
GetMediaBookmarks(ctx context.Context, arg GetMediaBookmarksParams) ([]MediaBookmarks, error)
|
|
GetMediaHighlight(ctx context.Context, id pgtype.UUID) (MediaHighlights, error)
|
|
// ============================================
|
|
// ANNOTATION SYNC QUERIES (highlights)
|
|
// ============================================
|
|
GetMediaHighlightByDedupKey(ctx context.Context, arg GetMediaHighlightByDedupKeyParams) (MediaHighlights, error)
|
|
GetMediaHighlights(ctx context.Context, arg GetMediaHighlightsParams) ([]MediaHighlights, error)
|
|
GetMediaItem(ctx context.Context, id pgtype.UUID) (MediaItems, error)
|
|
GetMediaItemByFilePath(ctx context.Context, arg GetMediaItemByFilePathParams) (MediaItems, error)
|
|
GetMediaItemByFilePathAnyLibrary(ctx context.Context, filePath string) (MediaItems, error)
|
|
// ============================================
|
|
// KOREADER SYNC PROTOCOL
|
|
// ============================================
|
|
GetMediaItemByFilePathForSync(ctx context.Context, filePath string) (MediaItems, error)
|
|
GetMediaItemByKoboContentId(ctx context.Context, koboContentID pgtype.Text) (MediaItems, error)
|
|
// Get media item by OPF identifier
|
|
GetMediaItemByOPFIdentifier(ctx context.Context, opfIdentifier pgtype.Text) (MediaItems, error)
|
|
// Get media item by OPF UUID
|
|
GetMediaItemByOPFUUID(ctx context.Context, opfUuid pgtype.Text) (MediaItems, error)
|
|
// Get media item by SHA-256 hash
|
|
GetMediaItemBySHA256(ctx context.Context, fileSha256 pgtype.Text) (MediaItems, error)
|
|
// Get media item by SHA-256 hash within a specific library (content dedup)
|
|
GetMediaItemBySHA256AndLibrary(ctx context.Context, arg GetMediaItemBySHA256AndLibraryParams) (MediaItems, error)
|
|
// Get media item format by SHA-256
|
|
GetMediaItemFormatBySHA256(ctx context.Context, fileSha256 pgtype.Text) (MediaItemFormats, error)
|
|
// Get media item format by type
|
|
GetMediaItemFormatByType(ctx context.Context, arg GetMediaItemFormatByTypeParams) (MediaItemFormats, error)
|
|
// Get media item formats
|
|
GetMediaItemFormats(ctx context.Context, mediaItemID pgtype.UUID) ([]MediaItemFormats, error)
|
|
GetMediaNote(ctx context.Context, id pgtype.UUID) (MediaNotes, error)
|
|
// ============================================
|
|
// ANNOTATION SYNC QUERIES (notes)
|
|
// ============================================
|
|
GetMediaNoteByDedupKey(ctx context.Context, arg GetMediaNoteByDedupKeyParams) (MediaNotes, error)
|
|
GetMediaNotes(ctx context.Context, arg GetMediaNotesParams) ([]MediaNotes, error)
|
|
GetMediaRating(ctx context.Context, arg GetMediaRatingParams) (MediaRatings, error)
|
|
GetMediaRatings(ctx context.Context, mediaItemID pgtype.UUID) ([]GetMediaRatingsRow, error)
|
|
GetNextRetryTime(ctx context.Context) (interface{}, error)
|
|
GetNotStartedItems(ctx context.Context, arg GetNotStartedItemsParams) ([]MediaItems, error)
|
|
// Get OPDS token
|
|
GetOpdsToken(ctx context.Context, token string) (GetOpdsTokenRow, error)
|
|
// Get OPDS tokens by device
|
|
GetOpdsTokensByDevice(ctx context.Context, deviceID pgtype.UUID) ([]OpdsTokens, error)
|
|
GetPanelData(ctx context.Context, arg GetPanelDataParams) (PanelData, error)
|
|
// Get most popular books for a user
|
|
GetPopularBooks(ctx context.Context, arg GetPopularBooksParams) ([]GetPopularBooksRow, error)
|
|
GetProcessingIssueStats(ctx context.Context, libraryID pgtype.UUID) (GetProcessingIssueStatsRow, error)
|
|
GetReaderSettings(ctx context.Context, userID pgtype.UUID) ([]byte, error)
|
|
// Get reading history for a user and book
|
|
GetReadingHistory(ctx context.Context, arg GetReadingHistoryParams) ([]ReadingHistory, error)
|
|
GetReadingProgress(ctx context.Context, arg GetReadingProgressParams) (ReadingProgress, error)
|
|
GetReadingSpeed(ctx context.Context, arg GetReadingSpeedParams) (ReadingSpeed, error)
|
|
GetRecentlyAddedItems(ctx context.Context, arg GetRecentlyAddedItemsParams) ([]MediaItems, error)
|
|
GetRecentlyReadItems(ctx context.Context, arg GetRecentlyReadItemsParams) ([]MediaItems, error)
|
|
GetRefreshToken(ctx context.Context, token pgtype.UUID) (GetRefreshTokenRow, error)
|
|
GetSavedFilterByID(ctx context.Context, arg GetSavedFilterByIDParams) (SavedFilters, error)
|
|
GetSavedFilters(ctx context.Context, arg GetSavedFiltersParams) ([]SavedFilters, error)
|
|
GetSeriesBooks(ctx context.Context, series pgtype.Text) ([]MediaItems, error)
|
|
GetSeriesCovers(ctx context.Context, arg GetSeriesCoversParams) ([]GetSeriesCoversRow, error)
|
|
GetStuckSyncQueueItems(ctx context.Context) ([]SyncQueue, error)
|
|
GetSyncConflict(ctx context.Context, id pgtype.UUID) (SyncConflicts, error)
|
|
GetSyncQueueItem(ctx context.Context, id pgtype.UUID) (SyncQueue, error)
|
|
GetSyncQueueStats(ctx context.Context, deviceID pgtype.UUID) (GetSyncQueueStatsRow, error)
|
|
// Dashboard collections queries
|
|
GetSystemCollectionsForDashboard(ctx context.Context, userID pgtype.UUID) ([]Collections, error)
|
|
// SYSTEM CONFIG QUERIES
|
|
// Get system config
|
|
GetSystemConfig(ctx context.Context, key string) (SystemConfig, error)
|
|
// System Settings queries
|
|
GetSystemSetting(ctx context.Context, settingKey string) (string, error)
|
|
GetSystemSettingFull(ctx context.Context, settingKey string) (SystemSettings, error)
|
|
GetSystemTimezone(ctx context.Context) (string, error)
|
|
GetTombstonedAnnotationsForBook(ctx context.Context, arg GetTombstonedAnnotationsForBookParams) ([]GetTombstonedAnnotationsForBookRow, error)
|
|
// Get universal progress for a book
|
|
GetUniversalProgress(ctx context.Context, arg GetUniversalProgressParams) (GetUniversalProgressRow, error)
|
|
// Get unlinked book by ContentId
|
|
GetUnlinkedBookByContentId(ctx context.Context, arg GetUnlinkedBookByContentIdParams) (UnlinkedBooks, error)
|
|
// Get unlinked book by ID
|
|
GetUnlinkedBookByID(ctx context.Context, id pgtype.UUID) (UnlinkedBooks, error)
|
|
// Get unlinked books for a device
|
|
GetUnlinkedBooksByDevice(ctx context.Context, deviceID pgtype.UUID) ([]GetUnlinkedBooksByDeviceRow, error)
|
|
GetUser(ctx context.Context, id pgtype.UUID) (GetUserRow, error)
|
|
GetUserByEmail(ctx context.Context, email string) (GetUserByEmailRow, error)
|
|
GetUserByEmailOrUsername(ctx context.Context, email string) (GetUserByEmailOrUsernameRow, error)
|
|
GetUserByUsername(ctx context.Context, username string) (GetUserByUsernameRow, error)
|
|
GetUserCollectionsForDashboard(ctx context.Context, userID pgtype.UUID) ([]Collections, error)
|
|
// Get user device usage statistics
|
|
GetUserDeviceUsage(ctx context.Context, userID pgtype.UUID) ([]GetUserDeviceUsageRow, error)
|
|
GetUserForLogin(ctx context.Context, email string) (GetUserForLoginRow, error)
|
|
GetUserMediaItemsForSync(ctx context.Context, userID pgtype.UUID) ([]GetUserMediaItemsForSyncRow, error)
|
|
GetUserPasswordHash(ctx context.Context, id pgtype.UUID) (string, error)
|
|
GetUserProgressForBooks(ctx context.Context, arg GetUserProgressForBooksParams) ([]GetUserProgressForBooksRow, error)
|
|
// Analytics queries
|
|
// Get user reading history for analytics
|
|
GetUserReadingHistory(ctx context.Context, arg GetUserReadingHistoryParams) ([]GetUserReadingHistoryRow, error)
|
|
GetUserVisibleLibraries(ctx context.Context, userID pgtype.UUID) ([]GetUserVisibleLibrariesRow, error)
|
|
GetVisibleLibraryMediaCounts(ctx context.Context, userID pgtype.UUID) ([]GetVisibleLibraryMediaCountsRow, error)
|
|
HasRecentConflictResolution(ctx context.Context, arg HasRecentConflictResolutionParams) (bool, error)
|
|
IncrementSyncQueueAttempts(ctx context.Context, arg IncrementSyncQueueAttemptsParams) (SyncQueue, error)
|
|
// Check if book is in collection
|
|
IsBookInCollection(ctx context.Context, arg IsBookInCollectionParams) (bool, error)
|
|
IsBookOnKoboShelf(ctx context.Context, arg IsBookOnKoboShelfParams) (bool, error)
|
|
// Link unlinked book to media item
|
|
LinkUnlinkedBook(ctx context.Context, arg LinkUnlinkedBookParams) (UnlinkedBooks, error)
|
|
ListAllConflictsByUserAndStatus(ctx context.Context, arg ListAllConflictsByUserAndStatusParams) ([]ListAllConflictsByUserAndStatusRow, error)
|
|
ListAllSyncQueueItems(ctx context.Context, arg ListAllSyncQueueItemsParams) ([]ListAllSyncQueueItemsRow, error)
|
|
ListConflictsByUser(ctx context.Context, userID pgtype.UUID) ([]ListConflictsByUserRow, error)
|
|
ListDevicesByType(ctx context.Context, deviceType string) ([]Devices, error)
|
|
ListDevicesByUser(ctx context.Context, userID pgtype.UUID) ([]Devices, error)
|
|
ListLibraries(ctx context.Context) ([]ListLibrariesRow, error)
|
|
ListMediaItems(ctx context.Context, arg ListMediaItemsParams) ([]ListMediaItemsRow, error)
|
|
ListMediaItemsByLibrary(ctx context.Context, libraryID pgtype.UUID) ([]ListMediaItemsByLibraryRow, error)
|
|
ListMediaItemsSorted(ctx context.Context, arg ListMediaItemsSortedParams) ([]ListMediaItemsSortedRow, error)
|
|
ListPendingSyncQueueItems(ctx context.Context, arg ListPendingSyncQueueItemsParams) ([]SyncQueue, error)
|
|
ListProcessingIssuesByLibrary(ctx context.Context, libraryID pgtype.UUID) ([]ListProcessingIssuesByLibraryRow, error)
|
|
ListSyncConflictsByMediaItem(ctx context.Context, arg ListSyncConflictsByMediaItemParams) ([]SyncConflicts, error)
|
|
ListSyncConflictsByUser(ctx context.Context, userID pgtype.UUID) ([]ListSyncConflictsByUserRow, error)
|
|
// List unresolved unlinked books with pagination
|
|
ListUnresolvedUnlinkedBooks(ctx context.Context, arg ListUnresolvedUnlinkedBooksParams) ([]ListUnresolvedUnlinkedBooksRow, error)
|
|
ListUsers(ctx context.Context) ([]ListUsersRow, error)
|
|
PurgeExpiredBookmarkTombstones(ctx context.Context, deletedAt pgtype.Timestamptz) error
|
|
PurgeExpiredHighlightTombstones(ctx context.Context, deletedAt pgtype.Timestamptz) error
|
|
PurgeExpiredNoteTombstones(ctx context.Context, deletedAt pgtype.Timestamptz) error
|
|
// Query media items by multiple identifiers with confidence scoring
|
|
QueryMediaItemsByIdentifiers(ctx context.Context, arg QueryMediaItemsByIdentifiersParams) ([]QueryMediaItemsByIdentifiersRow, error)
|
|
ReassignLibraries(ctx context.Context, arg ReassignLibrariesParams) error
|
|
ReassignMediaItems(ctx context.Context, arg ReassignMediaItemsParams) error
|
|
// Remove book from collection
|
|
RemoveBookFromCollection(ctx context.Context, arg RemoveBookFromCollectionParams) error
|
|
RemoveBookFromKoboShelf(ctx context.Context, arg RemoveBookFromKoboShelfParams) error
|
|
ResetSystemCollectionMetadata(ctx context.Context, arg ResetSystemCollectionMetadataParams) error
|
|
ResolveProcessingIssue(ctx context.Context, arg ResolveProcessingIssueParams) (ProcessingIssues, error)
|
|
ResolveSyncConflict(ctx context.Context, arg ResolveSyncConflictParams) (SyncConflicts, error)
|
|
// Resolve unlinked book
|
|
ResolveUnlinkedBook(ctx context.Context, arg ResolveUnlinkedBookParams) (UnlinkedBooks, error)
|
|
RevokeAllUserRefreshTokens(ctx context.Context, userID pgtype.UUID) error
|
|
RevokeDevice(ctx context.Context, id pgtype.UUID) error
|
|
// Revoke OPDS token
|
|
RevokeOpdsToken(ctx context.Context, token string) error
|
|
RevokeRefreshToken(ctx context.Context, token pgtype.UUID) error
|
|
SearchAuthorValues(ctx context.Context, arg SearchAuthorValuesParams) ([]SearchAuthorValuesRow, error)
|
|
SearchGenreValues(ctx context.Context, arg SearchGenreValuesParams) ([]SearchGenreValuesRow, error)
|
|
SearchLanguageValues(ctx context.Context, arg SearchLanguageValuesParams) ([]SearchLanguageValuesRow, error)
|
|
// Search Media Items queries
|
|
SearchMediaItems(ctx context.Context, arg SearchMediaItemsParams) ([]SearchMediaItemsRow, error)
|
|
SearchMediaItemsUnified(ctx context.Context, arg SearchMediaItemsUnifiedParams) ([]SearchMediaItemsUnifiedRow, error)
|
|
SearchSeriesValues(ctx context.Context, arg SearchSeriesValuesParams) ([]SearchSeriesValuesRow, error)
|
|
SearchTagsValues(ctx context.Context, arg SearchTagsValuesParams) ([]SearchTagsValuesRow, error)
|
|
// Library Visibility queries
|
|
SetLibraryVisibility(ctx context.Context, arg SetLibraryVisibilityParams) (LibraryVisibility, error)
|
|
// Set system config
|
|
SetSystemConfig(ctx context.Context, arg SetSystemConfigParams) (SystemConfig, error)
|
|
SyncLibraryTypeExtensions(ctx context.Context, arg SyncLibraryTypeExtensionsParams) error
|
|
TombstoneMediaBookmarkByDedupKey(ctx context.Context, arg TombstoneMediaBookmarkByDedupKeyParams) error
|
|
TombstoneMediaBookmarkByID(ctx context.Context, id pgtype.UUID) error
|
|
TombstoneMediaHighlightByDedupKey(ctx context.Context, arg TombstoneMediaHighlightByDedupKeyParams) error
|
|
TombstoneMediaHighlightByID(ctx context.Context, id pgtype.UUID) error
|
|
TombstoneMediaNoteByDedupKey(ctx context.Context, arg TombstoneMediaNoteByDedupKeyParams) error
|
|
TombstoneMediaNoteByID(ctx context.Context, id pgtype.UUID) error
|
|
// Update collection
|
|
UpdateCollection(ctx context.Context, arg UpdateCollectionParams) (Collections, error)
|
|
UpdateDashboardPreferences(ctx context.Context, arg UpdateDashboardPreferencesParams) (UserDashboardPreferences, error)
|
|
UpdateDevice(ctx context.Context, arg UpdateDeviceParams) (Devices, error)
|
|
UpdateDeviceAuthToken(ctx context.Context, arg UpdateDeviceAuthTokenParams) (Devices, error)
|
|
// Update device catalog availability
|
|
UpdateDeviceCatalogAvailability(ctx context.Context, arg UpdateDeviceCatalogAvailabilityParams) error
|
|
// Update device file alias
|
|
UpdateDeviceFileAlias(ctx context.Context, arg UpdateDeviceFileAliasParams) (DeviceFileAliases, error)
|
|
UpdateDeviceLastSeen(ctx context.Context, id pgtype.UUID) (Devices, error)
|
|
UpdateDeviceLastSync(ctx context.Context, id pgtype.UUID) (Devices, error)
|
|
// Update device shelf mapping
|
|
UpdateDeviceShelfMapping(ctx context.Context, arg UpdateDeviceShelfMappingParams) (DeviceShelfMappings, error)
|
|
UpdateDeviceSyncTimestamp(ctx context.Context, id pgtype.UUID) (Devices, error)
|
|
UpdateDictionaryAccessed(ctx context.Context, word string) (DictionaryCache, error)
|
|
UpdateEmail(ctx context.Context, arg UpdateEmailParams) error
|
|
UpdateKoboEntitlementRevision(ctx context.Context, arg UpdateKoboEntitlementRevisionParams) error
|
|
UpdateKoboEntitlementStatus(ctx context.Context, arg UpdateKoboEntitlementStatusParams) error
|
|
UpdateKoboShelfBookPosition(ctx context.Context, arg UpdateKoboShelfBookPositionParams) error
|
|
// Update Kobo shelves to support collections
|
|
UpdateKoboShelfCollection(ctx context.Context, arg UpdateKoboShelfCollectionParams) (KoboShelves, error)
|
|
UpdateLibrary(ctx context.Context, arg UpdateLibraryParams) (Libraries, error)
|
|
UpdateMediaBookmark(ctx context.Context, arg UpdateMediaBookmarkParams) (MediaBookmarks, error)
|
|
UpdateMediaBookmarkForSync(ctx context.Context, arg UpdateMediaBookmarkForSyncParams) (MediaBookmarks, error)
|
|
UpdateMediaHighlight(ctx context.Context, arg UpdateMediaHighlightParams) (MediaHighlights, error)
|
|
UpdateMediaHighlightForSync(ctx context.Context, arg UpdateMediaHighlightForSyncParams) (MediaHighlights, error)
|
|
UpdateMediaItem(ctx context.Context, arg UpdateMediaItemParams) (MediaItems, error)
|
|
UpdateMediaItemChapterMetadata(ctx context.Context, arg UpdateMediaItemChapterMetadataParams) (MediaItems, error)
|
|
// Update media item format
|
|
UpdateMediaItemFormat(ctx context.Context, arg UpdateMediaItemFormatParams) (MediaItemFormats, error)
|
|
// ============================================
|
|
// FORMAT DETECTION & PROGRESS
|
|
// ============================================
|
|
// Update media item format group information
|
|
UpdateMediaItemFormatGroup(ctx context.Context, arg UpdateMediaItemFormatGroupParams) error
|
|
// Media Items Admin Operations
|
|
// ============================================
|
|
// UNIVERSAL BOOK IDENTIFIERS
|
|
// ============================================
|
|
// Update media item with universal identifiers
|
|
UpdateMediaItemIdentifiers(ctx context.Context, arg UpdateMediaItemIdentifiersParams) (MediaItems, error)
|
|
UpdateMediaItemKoboMetadata(ctx context.Context, arg UpdateMediaItemKoboMetadataParams) (MediaItems, error)
|
|
UpdateMediaNote(ctx context.Context, arg UpdateMediaNoteParams) (MediaNotes, error)
|
|
UpdateMediaNoteForSync(ctx context.Context, arg UpdateMediaNoteForSyncParams) (MediaNotes, error)
|
|
UpdateMediaRating(ctx context.Context, arg UpdateMediaRatingParams) (MediaRatings, error)
|
|
UpdatePassword(ctx context.Context, arg UpdatePasswordParams) error
|
|
UpdateReadingProgress(ctx context.Context, arg UpdateReadingProgressParams) (ReadingProgress, error)
|
|
UpdateReadingSpeed(ctx context.Context, arg UpdateReadingSpeedParams) (ReadingSpeed, error)
|
|
UpdateSavedFilter(ctx context.Context, arg UpdateSavedFilterParams) (SavedFilters, error)
|
|
UpdateSyncQueueItemStatus(ctx context.Context, arg UpdateSyncQueueItemStatusParams) (SyncQueue, error)
|
|
UpdateSystemSetting(ctx context.Context, arg UpdateSystemSettingParams) error
|
|
// Update universal progress
|
|
UpdateUniversalProgress(ctx context.Context, arg UpdateUniversalProgressParams) (ReadingProgress, error)
|
|
UpdateUserMaxDevices(ctx context.Context, arg UpdateUserMaxDevicesParams) (Users, error)
|
|
UpdateUserProfile(ctx context.Context, arg UpdateUserProfileParams) error
|
|
UpdateUserRole(ctx context.Context, arg UpdateUserRoleParams) (UpdateUserRoleRow, error)
|
|
UpdateUserTheme(ctx context.Context, arg UpdateUserThemeParams) error
|
|
UpdateUserTimezone(ctx context.Context, arg UpdateUserTimezoneParams) error
|
|
UpdateUsername(ctx context.Context, arg UpdateUsernameParams) error
|
|
UpsertDashboardPreferences(ctx context.Context, arg UpsertDashboardPreferencesParams) (UserDashboardPreferences, error)
|
|
UpsertPanelData(ctx context.Context, arg UpsertPanelDataParams) (PanelData, error)
|
|
UpsertReaderSettings(ctx context.Context, arg UpsertReaderSettingsParams) (ReaderSettings, error)
|
|
UpsertSystemSetting(ctx context.Context, arg UpsertSystemSettingParams) (SystemSettings, error)
|
|
}
|
|
|
|
var _ Querier = (*Queries)(nil)
|