fix: use subquery for total_volumes to avoid GROUP BY returning 0 rows

GROUP BY sm.total_volumes caused fetch_one to fail when no books matched,
silently skipping all series. COUNT(*) without GROUP BY always returns 1 row.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 17:40:56 +01:00
parent fd0f57824d
commit b61ab45fb4

View File

@@ -380,6 +380,14 @@ pub async fn link_series(
} }
}; };
// Auto-enable reading_status_provider on the library when linking a series
let _ = sqlx::query(
"UPDATE libraries SET reading_status_provider = 'anilist' WHERE id = $1 AND reading_status_provider IS NULL",
)
.bind(library_id)
.execute(&state.pool)
.await;
let row = sqlx::query( let row = sqlx::query(
r#" r#"
INSERT INTO anilist_series_links (library_id, series_name, provider, anilist_id, anilist_title, anilist_url, status, linked_at) INSERT INTO anilist_series_links (library_id, series_name, provider, anilist_id, anilist_title, anilist_url, status, linked_at)
@@ -576,12 +584,10 @@ pub async fn preview_sync(
SELECT SELECT
COUNT(*) as book_count, COUNT(*) as book_count,
COUNT(brp.book_id) FILTER (WHERE brp.status = 'read') as books_read, COUNT(brp.book_id) FILTER (WHERE brp.status = 'read') as books_read,
sm.total_volumes (SELECT sm.total_volumes FROM series_metadata sm WHERE sm.library_id = $1 AND sm.series_name = $2 LIMIT 1) as total_volumes
FROM books b FROM books b
LEFT JOIN book_reading_progress brp ON brp.book_id = b.id AND brp.user_id = $3 LEFT JOIN book_reading_progress brp ON brp.book_id = b.id AND brp.user_id = $3
LEFT JOIN series_metadata sm ON sm.library_id = $1 AND sm.series_name = $2
WHERE b.library_id = $1 AND COALESCE(NULLIF(b.series, ''), 'unclassified') = $2 WHERE b.library_id = $1 AND COALESCE(NULLIF(b.series, ''), 'unclassified') = $2
GROUP BY sm.total_volumes
"#, "#,
) )
.bind(library_id) .bind(library_id)
@@ -686,12 +692,10 @@ pub async fn sync_to_anilist(
SELECT SELECT
COUNT(*) as book_count, COUNT(*) as book_count,
COUNT(brp.book_id) FILTER (WHERE brp.status = 'read') as books_read, COUNT(brp.book_id) FILTER (WHERE brp.status = 'read') as books_read,
sm.total_volumes (SELECT sm.total_volumes FROM series_metadata sm WHERE sm.library_id = $1 AND sm.series_name = $2 LIMIT 1) as total_volumes
FROM books b FROM books b
LEFT JOIN book_reading_progress brp ON brp.book_id = b.id AND brp.user_id = $3 LEFT JOIN book_reading_progress brp ON brp.book_id = b.id AND brp.user_id = $3
LEFT JOIN series_metadata sm ON sm.library_id = $1 AND sm.series_name = $2
WHERE b.library_id = $1 AND COALESCE(NULLIF(b.series, ''), 'unclassified') = $2 WHERE b.library_id = $1 AND COALESCE(NULLIF(b.series, ''), 'unclassified') = $2
GROUP BY sm.total_volumes
"#, "#,
) )
.bind(library_id) .bind(library_id)