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 · 52 lines · 3.4 KBmarkdown
Blame HistoryOpen raw

Data Model: Catégorisation des dossiers à la racine de l'archive

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

Répertoire racine (archive) — concept, pas une table

Pas une entité stockée en tant que telle : c'est un attribut calculé du chemin d'un dossier ou dossier parent.

Champ (objet RootLocation retourné par determine_root) Type Règles
type énumération : annee | categorie Déterminé par le choix explicite de l'utilisateur à l'étape de destination (FR-001) ; annee par défaut (FR-002)
nom texte Si type == annee : dérivé directement de la date EXIF du groupe (AAAA), jamais saisi manuellement. Si type == categorie : nom choisi par l'utilisateur, nettoyé selon les mêmes règles que tout nom de dossier (specs/001-import-photos FR-010)
chemin_archive chemin <racine archive>/<nom>/
chemin_local chemin <racine espace de travail local>/<nom>/ — même valeur de nom, en miroir (FR-002/FR-003)

Règle d'unicité par dossier : un dossier ou dossier parent a exactement un RootLocation à la fois (FR-005). Pour un dossier parent, ce RootLocation est fixé au premier import qui le crée et hérité tel quel par tout sous-dossier ajouté ensuite (FR-006) — pas de re-résolution à chaque sous-dossier.

Catégorie (table categories, dans la base de contexte centralisée de specs/003-config-contexte-travail)

Champ Type Règles
id identifiant interne Clé primaire
nom texte Unique ; nom de répertoire déjà utilisé au moins une fois (FR-004)
premiere_utilisation horodatage Date du premier dossier créé sous cette catégorie

Alimentation : une ligne est ajoutée automatiquement dès qu'un dossier ou dossier parent est créé avec type == categorie pour un nom non encore présent (FR-004, Edge Case "exposition"). Aucune ligne n'est créée pour les répertoires d'année (non ambigus, dérivés de la date).

Usage : suggest_categories(saisie_utilisateur) compare la saisie aux nom déjà présents (cf. research.md § 2) pour réduire le risque de doublon orthographique (Edge Case "Mariage" vs "mariage") ; list_known_categories() retourne la liste complète pour proposition à l'étape de destination (FR-004).

Relation avec Dossier / Dossier parent (repris de specs/001-import-photos, non redéfinis)

Dossier ──1────1── RootLocation (année ou catégorie, fixé à la création)
   │
   └─ Sous-dossier (dossier parent uniquement) ── hérite du même RootLocation que son parent, jamais recalculé

État / transitions

[Dossier ou dossier parent]
        │ création (import, choix explicite : année ou catégorie)
        ▼
   RootLocation fixé (immuable en écriture directe)
        │
        │ déplacement détecté par somme de contrôle de contenu inchangé
        │ (regine_core.archive.reconciliation.comparer, specs/005-checkout-reconciliation — pas une opération dédiée de ce module)
        ▼
   RootLocation mis à jour (reflète le nouveau chemin détecté)

Il n'existe pas d'opération « recatégoriser » au sens d'une écriture directe sur le RootLocation : la seule voie de changement est un déplacement physique du dossier, détecté comme tel à la réconciliation (FR-008, cf. specs/004-categorisation-dossiers User Story 4).

 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
# Data Model: Catégorisation des dossiers à la racine de l'archive

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

## Répertoire racine (archive) — concept, pas une table

Pas une entité stockée en tant que telle : c'est un attribut calculé du chemin d'un dossier ou dossier parent.

| Champ (objet `RootLocation` retourné par `determine_root`) | Type | Règles |
|---|---|---|
| `type` | énumération : `annee` \| `categorie` | Déterminé par le choix explicite de l'utilisateur à l'étape de destination (FR-001) ; `annee` par défaut (FR-002) |
| `nom` | texte | Si `type == annee` : dérivé directement de la date EXIF du groupe (`AAAA`), jamais saisi manuellement. Si `type == categorie` : nom choisi par l'utilisateur, nettoyé selon les mêmes règles que tout nom de dossier (`specs/001-import-photos` FR-010) |
| `chemin_archive` | chemin | `<racine archive>/<nom>/` |
| `chemin_local` | chemin | `<racine espace de travail local>/<nom>/` — même valeur de `nom`, en miroir (FR-002/FR-003) |

**Règle d'unicité par dossier** : un dossier ou dossier parent a exactement un `RootLocation` à la fois (FR-005). Pour un dossier parent, ce `RootLocation` est fixé au premier import qui le crée et hérité tel quel par tout sous-dossier ajouté ensuite (FR-006) — pas de re-résolution à chaque sous-dossier.

## Catégorie (table `categories`, dans la base de contexte centralisée de `specs/003-config-contexte-travail`)

| Champ | Type | Règles |
|---|---|---|
| `id` | identifiant interne | Clé primaire |
| `nom` | texte | Unique ; nom de répertoire déjà utilisé au moins une fois (FR-004) |
| `premiere_utilisation` | horodatage | Date du premier dossier créé sous cette catégorie |

**Alimentation** : une ligne est ajoutée automatiquement dès qu'un dossier ou dossier parent est créé avec `type == categorie` pour un `nom` non encore présent (FR-004, Edge Case "exposition"). Aucune ligne n'est créée pour les répertoires d'année (non ambigus, dérivés de la date).

**Usage** : `suggest_categories(saisie_utilisateur)` compare la saisie aux `nom` déjà présents (cf. research.md § 2) pour réduire le risque de doublon orthographique (Edge Case "Mariage" vs "mariage") ; `list_known_categories()` retourne la liste complète pour proposition à l'étape de destination (FR-004).

## Relation avec Dossier / Dossier parent (repris de `specs/001-import-photos`, non redéfinis)

```text
Dossier ──1────1── RootLocation (année ou catégorie, fixé à la création)
   │
   └─ Sous-dossier (dossier parent uniquement) ── hérite du même RootLocation que son parent, jamais recalculé
```

## État / transitions

```text
[Dossier ou dossier parent]
        │ création (import, choix explicite : année ou catégorie)
        ▼
   RootLocation fixé (immuable en écriture directe)
        │
        │ déplacement détecté par somme de contrôle de contenu inchangé
        │ (regine_core.archive.reconciliation.comparer, specs/005-checkout-reconciliation — pas une opération dédiée de ce module)
        ▼
   RootLocation mis à jour (reflète le nouveau chemin détecté)
```

Il n'existe pas d'opération « recatégoriser » au sens d'une écriture directe sur le `RootLocation` : la seule voie de changement est un déplacement physique du dossier, détecté comme tel à la réconciliation (FR-008, cf. `specs/004-categorisation-dossiers` User Story 4).