From f847cc1d22c95daa81b0f26b40865c936d5cd084 Mon Sep 17 00:00:00 2001 From: neon <18559658+neonsolstice@users.noreply.github.com> Date: Tue, 24 Mar 2026 09:23:01 -0600 Subject: [PATCH] fix(metadata): use per-provider keys and extract relevance scoring - replace shared 'providerId' key in pickedSources with provider-specific field names (googleBooksId, goodreadsId, etc.) so each provider's ID pick is independent and not overwritten when switching tabs - extract candidate relevance scoring into candidate-relevance.ts with Levenshtein-based title/author scoring, ISBN exact match, and junk title filtering; remove duplicate inline scoring from goodreads provider --- .../components/__tests__/DetailsTab.spec.ts | 14 +- .../detail/tabs/MetadataDiffPanel.vue | 213 ++++++++++---- .../detail/tabs/MetadataDiffRow.vue | 192 ++++++++++--- .../detail/tabs/MetadataResultCard.vue | 9 +- .../detail/tabs/MetadataSearchDrawer.vue | 24 +- .../detail/tabs/MetadataSearchPanel.vue | 7 +- .../__tests__/useMetadataDiff.spec.ts | 172 ++++++++++++ .../book/composables/useMetadataDiff.ts | 261 ++++++++++++++---- client/typecheck-baseline.txt | 34 ++- server/package.json | 11 +- .../book/dto/update-book-metadata.dto.ts | 4 +- .../candidate-relevance.test.ts | 110 ++++++++ .../metadata-fetch/candidate-relevance.ts | 97 +++++++ .../metadata-fetch.service.test.ts | 32 ++- .../metadata-fetch/metadata-fetch.service.ts | 5 +- .../goodreads/goodreads.provider.test.ts | 41 --- .../providers/goodreads/goodreads.provider.ts | 46 --- .../hardcover/hardcover.client.test.ts | 59 ++++ .../providers/hardcover/hardcover.client.ts | 2 +- .../modules/metadata/metadata.module.test.ts | 3 +- 20 files changed, 1054 insertions(+), 282 deletions(-) create mode 100644 client/src/features/book/composables/__tests__/useMetadataDiff.spec.ts create mode 100644 server/src/modules/metadata-fetch/candidate-relevance.test.ts create mode 100644 server/src/modules/metadata-fetch/candidate-relevance.ts create mode 100644 server/src/modules/metadata-fetch/providers/hardcover/hardcover.client.test.ts diff --git a/client/src/features/book/components/__tests__/DetailsTab.spec.ts b/client/src/features/book/components/__tests__/DetailsTab.spec.ts index 3c57208bb..a8a21e272 100644 --- a/client/src/features/book/components/__tests__/DetailsTab.spec.ts +++ b/client/src/features/book/components/__tests__/DetailsTab.spec.ts @@ -1,5 +1,16 @@ import { mount } from '@vue/test-utils' -import { describe, it, expect, vi } from 'vitest' +import { describe, it, expect, vi, beforeEach } from 'vitest' + +beforeEach(() => { + vi.stubGlobal( + 'ResizeObserver', + class { + observe() {} + unobserve() {} + disconnect() {} + }, + ) +}) import DetailsTab from '../detail/tabs/DetailsTab.vue' import type { BookDetail } from '@projectx/types' @@ -78,6 +89,7 @@ function makeBook(overrides: Partial = {}): BookDetail { abridged: false, chapters: null, formatPriority: [], + comicMetadata: null, ...overrides, } } diff --git a/client/src/features/book/components/detail/tabs/MetadataDiffPanel.vue b/client/src/features/book/components/detail/tabs/MetadataDiffPanel.vue index 9bce28cfe..34281927a 100644 --- a/client/src/features/book/components/detail/tabs/MetadataDiffPanel.vue +++ b/client/src/features/book/components/detail/tabs/MetadataDiffPanel.vue @@ -1,19 +1,20 @@