feat(db): reconciliatie fase 1 — expand-schema, migraties en backfill #64

Merged
janpeter merged 2 commits from feat/reconcile-fase1 into main 2026-07-30 00:39:45 +02:00
Owner

Fase 1 van het GO-beoordeelde migratie-ontwerp (PR #63, docs-branch).

  • Expand-migratie: Asset-feiten (media_type/ext/image_hash/filesize), AssetState, AssetSource, ImmichAsset, ImmichPersonAsset_v2, album_id/asset_id FKs
  • Constraints-migratie: NOT NULL-aanscherpingen + FK ImmichDuplicateAsset→ImmichAsset (fail-closed als backfill incompleet; draait in onderhoudswindow samen met fase-2-code, ontwerp §6)
  • scripts/reconcile-backfill.ts: 7 idempotente gebatchede stappen + 10 relationele gates

Validatie: prisma generate + build groen; 302/302 tests tegen testdb met productieschema + expand; backfill+constraints+gates groen op geseede testdb; herun idempotent.

Fase 1 van het GO-beoordeelde migratie-ontwerp (PR #63, docs-branch). - Expand-migratie: Asset-feiten (media_type/ext/image_hash/filesize), AssetState, AssetSource, ImmichAsset, ImmichPersonAsset_v2, album_id/asset_id FKs - Constraints-migratie: NOT NULL-aanscherpingen + FK ImmichDuplicateAsset→ImmichAsset (fail-closed als backfill incompleet; draait in onderhoudswindow samen met fase-2-code, ontwerp §6) - scripts/reconcile-backfill.ts: 7 idempotente gebatchede stappen + 10 relationele gates Validatie: prisma generate + build groen; 302/302 tests tegen testdb met productieschema + expand; backfill+constraints+gates groen op geseede testdb; herun idempotent.
- Asset krijgt media_type/ext/image_hash/filesize (nullable in expand)
- Nieuwe modellen: AssetState, AssetSource, ImmichAsset, ImmichPersonAssetV2
- LibraryImportRoot.album_id en LibraryImportFile.asset_id (FK, SetNull)
- Migratie 2: NOT NULL-aanscherpingen + FK ImmichDuplicateAsset -> ImmichAsset
  (fail-closed als backfill incompleet; draait in onderhoudswindow samen met
  fase-2-code, zie ontwerp par.6)

Gevalideerd: prisma generate + build groen; 302/302 tests tegen lokale
testdb met productieschema + expand-migratie.
feat(db): reconciliatie fase 1 — backfill-script met relationele gates
All checks were successful
CI / docker-build (pull_request) Successful in 3m20s
372a19a33f
scripts/reconcile-backfill.ts (npm run reconcile:backfill):
- 7 idempotente, gebatchede stappen: asset-feiten, asset_state,
  asset_source, import_file.asset_id, import_root.album_id (fail-closed),
  ImmichAsset (unie PersonAsset + DupAsset-only), ImmichPersonAsset_v2
- eindigt met 10 relationele gates, exit != 0 bij breuk

Lokaal gevalideerd tegen testdb met productieschema + synthetische seed
(scripts/seed-reconcile-test.ts): gates groen, steekproefwaarden correct,
herun idempotent (0 nieuwe rijen), constraints-migratie toepasbaar na
backfill, NOT NULL + FK ImmichDuplicateAsset->ImmichAsset afdwingbaar.
s4m-codex-reviewer left a comment

REQUEST_CHANGES

geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • blockingprisma/migrations/20260729010000_reconcile_constraints/migration.sql:1: de PR levert de expand-migratie en de constraints-migratie in dezelfde diff. Bij een normale prisma migrate deploy worden migraties sequentieel zonder handmatige tussenstap toegepast, waardoor ALTER COLUMN ... SET NOT NULL op asset, library_import_file.asset_id en library_import_root.album_id draait voordat scripts/reconcile-backfill.ts kan vullen. Dat breekt het expand-contract stappenplan uit het productdoc en maakt de productie-upgrade fail-closed op het verkeerde moment. Splits de constraints-migratie naar een latere PR/deploystap na bewezen backfill, of pas het deployproces expliciet aan zodat deze migratie niet automatisch met de expand-stap meegaat.

Verdict

REQUEST_CHANGES: er is een blokkerend release-/migratierisico. De backfill zelf volgt grotendeels het reconciliatieplan, maar de migratievolgorde maakt de wijziging niet veilig uitrolbaar.

# REQUEST_CHANGES geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **blocking** — `prisma/migrations/20260729010000_reconcile_constraints/migration.sql:1`: de PR levert de expand-migratie en de constraints-migratie in dezelfde diff. Bij een normale `prisma migrate deploy` worden migraties sequentieel zonder handmatige tussenstap toegepast, waardoor `ALTER COLUMN ... SET NOT NULL` op `asset`, `library_import_file.asset_id` en `library_import_root.album_id` draait voordat `scripts/reconcile-backfill.ts` kan vullen. Dat breekt het expand-contract stappenplan uit het productdoc en maakt de productie-upgrade fail-closed op het verkeerde moment. Splits de constraints-migratie naar een latere PR/deploystap na bewezen backfill, of pas het deployproces expliciet aan zodat deze migratie niet automatisch met de expand-stap meegaat. ## Verdict REQUEST_CHANGES: er is een blokkerend release-/migratierisico. De backfill zelf volgt grotendeels het reconciliatieplan, maar de migratievolgorde maakt de wijziging niet veilig uitrolbaar.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Media-Organizer!64
No description provided.