ia_dev/projects/lecoffreio/docs/import-v1-schema-and-scripts-analysis.md
Nicolas Cantu 61cec6f430 Sync ia_dev: token resolution via .secrets/<env>/ia_token, doc updates
**Motivations:**
- Align master with current codebase (token from projects/<id>/.secrets/<env>/ia_token)
- Id resolution by mail To or by API token; no slug

**Root causes:**
- Token moved from conf.json to .secrets/<env>/ia_token; env from directory name

**Correctifs:**
- Server and scripts resolve project+env by scanning all projects and envs

**Evolutions:**
- tickets-fetch-inbox routes by To address; notary-ai agents and API doc updated

**Pages affectées:**
- ai_working_help/server.js, docs, project_config.py, lib/project_config.sh
- projects/README.md, lecoffreio/docs/API.md, gitea-issues/tickets-fetch-inbox.py
2026-03-16 15:00:23 +01:00

5.5 KiB
Raw Permalink Blame History

Analyse schémas V1 / V2 et scripts d'import

Sources

  • Schéma V1 : docs/v1-schema.sql (export pg_dump --schema-only depuis prod, base V1, lecture seule).
  • Schéma V2 : deploy/scripts_v2/schema-v2-initial.sql (ou Prisma lecoffre-back-main/prisma/schema.prisma).
  • Script import : deploy/scripts_v2/remote/import-v1-data-direct-into-v2.sh (mode merge).

1. Tables traitées par l'import

  • Source de la liste : requête sur la base V1 information_schema.tables (schema public, BASE TABLE), tri par nom.
  • Exclusions : _prisma_migrations, system_configuration, document_anchors, document_notary_anchors, office_folder_anchors.
  • Cohérence : document_anchors et document_notary_anchors n'existent pas en V1 (tables V2 uniquement) ; les exclure évite toute référence. office_folder_anchors existe en V1 mais est exclu volontairement pour ne pas écraser les ancres V2.

2. Ordre de merge et dépendances FK (V1)

L'ordre est déterminé par sort_tables_by_dependencies à partir des FK de la base cible (V2). Les dépendances pertinentes côté V1 (schéma) :

  • addresses : référencé par contacts, offices.
  • offices : référencé par customers, deed_types, document_types, office_folders, office_roles, subscriptions, users.
  • contacts : référencé par customers, users.

Donc un ordre cohérent doit avoir : addresses → puis offices et contacts (après addresses) → puis customers, users, office_folders, etc. Le tri topologique du script assure cet ordre.

3. Filtre date (import-v1-last-ok) et cohérence FK

Quand IMPORT_V1_LAST_OK_SINCE est défini, seules les tables non listées dans le case reçoivent un filtre WHERE (created_at|updated_at) > since. Les tables listées sont mergées en totalité (sans filtre).

Règle : toute table référencée par une table sans filtre doit elle-même être sans filtre, sinon risque de violation FK (ligne importée référence un parent exclu par la date).

  • addresses : parent de contacts et offices. Si addresses est filtrée et pas contacts/offices → FK contacts_address_uid_fkey ou offices_address_uid_fkey peut casser. → addresses ajoutée à la liste sans filtre.
  • offices : parent de customers, office_folders, deed_types, document_types, office_roles, users, subscriptions. Si offices est filtrée et pas ces tables → FK multiples. → offices ajoutée à la liste sans filtre.
  • contacts : déjà en liste sans filtre (customers.contact_uid_fkey).

Correctif appliqué : dans le script, la liste des tables sans filtre date inclut désormais addresses, offices, puis users, subscriptions, notifications, appointments (référencés par appointments, documents_notary, seats, user_notifications, votes), en plus de contacts|deed_types|....

4. Colonnes différentes V1 / V2

  • Le script utilise lintersection des colonnes entre la base temporaire (V1) et la cible (V2). Seules les colonnes présentes des deux côtés sont exportées/importées.
  • offices en V2 a des colonnes supplémentaires (rib_encrypted, office_encryption_key, rib_anchor_*, etc.) ; elles ne sont pas dans V1, donc non exportées → pas dimpact, les lignes V1 sont insérées avec les colonnes communes.
  • Aucune incohérence bloquante identifiée : pas de colonne obligatoire en V2 absente en V1 pour les tables merge (les colonnes V2-only restent à défaut ou NULL selon le schéma).

5. Résumé des incohérences corrigées

Problème Correction
contacts filtré par date alors que customers non → FK contact_uid contacts mis dans la liste sans filtre (déjà fait).
addresses filtré alors que contacts et offices non → FK address_uid addresses ajouté à la liste sans filtre.
offices filtré alors que customers, office_folders, etc. non → FK office_uid offices ajouté à la liste sans filtre.
deed filtré (nom script: deeds) alors que _DeedHasDocumentTypes, office_folders le référencent → FK _DeedHasDocumentTypes_A_fkey Liste sans filtre: "deeds" corrigé en "deed" (nom table V1).
users, subscriptions, notifications, appointments filtrés alors que appointments, seats, user_notifications, votes les référencent → FK users, subscriptions, notifications, appointments ajoutés à la liste sans filtre.

6. V1 nest jamais modifiée

Le script dimport ne fait que lire la base V1 (SELECT, COPY TO STDOUT, pg_dump). Aucun INSERT, UPDATE, DELETE, TRUNCATE ni DDL nest exécuté contre V1. Toutes les écritures ciblent la base V2 ou une base temporaire locale. Voir len-tête du script : # CRITICAL: V1 is READ-ONLY. Never modify V1.

7. Vérifications recommandées (côté V2 / import)

  • Après tout ajout de colonnes NOT NULL sans défaut ou de nouvelles FK vers des tables importées : revoir lordre de merge et la liste des tables sans filtre date (côté script dimport et schéma V2). Cela ne modifie pas V1.
  • Si de nouvelles tables « parent » sont soumises au filtre date alors que des tables enfants sont sans filtre : les ajouter à la liste sans filtre (comme pour addresses/offices/contacts).
  • Synchro au login (V1ToV2MergeHelper) : alignée sur limport du déploiement (--import-v1) — même règle (tables parentes sans filtre date). MERGE_TABLES_WITHOUT_DATE_FILTER = offices, deed, office_folders (sous-ensemble des tables mergées au login). Ne pas modifier le script dimport du déploiement.