đź’» Architecture Frontend CV-builder

Note

📺 Diagrammes SVG de ce document

Track Technique 2TUP — Phase 1 : Choix d’architecture

Style d’architecture : Single Page Application Vue 3 intĂ©grĂ©e au frontend ClaraJob (clarajob-front-gui). Le CV-builder expose 2 routes seulement : /cv-builder (authentifiĂ©e, vue racine CvWorkspaceView) et /cv/:token (publique, CvPublicView). La navigation interne se fait sans changement de route, par le paramètre de requĂŞte ?screen= (16 Ă©crans), avec un Ă©tat global centralisĂ© dans un store Pinia unique (useCvBuilderStore).

Composant Technologie RĂ´le

Framework

Vue 3.5 (Composition API, <script setup>)

Composants UI, réactivité

Langage

TypeScript 5.9

Typage statique (cv-builder.types.ts)

État global

Pinia 3

Store unique useCvBuilderStore (cvData, template, persistance)

Routing

Vue Router 4

2 routes ; navigation interne par ?screen= (16 écrans)

Client HTTP

axios

Client partagé (baseURL → /api/v1), JWT via intercepteur

UI

Tailwind CSS 3.4 (+ styles scoped)

Design system, mise en page

Éditeur riche

TipTap 3 (@tiptap/vue-3, starter-kit)

Édition de texte riche (RichTextEditor)

Utilitaires

@vueuse/core (watchDebounced), sortablejs, zod

Debounce auto-save/preview, drag & drop, validation des actions IA

Build

Vite 7

Bundling, HMR, lazy-loading des 57 layouts

Diagramme en couches

Architecture frontend en couches

Lecture du diagramme :

  • Vue racine — CvWorkspaceView (route /cv-builder) sĂ©lectionne l’Ă©cran actif d’après ?screen= et porte l’auto-save (watchDebounced 2 s sur store.cvData) ; elle est habillĂ©e par CvAppShell + CvSidebarNav et monte en permanence CvPrintDocument (rendu d’impression).

  • Écrans — 16 Ă©crans internes : init, list, templates, design, workspace, ai-coach, ats, adapt, interview, collab, share, versions, extras, admin, preview, public.

  • Composants d’Ă©dition/rendu — EditorSidebar, EditorFormContainer (9 formulaires de section), EditorPreviewPanel → CvLivePreview → CvMiniPreview qui charge paresseusement les 57 layouts (CvLayout*.vue) ; CvPagedPreview (pagination A4) et CvPrintDocument (export PDF).

  • Composables — useAiChat (singleton module-level : messages, undoStack, executeAction), useCvScoring (score calculĂ© cĂ´tĂ© client), useCvTemplates (catalogue des templates), useCvVectorExport (window.print()), useCvPersistence (backend si authentifiĂ©, fallback localStorage).

  • Store Pinia unique — useCvBuilderStore : cvData, template/design sĂ©lectionnĂ©, currentCvId, savedCvs, lastSavedAt, actions autoSave(), loadExistingCv(), createNewCv().

  • Services API — 7 services rĂ©els : cvDocumentService, cvAiService, chatService, aiService, cvVersionService, cvShareService, variantService → backend REST /api/v1.

Important

Écrans maquettes et données en dur (état réel du code) :

  • collab, interview et extras sont des maquettes recouvertes par CvComingSoonOverlay (« coming soon ») — aucune API branchĂ©e.

  • L’Ă©cran ATS (CvAtsScreen) calcule un score rĂ©el via useCvScoring, mais les listes de mots-clĂ©s (« prĂ©sents » / « manquants ») et les vĂ©rifications de format sont des donnĂ©es en dur.

  • Les KPI de l’Ă©cran de partage (CvShareScreen) sont des placeholders Ă  zĂ©ro (« Aucune donnĂ©e encore ») — pas de statistiques backend.

Hiérarchie des composants

Hiérarchie des composants

Règles de composition :

  • Un seul point d’entrĂ©e par route : CvWorkspaceView compose les 16 Ă©crans ; CvPublicView (route /cv/:token) rend directement CvMiniPreview avec les donnĂ©es publiques.

  • Les Ă©crans composent des composants mĂ©tier ; CvMiniPreview est le composant de rendu partagĂ© par tout le monde (Ă©diteur, templates, aperçu, export, impression, vue publique).

  • Le chat Clara est dĂ©coupĂ© : AiCoachTab → ChatMessageBubble → ChatQuickActions / ChatActionPreview ; l’Ă©tat du chat vit dans le composable singleton useAiChat, pas dans un composant.

  • Les 57 layouts sont des composants purs (props data, accentColor… → rendu HTML/CSS), chargĂ©s Ă  la demande via defineAsyncComponent.

