🔄 Diagrammes d’Ă©tats CV-builder

Note

📺 Diagrammes SVG de ce document

  • etats-cv.svg — cycle de vie du document CV (Nouveau → PersistĂ© → ÉditĂ© ⇄ EnregistrĂ© → SupprimĂ©)

  • etats-export-pdf.svg — Ă©tats de l’export PDF (100 % navigateur, window.print())

  • etats-lien-partage.svg — Ă©tats du partage (shareEnabled sur cvDocuments)

Track Fonctionnel 2TUP — Phase 2 : Modèle dynamique

Les diagrammes d’Ă©tats complètent le modèle statique (classes) en dĂ©crivant comment les objets Ă  cycle de vie significatif transitionnent entre leurs Ă©tats. Notation UML : Ă©tat initial (â—Ź), Ă©tat final (â—‰), transitions Ă©vĂ©nement( args ) / action, dĂ©lais after( …​ ).

Point important : le CvDocument backend ne possède aucun champ status — il n’existe pas de statut DRAFT/PUBLISHED/ARCHIVED persistĂ© cĂ´tĂ© serveur (le statut affichĂ© dans l’Ă©cran liste est purement visuel, cĂ´tĂ© interface). Les Ă©tats modĂ©lisĂ©s ici sont donc des Ă©tats observables : prĂ©sence d’un currentCvId cĂ´tĂ© frontend, debounce d’autosave en attente, lastSavedAt, shareEnabled en base.

Trois objets ont un cycle de vie significatif : le document CV (cvDocuments), l'export PDF (processus navigateur) et le partage (shareToken/shareSlug/shareEnabled).

Cycle de vie du document CV

Diagramme d’Ă©tats - Document CV
De Vers Transition

â—Ź initial

Nouveau (non persisté)

ouverture du builder — currentCvId = null, données en mémoire (store Pinia)

Nouveau

Persisté

wizard Clara / import PDF / import profil / premier autosave (UC01–UC03, UC19) / POST /cv-documents — id Mongo attribué, shareToken UUID généré

Persisté

Édité

modifier cvData — toute édition de section (UC06–UC09)

Édité

Édité

nouvelle frappe — réarme le debounce de 2 s (watchDebounced, deep)

Édité

Enregistré

after( 2 s ) / PUT /cv-documents/{id} (UC19) ; les actions IA validées dans le chat déclenchent autoSave() immédiatement (UC16)

Enregistré

Édité

modifier cvData — le cycle reprend

Enregistré

Snapshot de version

créerVersion (UC14) — copie immuable dans cvDocumentVersions, rotation FIFO max 10

Snapshot de version

Enregistré

restaurer — le contenu du snapshot recharge data

Persisté / Enregistré

Supprimé

DELETE /cv-documents/{id} (UC05) — confirmation requise, suppression définitive (pas de corbeille, pas de soft delete)

Supprimé

â—‰ final

immédiat — aucune restauration possible

États de l’export PDF

Diagramme d’Ă©tats - Export PDF

L’export (UC11) est entièrement rĂ©alisĂ© par le navigateur : exportVectorPdf() prĂ©pare le rendu (nextTick + requestAnimationFrame, composant CvPrintDocument tĂ©lĂ©portĂ© dans body#cv-print-root, règles @media print et @page A4 marge 12 mm) puis appelle window.print(). La boĂ®te d’impression s’ouvre : l’utilisateur enregistre le PDF (vectoriel, texte sĂ©lectionnable — Ă©vĂ©nement Plausible cv_exported) ou annule et revient Ă  l’aperçu. Il n’existe aucun Ă©tat serveur : l’endpoint POST /api/v1/cvs/{id}/export rĂ©pond 501 NOT_IMPLEMENTED et aucun PDF n’est stockĂ© cĂ´tĂ© backend.

États du partage

Diagramme d’Ă©tats - Partage

Le shareToken (UUID) existe dès la crĂ©ation du document ; c’est le boolĂ©en shareEnabled (dĂ©faut false) qui gouverne l’accès public. Deux Ă©tats seulement :

État Description

Partage désactivé (défaut)

shareEnabled = false — le lien public rĂ©pond 404 ; le token n’est jamais dĂ©truit

Partage activé

shareEnabled = true — le CV est servi au visiteur via GET /cv-documents/shared/{token} ou /shared/s/{slug} (UC13), route publique frontend /cv/:token, en-tête X-Robots-Tag: noindex

Transitions : activation/dĂ©sactivation par PUT /cv-documents/{id}/share (UC12) — rĂ©versibles Ă  volontĂ©, le token restant identique. Sur l’Ă©tat activĂ©, la mise Ă  jour du slug est validĂ©e par la regex ^[a-z0-9][a-z0-9-]{1,58}[a-z0-9]$ et renvoie 409 CONFLICT si le slug est dĂ©jĂ  pris. Il n’y a ni expiration, ni rĂ©vocation par date, ni mot de passe, ni compteur de vues.

Sync Gate — Cohérence statique ↔ dynamique

  • Les Ă©tats du document CV ne correspondent Ă  aucun champ status : ils reflètent currentCvId, le debounce d’autosave et lastSavedAt du store useCvBuilderStore, cĂ´tĂ© frontend, et les champs rĂ©els de CvDocument (shareEnabled, updatedAt) du modèle de classes.

  • Chaque transition serveur est portĂ©e par un service documentĂ© dans l’architecture backend (CvDocumentService, CvVersionService, CvShareService).

  • Aucune transition automatique planifiĂ©e cĂ´tĂ© serveur : la seule Ă©chĂ©ance temporelle est le debounce de 2 s du frontend (UC19) ; la rotation FIFO des versions (max 10) s’applique de façon synchrone Ă  chaque crĂ©erVersion.

Verdict : modèle dynamique alignĂ© avec le code rĂ©el et les 19 cas d’utilisation — validĂ©.