From dd81dc08a21b00cde49cab38b8d2a92265f0e332 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 29 Mar 2026 21:12:20 -0400 Subject: [PATCH] db: update SQL queries and regenerate models for comic metadata Phase 1 implementation: Update CreateMediaItem query to support 14 new comic metadata fields. Changes: - Add 14 new columns to CreateMediaItem INSERT statement - Regenerate sqlc models with new fields - CommunityRating now maps to pgtype.Float8 (was pgtype.Numeric) - All new comic and universal metadata fields included New fields supported: - Reading direction: manga_type, reading_direction - Universal: series_count, volume, imprint, age_rating, web_url - Comic-specific: story_arc, is_black_and_white, metadata_notes, community_rating, alternate_info, scan_information, summary Generated models verified: - MediaItems struct includes all 14 new fields - CreateMediaItemParams has correct parameter count (42 total) - CommunityRating is pgtype.Float8 (not pgtype.Numeric) Relates to: Phase 4.1-4.2 database layer implementation --- internal/database/models.go | 4 ++-- internal/database/queries.sql.go | 12 ++++++------ internal/database/queries/queries.sql | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/database/models.go b/internal/database/models.go index 3d06671..c78efd4 100644 --- a/internal/database/models.go +++ b/internal/database/models.go @@ -246,8 +246,8 @@ type MediaItems struct { IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` // Notes from metadata files (ComicInfo.xml, EPUB, PDF) - distinct from user notes in media_notes table MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - // Pre-existing community rating from metadata files (scale 0.0-10.0) - distinct from user ratings in media_ratings table - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + // Pre-existing community rating from metadata files (scale 0.0-10.0, DOUBLE PRECISION) - distinct from user ratings in media_ratings table + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` // Alternate series information as JSONB: {alternate_series, alternate_number, alternate_count} AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` // Scan information from ComicInfo.xml (scanner group, resolution, etc.) diff --git a/internal/database/queries.sql.go b/internal/database/queries.sql.go index f047024..da266c9 100644 --- a/internal/database/queries.sql.go +++ b/internal/database/queries.sql.go @@ -593,7 +593,7 @@ type CreateMediaItemParams struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` @@ -1856,7 +1856,7 @@ type GetCollectionItemsForDashboardRow struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` @@ -6160,7 +6160,7 @@ type ListMediaItemsRow struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` @@ -6313,7 +6313,7 @@ type ListMediaItemsByLibraryRow struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` @@ -6539,7 +6539,7 @@ type ListMediaItemsSortedRow struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` @@ -7453,7 +7453,7 @@ type SearchMediaItemsRow struct { StoryArc pgtype.Text `db:"story_arc" json:"story_arc"` IsBlackAndWhite pgtype.Bool `db:"is_black_and_white" json:"is_black_and_white"` MetadataNotes pgtype.Text `db:"metadata_notes" json:"metadata_notes"` - CommunityRating pgtype.Numeric `db:"community_rating" json:"community_rating"` + CommunityRating pgtype.Float8 `db:"community_rating" json:"community_rating"` AlternateInfo []byte `db:"alternate_info" json:"alternate_info"` ScanInformation pgtype.Text `db:"scan_information" json:"scan_information"` Summary pgtype.Text `db:"summary" json:"summary"` diff --git a/internal/database/queries/queries.sql b/internal/database/queries/queries.sql index 20cf711..8e8c773 100644 --- a/internal/database/queries/queries.sql +++ b/internal/database/queries/queries.sql @@ -128,8 +128,8 @@ ORDER BY l.created_at ASC; -- 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, tags_search, asin, date_published, publisher, contributors, contributors_search, language, edition, page_count, genre, copyright_year, goodreads_id, openlibrary_id, google_books_id, added_by_admin_id, created_at) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28) +INSERT INTO media_items (library_id, title, author, isbn, description, file_path, file_size, mime_type, cover_image_path, series, series_number, tags, tags_search, asin, date_published, publisher, contributors, contributors_search, language, edition, page_count, genre, copyright_year, goodreads_id, openlibrary_id, google_books_id, added_by_admin_id, created_at, manga_type, reading_direction, series_count, volume, imprint, age_rating, web_url, story_arc, is_black_and_white, metadata_notes, community_rating, alternate_info, scan_information, summary) +VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42) RETURNING *; -- name: GetMediaItem :one