fix: normalize series status casing to avoid duplicates
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 6s

- LOWER() all series_metadata.status values in the statuses endpoint
  to prevent "One shot" / "one shot" appearing as separate targets
- Migration 0040: lowercase all existing status values in DB
- Use LOWER() in series status filter queries for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-19 12:56:02 +01:00
parent e8768dfad7
commit 9cec32ba3e
2 changed files with 8 additions and 3 deletions

View File

@@ -398,7 +398,7 @@ pub async fn list_series(
} else { String::new() };
let ss_cond = if query.series_status.is_some() {
p += 1; format!("AND sm.status = ${p}")
p += 1; format!("AND LOWER(sm.status) = ${p}")
} else { String::new() };
let missing_cond = if has_missing {
@@ -655,7 +655,7 @@ pub async fn list_all_series(
} else { String::new() };
let ss_cond = if query.series_status.is_some() {
p += 1; format!("AND sm.status = ${p}")
p += 1; format!("AND LOWER(sm.status) = ${p}")
} else { String::new() };
let missing_cond = if has_missing {
@@ -868,7 +868,7 @@ pub async fn series_statuses(
) -> Result<Json<Vec<String>>, ApiError> {
let rows: Vec<String> = sqlx::query_scalar(
r#"SELECT DISTINCT s FROM (
SELECT status AS s FROM series_metadata WHERE status IS NOT NULL
SELECT LOWER(status) AS s FROM series_metadata WHERE status IS NOT NULL
UNION
SELECT mapped_status AS s FROM status_mappings
) t ORDER BY s"#,

View File

@@ -0,0 +1,5 @@
-- Normalize all series_metadata.status values to lowercase for consistency.
-- This fixes case mismatches like "One shot" vs "one shot".
UPDATE series_metadata
SET status = LOWER(status), updated_at = NOW()
WHERE status IS NOT NULL AND status != LOWER(status);