Flux de données

Flux de données

Trois flux structurent l’application :

  1. Auto-save — saisie dans un formulaire → mutation directe de store.cvData → watchDebounced 2000 ms (CvWorkspaceView) → store.autoSave() → PUT /api/v1/cv-documents/{id} (ou POST à la création ; fallback localStorage hors authentification) → mise à jour de lastSavedAt.

  2. Chat IA (Clara) — message utilisateur → POST /api/v1/ai/chat (message + cvData
    historique) → la rĂ©ponse contient des actions ; les actions informatives (suggestion, score, template) sont exĂ©cutĂ©es immĂ©diatement, les actions modifiantes sont proposĂ©es en quick actions et attendent la validation de l’utilisateur → executeAction() valide l’action (zod), prend un snapshot d’annulation (undoStack), mute le store → l’auto-save standard persiste le rĂ©sultat.

  3. Rendu live — CvLivePreview observe store.cvData avec watchDebounced 300 ms et pousse une copie vers CvMiniPreview (layout sĂ©lectionnĂ©) ; l’export PDF passe par useCvVectorExport → window.print() sur CvPrintDocument (@media print), le PDF est produit par le navigateur — pas d’appel backend d’export.

Sync Gate 2 — Vérification track fonctionnel ↔ track technique

UC Chemin technique frontend Statut

UC01 — Créer un CV de zéro

CvInitScreen2 + ScratchWizardModal → store.createNewCv() → POST /cv-documents

âś… couvert

UC02 — Importer depuis le profil

CvInitScreen2 → cvDocumentService.importFromProfile() → POST /cv-documents/import-profile

âś… couvert

UC03 — Importer un CV PDF

CvInitScreen2 → cvDocumentService.importCvFromPdf() → POST /cv-documents/import-pdf

âś… couvert

UC04 — Générer un CV complet par IA

ScratchWizardModal → cvAiService → POST /ai/generate-cv

âś… couvert

UC05 — Lister / ouvrir / supprimer ses CV

CvListScreen → useCvPersistence → GET /cv-documents/me, DELETE /cv-documents/{id}

âś… couvert

UC06 — Éditer les sections

CvWorkspaceScreen → EditorFormContainer (9 formulaires) → store.cvData

âś… couvert

UC07 — Choisir un template

CvTemplatesScreen / DesignTab → useCvTemplates (57 layouts, catalogue local)

âś… couvert

UC08 — Personnaliser le design

DesignTab → StyleControls / ColorCustomizer → store (couleur, police, espacement)

âś… couvert

UC09 — Prévisualiser le CV

CvPreviewScreen / EditorPreviewPanel → CvLivePreview → CvMiniPreview / CvPagedPreview

âś… couvert

UC10 — Exporter en PDF

useCvVectorExport → window.print() → CvPrintDocument (impression navigateur)

âś… couvert

UC11 — Dialoguer avec Clara

CvAiCoachScreen → useAiChat → POST /ai/chat → validation → executeAction()

âś… couvert

UC12 — Reformuler un texte par IA

RichTextEditor → aiService → POST /ai/reformulate

âś… couvert

UC13 — Générer une section par IA

RichTextEditor → cvAiService → POST /ai/generate-section

âś… couvert

UC14 — Adapter le CV à une offre

CvAdaptScreen → POST /cv/match puis création de variante

âś… couvert

UC15 — Gérer les variantes

CvVersionsScreen / VariantsTab → /cv-documents/{id}/variants (CRUD)

âś… couvert

UC16 — Sauvegarde automatique

CvWorkspaceView watchDebounced 2 s → store.autoSave() → PUT /cv-documents/{id}

âś… couvert

UC17 — Gérer les versions

CvVersionsScreen / VersionHistoryPanel → /cv-documents/{id}/versions (+ restore)

âś… couvert

UC18 — Partager le CV (lien public)

SharePanel → PUT /cv-documents/{id}/share (activation, slug)

âś… couvert (KPI maquette)

UC19 — Consulter un CV partagé

route /cv/:token → CvPublicView → GET /cv-documents/shared/{token} (ou /s/{slug})

âś… couvert

Verdict Sync Gate 2 : les 19 cas d’utilisation rĂ©els ont un chemin technique complet (Ă©cran → store/composable → service API → backend /api/v1). Les Ă©crans collab, interview et extras sont hors pĂ©rimètre fonctionnel (maquettes « coming soon ») ; le score ATS est calculĂ© cĂ´tĂ© client (useCvScoring) et l’analyse de mots-clĂ©s ATS reste Ă  brancher — design validĂ© avec ces rĂ©serves explicites.