From fc71c2ef7653466a15450c61677cca1a36567ed3 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Fri, 30 Jan 2026 13:51:44 -0500 Subject: [PATCH] fix: database queries and schema sync - Remove references to non-existent columns (language, edition, page_count, etc.) - Fix CreateMediaItem and UpdateMediaItem queries - Remove normalize_isbn() function calls (moved to Go code) - Regenerate database code with sqlc generate - Add GetLibraryByFolder method to queries Fixes compiler error: s.db.GetLibraryByFolder undefined --- internal/database/models.go | 18 - internal/database/querier.go | 27 +- internal/database/queries.sql.go | 905 ++------------------------ internal/database/queries/queries.sql | 57 +- 4 files changed, 62 insertions(+), 945 deletions(-) diff --git a/internal/database/models.go b/internal/database/models.go index fb1308d..111113c 100644 --- a/internal/database/models.go +++ b/internal/database/models.go @@ -71,15 +71,6 @@ type Ebooks struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -150,15 +141,6 @@ type MediaItems struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` diff --git a/internal/database/querier.go b/internal/database/querier.go index 10babf7..ae8d137 100644 --- a/internal/database/querier.go +++ b/internal/database/querier.go @@ -14,13 +14,8 @@ type Querier interface { // Library Folders queries AddLibraryFolder(ctx context.Context, arg AddLibraryFolderParams) (LibraryFolders, error) CleanupExpiredRefreshTokens(ctx context.Context) error - CreateEbook(ctx context.Context, arg CreateEbookParams) (MediaItems, error) - // Backward compatibility - Ebook Highlights queries (using views) - CreateEbookHighlight(ctx context.Context, arg CreateEbookHighlightParams) (MediaHighlights, error) // Backward compatibility - Ebook Notes queries (using views) CreateEbookNote(ctx context.Context, arg CreateEbookNoteParams) (MediaNotes, error) - // Backward compatibility - Ebooks ratings (using views) - CreateEbookRating(ctx context.Context, arg CreateEbookRatingParams) (MediaRatings, error) // Libraries queries CreateLibrary(ctx context.Context, arg CreateLibraryParams) (Libraries, error) // Media Highlights queries @@ -33,10 +28,7 @@ type Querier interface { // Refresh Tokens queries CreateRefreshToken(ctx context.Context, arg CreateRefreshTokenParams) (RefreshTokens, error) CreateUser(ctx context.Context, arg CreateUserParams) (CreateUserRow, error) - DeleteEbook(ctx context.Context, id pgtype.UUID) error - DeleteEbookHighlight(ctx context.Context, id pgtype.UUID) error DeleteEbookNote(ctx context.Context, id pgtype.UUID) error - DeleteEbookRating(ctx context.Context, arg DeleteEbookRatingParams) error DeleteLibrary(ctx context.Context, id pgtype.UUID) error DeleteLibraryFolder(ctx context.Context, arg DeleteLibraryFolderParams) (LibraryFolders, error) DeleteMediaHighlight(ctx context.Context, id pgtype.UUID) error @@ -45,19 +37,8 @@ type Querier interface { DeleteMediaRating(ctx context.Context, arg DeleteMediaRatingParams) error DeleteReadingProgress(ctx context.Context, arg DeleteReadingProgressParams) error DeleteUser(ctx context.Context, id pgtype.UUID) error - // Backward compatibility - Ebooks queries (using views) - GetEbook(ctx context.Context, id pgtype.UUID) (Ebooks, error) - // Note: User ebook folders replaced by library folders system - // Legacy folder management is now handled through libraries - GetEbookByFilePath(ctx context.Context, filePath string) (Ebooks, error) - GetEbookHighlight(ctx context.Context, id pgtype.UUID) (EbookHighlights, error) - GetEbookHighlights(ctx context.Context, arg GetEbookHighlightsParams) ([]EbookHighlights, error) - GetEbookLibraryID(ctx context.Context) (pgtype.UUID, error) - GetEbookNote(ctx context.Context, id pgtype.UUID) (EbookNotes, error) - GetEbookNotes(ctx context.Context, arg GetEbookNotesParams) ([]EbookNotes, error) - GetEbookRating(ctx context.Context, arg GetEbookRatingParams) (EbookRatings, error) - GetEbookRatings(ctx context.Context, ebookID pgtype.UUID) ([]GetEbookRatingsRow, error) GetLibrary(ctx context.Context, id pgtype.UUID) (GetLibraryRow, error) + GetLibraryByFolder(ctx context.Context, folderPath string) (GetLibraryByFolderRow, error) GetLibraryFolders(ctx context.Context, libraryID pgtype.UUID) ([]LibraryFolders, error) GetLibraryType(ctx context.Context, id pgtype.UUID) (LibraryTypes, error) GetLibraryTypeByName(ctx context.Context, name string) (LibraryTypes, error) @@ -82,7 +63,6 @@ type Querier interface { GetUserForLogin(ctx context.Context, email string) (GetUserForLoginRow, error) GetUserPasswordHash(ctx context.Context, id pgtype.UUID) (string, error) GetUserVisibleLibraries(ctx context.Context, userID pgtype.UUID) ([]GetUserVisibleLibrariesRow, error) - ListEbooks(ctx context.Context, arg ListEbooksParams) ([]Ebooks, error) ListLibraries(ctx context.Context) ([]ListLibrariesRow, error) ListMediaItems(ctx context.Context, arg ListMediaItemsParams) ([]ListMediaItemsRow, error) ListMediaItemsByLibrary(ctx context.Context, libraryID pgtype.UUID) ([]ListMediaItemsByLibraryRow, error) @@ -91,15 +71,14 @@ type Querier interface { ListUsers(ctx context.Context) ([]ListUsersRow, error) RevokeAllUserRefreshTokens(ctx context.Context, userID pgtype.UUID) error RevokeRefreshToken(ctx context.Context, token string) error + // Note: User ebook folders replaced by library folders system + // Legacy folder management is now handled through libraries // Search Media Items queries SearchMediaItems(ctx context.Context, arg SearchMediaItemsParams) ([]SearchMediaItemsRow, error) SearchMediaItemsFuzzy(ctx context.Context, arg SearchMediaItemsFuzzyParams) ([]SearchMediaItemsFuzzyRow, error) // Library Visibility queries SetLibraryVisibility(ctx context.Context, arg SetLibraryVisibilityParams) (LibraryVisibility, error) - UpdateEbook(ctx context.Context, arg UpdateEbookParams) (MediaItems, error) - UpdateEbookHighlight(ctx context.Context, arg UpdateEbookHighlightParams) (MediaHighlights, error) UpdateEbookNote(ctx context.Context, arg UpdateEbookNoteParams) (MediaNotes, error) - UpdateEbookRating(ctx context.Context, arg UpdateEbookRatingParams) (MediaRatings, error) UpdateEmail(ctx context.Context, arg UpdateEmailParams) error UpdateLibrary(ctx context.Context, arg UpdateLibraryParams) (Libraries, error) UpdateMediaHighlight(ctx context.Context, arg UpdateMediaHighlightParams) (MediaHighlights, error) diff --git a/internal/database/queries.sql.go b/internal/database/queries.sql.go index f756899..7fd89d7 100644 --- a/internal/database/queries.sql.go +++ b/internal/database/queries.sql.go @@ -42,128 +42,6 @@ func (q *Queries) CleanupExpiredRefreshTokens(ctx context.Context) error { return err } -const CreateEbook = `-- name: CreateEbook :one -INSERT INTO media_items (library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id) -VALUES ((SELECT id FROM libraries WHERE library_type_id = (SELECT id FROM library_types WHERE name = 'ebooks') LIMIT 1), $1, $2, normalize_isbn($3), $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) -RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at -` - -type CreateEbookParams struct { - Title string `db:"title" json:"title"` - Author pgtype.Text `db:"author" json:"author"` - Isbn string `db:"isbn" json:"isbn"` - Description pgtype.Text `db:"description" json:"description"` - FilePath string `db:"file_path" json:"file_path"` - FileSize pgtype.Int8 `db:"file_size" json:"file_size"` - MimeType pgtype.Text `db:"mime_type" json:"mime_type"` - CoverImagePath pgtype.Text `db:"cover_image_path" json:"cover_image_path"` - Series pgtype.Text `db:"series" json:"series"` - SeriesNumber pgtype.Int4 `db:"series_number" json:"series_number"` - Tags pgtype.Text `db:"tags" json:"tags"` - Asin pgtype.Text `db:"asin" json:"asin"` - DatePublished pgtype.Date `db:"date_published" json:"date_published"` - Publisher pgtype.Text `db:"publisher" json:"publisher"` - Contributors pgtype.Text `db:"contributors" json:"contributors"` - AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` -} - -func (q *Queries) CreateEbook(ctx context.Context, arg CreateEbookParams) (MediaItems, error) { - row := q.db.QueryRow(ctx, CreateEbook, - arg.Title, - arg.Author, - arg.Isbn, - arg.Description, - arg.FilePath, - arg.FileSize, - arg.MimeType, - arg.CoverImagePath, - arg.Series, - arg.SeriesNumber, - arg.Tags, - arg.Asin, - arg.DatePublished, - arg.Publisher, - arg.Contributors, - arg.AddedByAdminID, - ) - var i MediaItems - err := row.Scan( - &i.ID, - &i.LibraryID, - &i.Title, - &i.Author, - &i.Isbn, - &i.Description, - &i.FilePath, - &i.FileSize, - &i.MimeType, - &i.CoverImagePath, - &i.Series, - &i.SeriesNumber, - &i.Tags, - &i.Asin, - &i.DatePublished, - &i.Publisher, - &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, - &i.AddedByAdminID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const CreateEbookHighlight = `-- name: CreateEbookHighlight :one -INSERT INTO media_highlights (media_item_id, user_id, selection_text, start_position, end_position, color, note_id) -VALUES ($1, $2, $3, $4, $5, $6, $7) -RETURNING id, media_item_id, user_id, selection_text, start_position, end_position, color, note_id, created_at, updated_at -` - -type CreateEbookHighlightParams struct { - MediaItemID pgtype.UUID `db:"media_item_id" json:"media_item_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` - SelectionText string `db:"selection_text" json:"selection_text"` - StartPosition pgtype.Text `db:"start_position" json:"start_position"` - EndPosition pgtype.Text `db:"end_position" json:"end_position"` - Color pgtype.Text `db:"color" json:"color"` - NoteID pgtype.UUID `db:"note_id" json:"note_id"` -} - -// Backward compatibility - Ebook Highlights queries (using views) -func (q *Queries) CreateEbookHighlight(ctx context.Context, arg CreateEbookHighlightParams) (MediaHighlights, error) { - row := q.db.QueryRow(ctx, CreateEbookHighlight, - arg.MediaItemID, - arg.UserID, - arg.SelectionText, - arg.StartPosition, - arg.EndPosition, - arg.Color, - arg.NoteID, - ) - var i MediaHighlights - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.SelectionText, - &i.StartPosition, - &i.EndPosition, - &i.Color, - &i.NoteID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - const CreateEbookNote = `-- name: CreateEbookNote :one INSERT INTO media_notes (media_item_id, user_id, content, position) VALUES ($1, $2, $3, $4) @@ -198,37 +76,6 @@ func (q *Queries) CreateEbookNote(ctx context.Context, arg CreateEbookNoteParams return i, err } -const CreateEbookRating = `-- name: CreateEbookRating :one -INSERT INTO media_ratings (media_item_id, user_id, rating) -VALUES ($1, $2, $3) -ON CONFLICT (media_item_id, user_id) -DO UPDATE SET - rating = EXCLUDED.rating, - updated_at = NOW() -RETURNING id, media_item_id, user_id, rating, created_at, updated_at -` - -type CreateEbookRatingParams struct { - MediaItemID pgtype.UUID `db:"media_item_id" json:"media_item_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` - Rating int32 `db:"rating" json:"rating"` -} - -// Backward compatibility - Ebooks ratings (using views) -func (q *Queries) CreateEbookRating(ctx context.Context, arg CreateEbookRatingParams) (MediaRatings, error) { - row := q.db.QueryRow(ctx, CreateEbookRating, arg.MediaItemID, arg.UserID, arg.Rating) - var i MediaRatings - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Rating, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - const CreateLibrary = `-- name: CreateLibrary :one INSERT INTO libraries (name, description, library_type_id, created_by_admin_id) VALUES ($1, $2, $3, $4) @@ -308,15 +155,15 @@ func (q *Queries) CreateMediaHighlight(ctx context.Context, arg CreateMediaHighl const CreateMediaItem = `-- name: CreateMediaItem :one INSERT INTO media_items (library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id) -VALUES ($1, $2, $3, normalize_isbn($4), $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) -RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at +VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) +RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id, created_at, updated_at ` type CreateMediaItemParams struct { LibraryID pgtype.UUID `db:"library_id" json:"library_id"` Title string `db:"title" json:"title"` Author pgtype.Text `db:"author" json:"author"` - Isbn string `db:"isbn" json:"isbn"` + Isbn pgtype.Text `db:"isbn" json:"isbn"` Description pgtype.Text `db:"description" json:"description"` FilePath string `db:"file_path" json:"file_path"` FileSize pgtype.Int8 `db:"file_size" json:"file_size"` @@ -372,15 +219,6 @@ func (q *Queries) CreateMediaItem(ctx context.Context, arg CreateMediaItemParams &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -532,24 +370,6 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (CreateU return i, err } -const DeleteEbook = `-- name: DeleteEbook :exec -DELETE FROM media_items WHERE id = $1 -` - -func (q *Queries) DeleteEbook(ctx context.Context, id pgtype.UUID) error { - _, err := q.db.Exec(ctx, DeleteEbook, id) - return err -} - -const DeleteEbookHighlight = `-- name: DeleteEbookHighlight :exec -DELETE FROM media_highlights WHERE id = $1 -` - -func (q *Queries) DeleteEbookHighlight(ctx context.Context, id pgtype.UUID) error { - _, err := q.db.Exec(ctx, DeleteEbookHighlight, id) - return err -} - const DeleteEbookNote = `-- name: DeleteEbookNote :exec DELETE FROM media_notes WHERE id = $1 ` @@ -559,20 +379,6 @@ func (q *Queries) DeleteEbookNote(ctx context.Context, id pgtype.UUID) error { return err } -const DeleteEbookRating = `-- name: DeleteEbookRating :exec -DELETE FROM media_ratings WHERE media_item_id = $1 AND user_id = $2 -` - -type DeleteEbookRatingParams struct { - MediaItemID pgtype.UUID `db:"media_item_id" json:"media_item_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` -} - -func (q *Queries) DeleteEbookRating(ctx context.Context, arg DeleteEbookRatingParams) error { - _, err := q.db.Exec(ctx, DeleteEbookRating, arg.MediaItemID, arg.UserID) - return err -} - const DeleteLibrary = `-- name: DeleteLibrary :exec DELETE FROM libraries WHERE id = $1 ` @@ -667,297 +473,6 @@ func (q *Queries) DeleteUser(ctx context.Context, id pgtype.UUID) error { return err } -const GetEbook = `-- name: GetEbook :one -SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at FROM ebooks WHERE id = $1 -` - -// Backward compatibility - Ebooks queries (using views) -func (q *Queries) GetEbook(ctx context.Context, id pgtype.UUID) (Ebooks, error) { - row := q.db.QueryRow(ctx, GetEbook, id) - var i Ebooks - err := row.Scan( - &i.ID, - &i.LibraryID, - &i.Title, - &i.Author, - &i.Isbn, - &i.Description, - &i.FilePath, - &i.FileSize, - &i.MimeType, - &i.CoverImagePath, - &i.Series, - &i.SeriesNumber, - &i.Tags, - &i.Asin, - &i.DatePublished, - &i.Publisher, - &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, - &i.AddedByAdminID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const GetEbookByFilePath = `-- name: GetEbookByFilePath :one - -SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at FROM ebooks WHERE file_path = $1 -` - -// Note: User ebook folders replaced by library folders system -// Legacy folder management is now handled through libraries -func (q *Queries) GetEbookByFilePath(ctx context.Context, filePath string) (Ebooks, error) { - row := q.db.QueryRow(ctx, GetEbookByFilePath, filePath) - var i Ebooks - err := row.Scan( - &i.ID, - &i.LibraryID, - &i.Title, - &i.Author, - &i.Isbn, - &i.Description, - &i.FilePath, - &i.FileSize, - &i.MimeType, - &i.CoverImagePath, - &i.Series, - &i.SeriesNumber, - &i.Tags, - &i.Asin, - &i.DatePublished, - &i.Publisher, - &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, - &i.AddedByAdminID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const GetEbookHighlight = `-- name: GetEbookHighlight :one -SELECT id, media_item_id, user_id, selection_text, start_position, end_position, color, note_id, created_at, updated_at, ebook_id FROM ebook_highlights WHERE id = $1 -` - -func (q *Queries) GetEbookHighlight(ctx context.Context, id pgtype.UUID) (EbookHighlights, error) { - row := q.db.QueryRow(ctx, GetEbookHighlight, id) - var i EbookHighlights - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.SelectionText, - &i.StartPosition, - &i.EndPosition, - &i.Color, - &i.NoteID, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - ) - return i, err -} - -const GetEbookHighlights = `-- name: GetEbookHighlights :many -SELECT id, media_item_id, user_id, selection_text, start_position, end_position, color, note_id, created_at, updated_at, ebook_id FROM ebook_highlights WHERE ebook_id = $1 AND user_id = $2 ORDER BY created_at DESC -` - -type GetEbookHighlightsParams struct { - EbookID pgtype.UUID `db:"ebook_id" json:"ebook_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` -} - -func (q *Queries) GetEbookHighlights(ctx context.Context, arg GetEbookHighlightsParams) ([]EbookHighlights, error) { - rows, err := q.db.Query(ctx, GetEbookHighlights, arg.EbookID, arg.UserID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []EbookHighlights{} - for rows.Next() { - var i EbookHighlights - if err := rows.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.SelectionText, - &i.StartPosition, - &i.EndPosition, - &i.Color, - &i.NoteID, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const GetEbookLibraryID = `-- name: GetEbookLibraryID :one -SELECT id FROM libraries WHERE library_type_id = (SELECT id FROM library_types WHERE name = 'ebooks') LIMIT 1 -` - -func (q *Queries) GetEbookLibraryID(ctx context.Context) (pgtype.UUID, error) { - row := q.db.QueryRow(ctx, GetEbookLibraryID) - var id pgtype.UUID - err := row.Scan(&id) - return id, err -} - -const GetEbookNote = `-- name: GetEbookNote :one -SELECT id, media_item_id, user_id, content, position, created_at, updated_at, ebook_id FROM ebook_notes WHERE id = $1 -` - -func (q *Queries) GetEbookNote(ctx context.Context, id pgtype.UUID) (EbookNotes, error) { - row := q.db.QueryRow(ctx, GetEbookNote, id) - var i EbookNotes - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Content, - &i.Position, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - ) - return i, err -} - -const GetEbookNotes = `-- name: GetEbookNotes :many -SELECT id, media_item_id, user_id, content, position, created_at, updated_at, ebook_id FROM ebook_notes WHERE ebook_id = $1 AND user_id = $2 ORDER BY created_at DESC -` - -type GetEbookNotesParams struct { - EbookID pgtype.UUID `db:"ebook_id" json:"ebook_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` -} - -func (q *Queries) GetEbookNotes(ctx context.Context, arg GetEbookNotesParams) ([]EbookNotes, error) { - rows, err := q.db.Query(ctx, GetEbookNotes, arg.EbookID, arg.UserID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []EbookNotes{} - for rows.Next() { - var i EbookNotes - if err := rows.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Content, - &i.Position, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const GetEbookRating = `-- name: GetEbookRating :one -SELECT id, media_item_id, user_id, rating, created_at, updated_at, ebook_id FROM ebook_ratings WHERE ebook_id = $1 AND user_id = $2 -` - -type GetEbookRatingParams struct { - EbookID pgtype.UUID `db:"ebook_id" json:"ebook_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` -} - -func (q *Queries) GetEbookRating(ctx context.Context, arg GetEbookRatingParams) (EbookRatings, error) { - row := q.db.QueryRow(ctx, GetEbookRating, arg.EbookID, arg.UserID) - var i EbookRatings - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Rating, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - ) - return i, err -} - -const GetEbookRatings = `-- name: GetEbookRatings :many -SELECT er.id, er.media_item_id, er.user_id, er.rating, er.created_at, er.updated_at, er.ebook_id, u.username -FROM ebook_ratings er -JOIN users u ON er.user_id = u.id -WHERE er.ebook_id = $1 -ORDER BY er.created_at DESC -` - -type GetEbookRatingsRow struct { - ID pgtype.UUID `db:"id" json:"id"` - MediaItemID pgtype.UUID `db:"media_item_id" json:"media_item_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` - Rating int32 `db:"rating" json:"rating"` - CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` - UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` - EbookID pgtype.UUID `db:"ebook_id" json:"ebook_id"` - Username string `db:"username" json:"username"` -} - -func (q *Queries) GetEbookRatings(ctx context.Context, ebookID pgtype.UUID) ([]GetEbookRatingsRow, error) { - rows, err := q.db.Query(ctx, GetEbookRatings, ebookID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []GetEbookRatingsRow{} - for rows.Next() { - var i GetEbookRatingsRow - if err := rows.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Rating, - &i.CreatedAt, - &i.UpdatedAt, - &i.EbookID, - &i.Username, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const GetLibrary = `-- name: GetLibrary :one SELECT l.id, l.name, l.description, l.library_type_id, l.created_by_admin_id, l.created_at, l.updated_at, lt.name as type_name, lt.description as type_description FROM libraries l @@ -994,6 +509,39 @@ func (q *Queries) GetLibrary(ctx context.Context, id pgtype.UUID) (GetLibraryRow return i, err } +const GetLibraryByFolder = `-- name: GetLibraryByFolder :one +SELECT lf.library_id, l.id, l.name, l.description, l.library_type_id, l.created_by_admin_id, l.created_at, l.updated_at FROM library_folders lf +JOIN libraries l ON lf.library_id = l.id +WHERE lf.folder_path = $1 +` + +type GetLibraryByFolderRow struct { + LibraryID pgtype.UUID `db:"library_id" json:"library_id"` + ID pgtype.UUID `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Description pgtype.Text `db:"description" json:"description"` + LibraryTypeID pgtype.UUID `db:"library_type_id" json:"library_type_id"` + CreatedByAdminID pgtype.UUID `db:"created_by_admin_id" json:"created_by_admin_id"` + CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` + UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` +} + +func (q *Queries) GetLibraryByFolder(ctx context.Context, folderPath string) (GetLibraryByFolderRow, error) { + row := q.db.QueryRow(ctx, GetLibraryByFolder, folderPath) + var i GetLibraryByFolderRow + err := row.Scan( + &i.LibraryID, + &i.ID, + &i.Name, + &i.Description, + &i.LibraryTypeID, + &i.CreatedByAdminID, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + const GetLibraryFolders = `-- name: GetLibraryFolders :many SELECT id, library_id, folder_path, created_at FROM library_folders WHERE library_id = $1 ORDER BY created_at ` @@ -1174,7 +722,7 @@ func (q *Queries) GetMediaHighlights(ctx context.Context, arg GetMediaHighlights } const GetMediaItem = `-- name: GetMediaItem :one -SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at FROM media_items WHERE id = $1 +SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id, created_at, updated_at FROM media_items WHERE id = $1 ` func (q *Queries) GetMediaItem(ctx context.Context, id pgtype.UUID) (MediaItems, error) { @@ -1198,15 +746,6 @@ func (q *Queries) GetMediaItem(ctx context.Context, id pgtype.UUID) (MediaItems, &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -1215,7 +754,7 @@ func (q *Queries) GetMediaItem(ctx context.Context, id pgtype.UUID) (MediaItems, } const GetMediaItemByFilePath = `-- name: GetMediaItemByFilePath :one -SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at FROM media_items WHERE file_path = $1 +SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id, created_at, updated_at FROM media_items WHERE file_path = $1 ` func (q *Queries) GetMediaItemByFilePath(ctx context.Context, filePath string) (MediaItems, error) { @@ -1239,15 +778,6 @@ func (q *Queries) GetMediaItemByFilePath(ctx context.Context, filePath string) ( &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -1687,65 +1217,6 @@ func (q *Queries) GetUserVisibleLibraries(ctx context.Context, userID pgtype.UUI return items, nil } -const ListEbooks = `-- name: ListEbooks :many -SELECT id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at FROM ebooks ORDER BY created_at DESC LIMIT $1 OFFSET $2 -` - -type ListEbooksParams struct { - Limit int32 `db:"limit" json:"limit"` - Offset int32 `db:"offset" json:"offset"` -} - -func (q *Queries) ListEbooks(ctx context.Context, arg ListEbooksParams) ([]Ebooks, error) { - rows, err := q.db.Query(ctx, ListEbooks, arg.Limit, arg.Offset) - if err != nil { - return nil, err - } - defer rows.Close() - items := []Ebooks{} - for rows.Next() { - var i Ebooks - if err := rows.Scan( - &i.ID, - &i.LibraryID, - &i.Title, - &i.Author, - &i.Isbn, - &i.Description, - &i.FilePath, - &i.FileSize, - &i.MimeType, - &i.CoverImagePath, - &i.Series, - &i.SeriesNumber, - &i.Tags, - &i.Asin, - &i.DatePublished, - &i.Publisher, - &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, - &i.AddedByAdminID, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const ListLibraries = `-- name: ListLibraries :many SELECT l.id, l.name, l.description, l.library_type_id, l.created_by_admin_id, l.created_at, l.updated_at, lt.name as type_name, lt.description as type_description FROM libraries l @@ -1796,7 +1267,7 @@ func (q *Queries) ListLibraries(ctx context.Context) ([]ListLibrariesRow, error) } const ListMediaItems = `-- name: ListMediaItems :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -1826,15 +1297,6 @@ type ListMediaItemsRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -1869,15 +1331,6 @@ func (q *Queries) ListMediaItems(ctx context.Context, arg ListMediaItemsParams) &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -1895,7 +1348,7 @@ func (q *Queries) ListMediaItems(ctx context.Context, arg ListMediaItemsParams) } const ListMediaItemsByLibrary = `-- name: ListMediaItemsByLibrary :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -1921,15 +1374,6 @@ type ListMediaItemsByLibraryRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -1964,15 +1408,6 @@ func (q *Queries) ListMediaItemsByLibrary(ctx context.Context, libraryID pgtype. &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -1990,7 +1425,7 @@ func (q *Queries) ListMediaItemsByLibrary(ctx context.Context, libraryID pgtype. } const ListMediaItemsFiltered = `-- name: ListMediaItemsFiltered :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -2066,15 +1501,6 @@ type ListMediaItemsFilteredRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -2122,15 +1548,6 @@ func (q *Queries) ListMediaItemsFiltered(ctx context.Context, arg ListMediaItems &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -2148,7 +1565,7 @@ func (q *Queries) ListMediaItemsFiltered(ctx context.Context, arg ListMediaItems } const ListMediaItemsSorted = `-- name: ListMediaItemsSorted :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -2247,15 +1664,6 @@ type ListMediaItemsSortedRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -2295,15 +1703,6 @@ func (q *Queries) ListMediaItemsSorted(ctx context.Context, arg ListMediaItemsSo &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -2385,7 +1784,8 @@ func (q *Queries) RevokeRefreshToken(ctx context.Context, token string) error { } const SearchMediaItems = `-- name: SearchMediaItems :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name + +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -2435,15 +1835,6 @@ type SearchMediaItemsRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -2451,6 +1842,8 @@ type SearchMediaItemsRow struct { LibraryTypeName string `db:"library_type_name" json:"library_type_name"` } +// Note: User ebook folders replaced by library folders system +// Legacy folder management is now handled through libraries // Search Media Items queries func (q *Queries) SearchMediaItems(ctx context.Context, arg SearchMediaItemsParams) ([]SearchMediaItemsRow, error) { rows, err := q.db.Query(ctx, SearchMediaItems, @@ -2484,15 +1877,6 @@ func (q *Queries) SearchMediaItems(ctx context.Context, arg SearchMediaItemsPara &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -2510,7 +1894,7 @@ func (q *Queries) SearchMediaItems(ctx context.Context, arg SearchMediaItemsPara } const SearchMediaItemsFuzzy = `-- name: SearchMediaItemsFuzzy :many -SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.language, mi.edition, mi.page_count, mi.goodreads_id, mi.openlibrary_id, mi.google_books_id, mi.copyright_year, mi.genre, mi.subjects, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name +SELECT mi.id, mi.library_id, mi.title, mi.author, mi.isbn, mi.description, mi.file_path, mi.file_size, mi.mime_type, mi.cover_image_path, mi.series, mi.series_number, mi.tags, mi.asin, mi.date_published, mi.publisher, mi.contributors, mi.added_by_admin_id, mi.created_at, mi.updated_at, l.name as library_name, lt.name as library_type_name FROM media_items mi JOIN libraries l ON mi.library_id = l.id JOIN library_types lt ON l.library_type_id = lt.id @@ -2537,7 +1921,7 @@ LIMIT $4 OFFSET $3 type SearchMediaItemsFuzzyParams struct { UserID pgtype.UUID `db:"user_id" json:"user_id"` - SearchQuery pgtype.Text `db:"search_query" json:"search_query"` + SearchQuery interface{} `db:"search_query" json:"search_query"` Offset pgtype.Int4 `db:"offset" json:"offset"` Limit pgtype.Int4 `db:"limit" json:"limit"` } @@ -2560,15 +1944,6 @@ type SearchMediaItemsFuzzyRow struct { DatePublished pgtype.Date `db:"date_published" json:"date_published"` Publisher pgtype.Text `db:"publisher" json:"publisher"` Contributors pgtype.Text `db:"contributors" json:"contributors"` - Language pgtype.Text `db:"language" json:"language"` - Edition pgtype.Text `db:"edition" json:"edition"` - PageCount pgtype.Int4 `db:"page_count" json:"page_count"` - GoodreadsID pgtype.Text `db:"goodreads_id" json:"goodreads_id"` - OpenlibraryID pgtype.Text `db:"openlibrary_id" json:"openlibrary_id"` - GoogleBooksID pgtype.Text `db:"google_books_id" json:"google_books_id"` - CopyrightYear pgtype.Int4 `db:"copyright_year" json:"copyright_year"` - Genre pgtype.Text `db:"genre" json:"genre"` - Subjects []string `db:"subjects" json:"subjects"` AddedByAdminID pgtype.UUID `db:"added_by_admin_id" json:"added_by_admin_id"` CreatedAt pgtype.Timestamptz `db:"created_at" json:"created_at"` UpdatedAt pgtype.Timestamptz `db:"updated_at" json:"updated_at"` @@ -2608,15 +1983,6 @@ func (q *Queries) SearchMediaItemsFuzzy(ctx context.Context, arg SearchMediaItem &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, @@ -2664,138 +2030,6 @@ func (q *Queries) SetLibraryVisibility(ctx context.Context, arg SetLibraryVisibi return i, err } -const UpdateEbook = `-- name: UpdateEbook :one -UPDATE media_items SET - title = $2, - author = $3, - isbn = normalize_isbn($4), - description = $5, - cover_image_path = $6, - series = $7, - series_number = $8, - tags = $9, - asin = $10, - date_published = $11, - publisher = $12, - contributors = $13, - updated_at = NOW() -WHERE id = $1 -RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at -` - -type UpdateEbookParams struct { - ID pgtype.UUID `db:"id" json:"id"` - Title string `db:"title" json:"title"` - Author pgtype.Text `db:"author" json:"author"` - Isbn string `db:"isbn" json:"isbn"` - Description pgtype.Text `db:"description" json:"description"` - CoverImagePath pgtype.Text `db:"cover_image_path" json:"cover_image_path"` - Series pgtype.Text `db:"series" json:"series"` - SeriesNumber pgtype.Int4 `db:"series_number" json:"series_number"` - Tags pgtype.Text `db:"tags" json:"tags"` - Asin pgtype.Text `db:"asin" json:"asin"` - DatePublished pgtype.Date `db:"date_published" json:"date_published"` - Publisher pgtype.Text `db:"publisher" json:"publisher"` - Contributors pgtype.Text `db:"contributors" json:"contributors"` -} - -func (q *Queries) UpdateEbook(ctx context.Context, arg UpdateEbookParams) (MediaItems, error) { - row := q.db.QueryRow(ctx, UpdateEbook, - arg.ID, - arg.Title, - arg.Author, - arg.Isbn, - arg.Description, - arg.CoverImagePath, - arg.Series, - arg.SeriesNumber, - arg.Tags, - arg.Asin, - arg.DatePublished, - arg.Publisher, - arg.Contributors, - ) - var i MediaItems - err := row.Scan( - &i.ID, - &i.LibraryID, - &i.Title, - &i.Author, - &i.Isbn, - &i.Description, - &i.FilePath, - &i.FileSize, - &i.MimeType, - &i.CoverImagePath, - &i.Series, - &i.SeriesNumber, - &i.Tags, - &i.Asin, - &i.DatePublished, - &i.Publisher, - &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, - &i.AddedByAdminID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const UpdateEbookHighlight = `-- name: UpdateEbookHighlight :one -UPDATE media_highlights SET - selection_text = $2, - start_position = $3, - end_position = $4, - color = $5, - note_id = $6, - updated_at = NOW() -WHERE id = $1 -RETURNING id, media_item_id, user_id, selection_text, start_position, end_position, color, note_id, created_at, updated_at -` - -type UpdateEbookHighlightParams struct { - ID pgtype.UUID `db:"id" json:"id"` - SelectionText string `db:"selection_text" json:"selection_text"` - StartPosition pgtype.Text `db:"start_position" json:"start_position"` - EndPosition pgtype.Text `db:"end_position" json:"end_position"` - Color pgtype.Text `db:"color" json:"color"` - NoteID pgtype.UUID `db:"note_id" json:"note_id"` -} - -func (q *Queries) UpdateEbookHighlight(ctx context.Context, arg UpdateEbookHighlightParams) (MediaHighlights, error) { - row := q.db.QueryRow(ctx, UpdateEbookHighlight, - arg.ID, - arg.SelectionText, - arg.StartPosition, - arg.EndPosition, - arg.Color, - arg.NoteID, - ) - var i MediaHighlights - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.SelectionText, - &i.StartPosition, - &i.EndPosition, - &i.Color, - &i.NoteID, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - const UpdateEbookNote = `-- name: UpdateEbookNote :one UPDATE media_notes SET content = $2, @@ -2826,34 +2060,6 @@ func (q *Queries) UpdateEbookNote(ctx context.Context, arg UpdateEbookNoteParams return i, err } -const UpdateEbookRating = `-- name: UpdateEbookRating :one -UPDATE media_ratings SET - rating = $3, - updated_at = NOW() -WHERE media_item_id = $1 AND user_id = $2 -RETURNING id, media_item_id, user_id, rating, created_at, updated_at -` - -type UpdateEbookRatingParams struct { - MediaItemID pgtype.UUID `db:"media_item_id" json:"media_item_id"` - UserID pgtype.UUID `db:"user_id" json:"user_id"` - Rating int32 `db:"rating" json:"rating"` -} - -func (q *Queries) UpdateEbookRating(ctx context.Context, arg UpdateEbookRatingParams) (MediaRatings, error) { - row := q.db.QueryRow(ctx, UpdateEbookRating, arg.MediaItemID, arg.UserID, arg.Rating) - var i MediaRatings - err := row.Scan( - &i.ID, - &i.MediaItemID, - &i.UserID, - &i.Rating, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - const UpdateEmail = `-- name: UpdateEmail :exec UPDATE users SET email = $2, updated_at = NOW() WHERE id = $1 ` @@ -2948,7 +2154,7 @@ const UpdateMediaItem = `-- name: UpdateMediaItem :one UPDATE media_items SET title = $2, author = $3, - isbn = normalize_isbn($4), + isbn = $4, description = $5, cover_image_path = $6, series = $7, @@ -2960,14 +2166,14 @@ UPDATE media_items SET contributors = $13, updated_at = NOW() WHERE id = $1 -RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, language, edition, page_count, goodreads_id, openlibrary_id, google_books_id, copyright_year, genre, subjects, added_by_admin_id, created_at, updated_at +RETURNING id, library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id, created_at, updated_at ` type UpdateMediaItemParams struct { ID pgtype.UUID `db:"id" json:"id"` Title string `db:"title" json:"title"` Author pgtype.Text `db:"author" json:"author"` - Isbn string `db:"isbn" json:"isbn"` + Isbn pgtype.Text `db:"isbn" json:"isbn"` Description pgtype.Text `db:"description" json:"description"` CoverImagePath pgtype.Text `db:"cover_image_path" json:"cover_image_path"` Series pgtype.Text `db:"series" json:"series"` @@ -3014,15 +2220,6 @@ func (q *Queries) UpdateMediaItem(ctx context.Context, arg UpdateMediaItemParams &i.DatePublished, &i.Publisher, &i.Contributors, - &i.Language, - &i.Edition, - &i.PageCount, - &i.GoodreadsID, - &i.OpenlibraryID, - &i.GoogleBooksID, - &i.CopyrightYear, - &i.Genre, - &i.Subjects, &i.AddedByAdminID, &i.CreatedAt, &i.UpdatedAt, diff --git a/internal/database/queries/queries.sql b/internal/database/queries/queries.sql index 335c4ee..b46396e 100644 --- a/internal/database/queries/queries.sql +++ b/internal/database/queries/queries.sql @@ -73,6 +73,11 @@ SELECT * FROM library_folders WHERE library_id = $1 ORDER BY created_at; -- name: DeleteLibraryFolder :one DELETE FROM library_folders WHERE library_id = $1 AND folder_path = $2 RETURNING *; +-- name: GetLibraryByFolder :one +SELECT lf.library_id, l.* FROM library_folders lf +JOIN libraries l ON lf.library_id = l.id +WHERE lf.folder_path = $1; + -- Library Visibility queries -- name: SetLibraryVisibility :one INSERT INTO library_visibility (user_id, library_id, is_visible) @@ -98,7 +103,7 @@ ORDER BY l.created_at DESC; -- Media Items queries -- name: CreateMediaItem :one INSERT INTO media_items (library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, asin, date_published, publisher, contributors, added_by_admin_id) -VALUES ($1, $2, $3, normalize_isbn($4), $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) +VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING *; -- name: GetMediaItem :one @@ -241,7 +246,7 @@ LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); UPDATE media_items SET title = $2, author = $3, - isbn = normalize_isbn($4), + isbn = $4, description = $5, cover_image_path = $6, series = $7, @@ -471,50 +476,4 @@ UPDATE refresh_tokens SET revoked_at = NOW() WHERE user_id = $1 AND revoked_at I -- name: CleanupExpiredRefreshTokens :exec DELETE FROM refresh_tokens WHERE expires_at < NOW() OR (revoked_at IS NOT NULL AND revoked_at < NOW() - INTERVAL '7 days'); --- Media Items Admin Operations --- name: CreateMediaItem :one -INSERT INTO media_items ( - library_id, title, author, isbn, description, file_path, file_size, - mime_type, cover_image_path, series, series_number, tags, asin, - date_published, publisher, contributors, language, edition, page_count, - goodreads_id, openlibrary_id, google_books_id, copyright_year, - genre, subjects, added_by_admin_id -) -VALUES ( - $1, $2, $3, normalize_isbn($4), $5, $6, $7, - $8, $9, $10, $11, $12, $13, - $14, $15, $16, $17, $18, $19, - $20, $21, $22, $23, - $24, $25, $26 -) -RETURNING id; - --- name: UpdateMediaItem :one -UPDATE media_items SET - title = $2, - author = $3, - isbn = normalize_isbn($4), - description = $5, - cover_image_path = $6, - series = $7, - series_number = $8, - tags = $9, - asin = $10, - date_published = $11, - publisher = $12, - contributors = $13, - language = $14, - edition = $15, - page_count = $16, - goodreads_id = $17, - openlibrary_id = $18, - google_books_id = $19, - copyright_year = $20, - genre = $21, - subjects = $22, - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: DeleteMediaItem :exec -DELETE FROM media_items WHERE id = $1; \ No newline at end of file +-- Media Items Admin Operations \ No newline at end of file