fix(importer): stabilize 9 selected OVH re-import defects (epic #1260) (#1288)

Commit: 438955aa3f1fa7ca2fba1d1f31f772862c4ebb49
Date: 2026-05-13 11:47:35 +0200
Author: Copilot

Commit Message

fix(importer): stabilize 9 selected OVH re-import defects (epic #1260) (#1288)

* Initial plan

* feat(importer): implement stories #1261–#1269 (OVH legacy re-import fixes)

Story #1261 – Normalize artist lookup and duplicate retry
- sanitizeAllStrings + 255-char slice for sanitizedName in ArtistHelper
- findArtistByName retry in catch block after BC lookup fails

Story #1262 – Complete image-sync summaries
- syncTable(): start/completed INFO logs per table
- run(): Completed image sync summary log after tables loop

Story #1263 – MariaDB-compatible transaction control
- DatabaseConnection type: beginTransaction/commit/rollback
- deleteProjectsWithoutItems uses native tx methods
- ResilientConnection: added beginTransaction/commit/rollback methods

Story #1264 – Map Explore monument museum country from actual legacy column
- exploremonument_museums query: country AS museum_country alias

Story #1265 – Map Explore itinerary cross-schema links from actual mwnf3 columns
- LegacyCrossSchemaLink: project_id, institution_id fields
- Query includes project_id, institution_id; BC and links updated

Story #1266 – Key-based idempotency for THG Gallery Lang
- getCollectionTranslationByKey check after buildExtra()
- setCollectionTranslationExtraByKey for extra merge on update

Story #1267 – Classify expected THG Gallery Content gaps without hard errors
- logo/partner/country/type failures are warnings+skip not errors
- URL extension-based content type inference
- basename title fallback; resolveCountryId returns string|null

Story #1268 – Normalize object item date years before writing smallint columns
- parseItemYear() export with range/format validation
- TransformedObject.warnings[]; TransformedExploreMonument.warnings[]
- object-importer.ts: iterate warnings array

Story #1269 – Resolve Explore monument candidates by source
- ResolutionMode: 'resolvedCandidates' replaces 'ambiguous'
- ExploreMonumentResolution.resolvedCandidates optional array
- resolveForSource() method on ExploreMonumentResolver
- All six phase-06 importers updated for resolvedCandidates/resolveForSource

Tests: 304/304 pass; lint clean; type-check clean

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: metanull <20630081+metanull@users.noreply.github.com>

* fix: make ImportResult.warnings non-optional, remove ! assertions, address code review findings

Agent-Logs-Url: https://github.com/metanull/inventory-app/sessions/35dac83d-0c8c-4bc0-8b4f-8be00a4775ed

Co-authored-by: metanull <20630081+metanull@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: metanull <20630081+metanull@users.noreply.github.com>
Co-authored-by: PascalHavelange <havelangep@gmail.com>

---------

Fixes #1261
Fixes #1262
Fixes #1263
Fixes #1264
Fixes #1265
Fixes #1266
Fixes #1267
Fixes #1268
Fixes #1269

Files Changed


This documentation was automatically generated from Git commit data.