fonzarely/regine-photos-archiverpublic Fork
⑂ main
Commits
⬇ Clone ▾
git clone https://git.rickub.com/fonzarely/regine-photos-archiver.git
git clone ssh://git@rickub.com/fonzarely/regine-photos-archiver.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
specs 6ad5e0a · on main · Fabien Champigny · Sep 19, 2026
data-model.md · 81 lines · 3.3 KBmarkdown
Blame HistoryOpen raw

Data Model: Checkout et réconciliation d'un dossier de l'archive

Entités dérivées de spec.md § Key Entities et Functional Requirements.

Manifeste (fichier SQLite, un par dossier principal — cf. research.md § 1)

Table fichiers

Champ Type Règles
chemin_relatif texte Relatif à la racine du dossier principal (traverse sous-dossiers de format et sous-dossiers d'étape)
taille entier Octets
hash_fichier_entier texte (SHA-256) Toujours calculé
hash_image_only texte, nullable Calculé uniquement pour DNG/TIFF/JPEG maîtres (cf. Principe I de la constitution)
identifiant_perenne texte Repris du champ XMP xmpMM:DocumentID (specs/001-import-photos)

Table verrou

Champ Type Règles
verrouille bool True entre un checkout et sa réconciliation réussie
identifiant_session texte, nullable Identifie l'instance ayant posé le verrou (pour message d'erreur explicite, pas pour arbitrage distribué)
horodatage horodatage, nullable Date de pose du verrou

Métadonnées du fichier SQLite : PRAGMA user_version (schéma structurel*1000 + additif, cf. research.md § 2), PRAGMA application_id (identifiant Régine).

Objets d'échange (non persistés)

ManifestSnapshot (retour de checkout) : copie en mémoire du contenu du manifeste au moment du checkout, plus le chemin de la copie de travail locale.

ChangementClasse :

Champ Type
chemin Path
categorie énumération : normal | anomalie | deplacement | suppression | nouveau
chemin_ancien Path | None (renseigné si categorie == deplacement)

RapportReconciliation (retour de comparer) :

Champ Type
changements list[ChangementClasse]
anomalies list[ChangementClasse] (sous-ensemble filtré, pour affichage séparé — FR-014)

Relations

Dossier principal (archive) ──1────1── Manifeste (fichiers + verrou)
        │ checkout (FR-001)
        ▼
Copie de travail locale ──(édition libre, aucune contrainte)──▶ Copie de travail modifiée
        │ réconciliation : comparer(Manifeste, Copie de travail modifiée)
        ▼
RapportReconciliation (5 catégories) ──▶ Point avant archive (FR-013) ──▶ confirmation ──▶ archiver()
        │
        ▼
Manifeste mis à jour + verrou levé (FR-016)

État / transitions

[Dossier de l'archive]
   Disponible (verrou=False)
        │ checkout (FR-001/003)
        ▼
   Verrouillé (verrou=True, ManifestSnapshot créé)
        │ édition locale libre (FR-005, archive inchangée)
        │
        │ réconciliation → RapportReconciliation
        │
        ├── changements "normal"/"deplacement"/"suppression confirmée"/"nouveau confirmé" → archivés
        └── "anomalie" → décision explicite (confirmer quand même | restaurer depuis l'archive)
        │
        │ toutes les écritures confirmées effectuées et vérifiées (FR-015)
        ▼
   Disponible (verrou=False, manifeste mis à jour)

Une tentative de checkout pendant l'état Verrouillé est refusée (FR-004) — pas de transition, retour d'erreur explicite.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# Data Model: Checkout et réconciliation d'un dossier de l'archive

Entités dérivées de `spec.md` § Key Entities et Functional Requirements.

## Manifeste (fichier SQLite, un par dossier principal — cf. research.md § 1)

**Table `fichiers`**

| Champ | Type | Règles |
|---|---|---|
| `chemin_relatif` | texte | Relatif à la racine du dossier principal (traverse sous-dossiers de format et sous-dossiers d'étape) |
| `taille` | entier | Octets |
| `hash_fichier_entier` | texte (SHA-256) | Toujours calculé |
| `hash_image_only` | texte, nullable | Calculé uniquement pour DNG/TIFF/JPEG maîtres (cf. Principe I de la constitution) |
| `identifiant_perenne` | texte | Repris du champ XMP `xmpMM:DocumentID` (specs/001-import-photos) |

**Table `verrou`**

| Champ | Type | Règles |
|---|---|---|
| `verrouille` | bool | `True` entre un checkout et sa réconciliation réussie |
| `identifiant_session` | texte, nullable | Identifie l'instance ayant posé le verrou (pour message d'erreur explicite, pas pour arbitrage distribué) |
| `horodatage` | horodatage, nullable | Date de pose du verrou |

**Métadonnées du fichier SQLite** : `PRAGMA user_version` (schéma `structurel*1000 + additif`, cf. research.md § 2), `PRAGMA application_id` (identifiant Régine).

## Objets d'échange (non persistés)

**`ManifestSnapshot`** (retour de `checkout`) : copie en mémoire du contenu du manifeste au moment du checkout, plus le chemin de la copie de travail locale.

**`ChangementClasse`** :

| Champ | Type |
|---|---|
| `chemin` | Path |
| `categorie` | énumération : `normal` \| `anomalie` \| `deplacement` \| `suppression` \| `nouveau` |
| `chemin_ancien` | `Path \| None` (renseigné si `categorie == deplacement`) |

**`RapportReconciliation`** (retour de `comparer`) :

| Champ | Type |
|---|---|
| `changements` | `list[ChangementClasse]` |
| `anomalies` | `list[ChangementClasse]` (sous-ensemble filtré, pour affichage séparé — FR-014) |

## Relations

```text
Dossier principal (archive) ──1────1── Manifeste (fichiers + verrou)
        │ checkout (FR-001)
        ▼
Copie de travail locale ──(édition libre, aucune contrainte)──▶ Copie de travail modifiée
        │ réconciliation : comparer(Manifeste, Copie de travail modifiée)
        ▼
RapportReconciliation (5 catégories) ──▶ Point avant archive (FR-013) ──▶ confirmation ──▶ archiver()
        │
        ▼
Manifeste mis à jour + verrou levé (FR-016)
```

## État / transitions

```text
[Dossier de l'archive]
   Disponible (verrou=False)
        │ checkout (FR-001/003)
        ▼
   Verrouillé (verrou=True, ManifestSnapshot créé)
        │ édition locale libre (FR-005, archive inchangée)
        │
        │ réconciliation → RapportReconciliation
        │
        ├── changements "normal"/"deplacement"/"suppression confirmée"/"nouveau confirmé" → archivés
        └── "anomalie" → décision explicite (confirmer quand même | restaurer depuis l'archive)
        │
        │ toutes les écritures confirmées effectuées et vérifiées (FR-015)
        ▼
   Disponible (verrou=False, manifeste mis à jour)
```

Une tentative de checkout pendant l'état **Verrouillé** est refusée (FR-004) — pas de transition, retour d'erreur explicite.