🔄 Diagrammes de Séquences — CV-Builder ClaraJob

Phase 2 (Analysis) — Two-Track Unified Process (2TUP)

Note

📺 Diagrammes de Séquences UML

  • sequence-uc01-02.svg — UC01 : crĂ©ation par le wizard Clara · UC02 : import d’un CV PDF

  • sequence-uc06-07.svg — UC06 : Ă©dition du contenu · UC07 : rĂ©organisation / masquage des sections

  • sequence-uc12-13.svg — UC12 : activation du partage · UC13 : consultation publique

  • sequence-uc15-16.svg — UC15 : adaptation Ă  une offre · UC16 : chat Clara (coach IA)

Documents liĂ©s : Cas d’utilisation · Classes · Composants


Vue d’ensemble

Les diagrammes de séquences illustrent les interactions dynamiques réellement implémentées entre le frontend Vue 3 (composants, composables, store Pinia cvBuilderStore) et le backend Spring WebFlux (controllers, services applicatifs, MongoDB). Ils montrent :

  • Acteurs/Participants : Candidat ou Visiteur, composants Vue, services HTTP frontend, controllers et services backend, MongoDB, IA gĂ©nĂ©rative (GeminiClient)

  • Lignes de vie : parcours temporel de chaque participant

  • Messages numĂ©rotĂ©s : appels de mĂ©thodes et requĂŞtes HTTP rĂ©elles (chemins d’API exacts)

  • BoĂ®tes d’exĂ©cution : durĂ©e d’activitĂ© de chaque composant

  • Flux de retour (pointillĂ©s) : donnĂ©es retournĂ©es aux appelants


📊 Diagramme UC01–UC02 : Création par le wizard Clara et import PDF

Séquence UC01-02 — Wizard Clara et import PDF

UC01 — Création par le wizard Clara (ScratchWizardModal) :

  1. Le Candidat choisit secteur, niveau d’expĂ©rience, ton (et texte libre optionnel) puis clique « GĂ©nĂ©rer »

  2. ScratchWizardModal appelle generateFullCv() du service frontend cvAiService

  3. RequĂŞte POST /ai/generate-cv vers AiController

  4. CvGenerationService.generateFullCv(sector, level, tone, freeText) construit le prompt (schéma JSON strict des 8 sections)

  5. GeminiClient (AiClient.generateJson) appelle l’API Gemini en mode JSON

  6. Le JSON retourné est parsé en Map — échec de parsing → 502, quota IA dépassé → 429

  7. Le rĂ©sultat alimente store.cvData : l’Ă©diteur s’ouvre prĂ©-rempli ; la première sauvegarde automatique crĂ©era le document en base

UC02 — Import d’un CV PDF (CvInitScreen2) :

  1. Le Candidat dépose son PDF → POST /files/upload (multipart) stocke le fichier dans MinIO et retourne un objectKey

  2. POST /cv-documents/import-pdf { fileKey } → CvImportService.importFromPdf(userId, fileKey)

  3. Le service télécharge le fichier depuis MinIO puis extrait le texte avec Apache PDFBox (PdfTextExtractor, exécuté sur le scheduler boundedElastic)

  4. AiClient.generateJson(prompt de structuration, texte) transforme le texte brut en JSON structuré (identité, expériences, formation, compétences…)

  5. CvDocument.create(…​) est sauvegardĂ© dans MongoDB (cv_documents) → retour CvDocumentResponse, l’Ă©diteur s’ouvre prĂ©-rempli


📊 Diagramme UC06–UC07 : Édition du contenu et réorganisation des sections

Séquence UC06-07 — Édition et réorganisation

UC06 — Édition du contenu :

  1. Le Candidat saisit un champ dans un des formulaires des 8 sections (identité, résumé, expériences, formation, compétences, langues, projets, certifications)

  2. Le formulaire mute directement store.cvData (Pinia)

  3. Dans CvWorkspaceView, watchDebounced(() ⇒ store.cvData, …, { debounce: 2000, deep: true }) observe le store

  4. Après 2 s sans frappe, le watcher appelle store.autoSave() (uniquement si currentCvId est défini)

  5. autoSave → useCvPersistence.saveCv → updateCvDocument → PUT /api/v1/cv-documents/{id}

  6. CvDocumentService.update contrĂ´le le propriĂ©taire puis doc.update(…​) (incrĂ©ment updatedAt)

  7. CvDocumentRepositoryAdapter persiste dans MongoDB (cv_documents) via le scheduler boundedElastic

  8. Retour CvDocumentResponse → store.lastSavedAt mis Ă  jour → indicateur « EnregistrĂ© » dans l’en-tĂŞte

UC07 — Réorganisation / masquage des sections :

  1. Le Candidat glisse-dĂ©pose une section (sortablejs dans SectionOrderControl) ou clique l’icĂ´ne de visibilitĂ© (SectionVisibilityControl)

  2. Appel de store.setSectionOrder(order) (→ cvData.sectionOrder) ou store.toggleSectionVisibility(section) (→ cvData.hiddenSections)

  3. La mutation de cvData emprunte exactement le même chemin de persistance que UC06 : watchDebounced 2 s → autoSave → PUT /cv-documents/{id} → MongoDB


📊 Diagramme UC12–UC13 : Activation du partage et consultation publique

Séquence UC12-13 — Partage et consultation publique

UC12 — Activer le partage (SharePanel) :

  1. Le Candidat active le partage (slug personnalisé optionnel)

  2. PUT /cv-documents/{id}/share { enabled, slug } → CvShareService.updateShare

  3. Contrôle du propriétaire, puis doc.enableSharing() — shareEnabled = true ; le token UUID existe déjà (généré à la création du document)

  4. Si un slug est fourni : existsByShareSlug — s’il est pris par un autre CV → 409 Conflict ; sinon doc.updateSlug(slug) (format ^[a-z0-9][a-z0-9-]{1,58}[a-z0-9]$)

  5. Sauvegarde MongoDB → retour CvShareResponse { enabled, token, slug, urls publiques } → le lien /cv/{token} (ou /cv/{slug}) est affiché et copiable

UC13 — Consultation publique (CvPublicView) :

  1. Un Visiteur (sans compte) ouvre l’URL /cv/:token — route frontend publique

  2. cvShareService.getPublic tente GET /cv-documents/shared/{token} (endpoint public, sans authentification)

  3. En cas de 404, repli automatique sur GET /cv-documents/shared/s/{slug}

  4. Backend : findByShareToken / findByShareSlug + filtre shareEnabled — sinon 404

  5. Retour CvPublicResponse(data, templateLayout, accentColor, fontFamily, spacing, showBadge) → rendu du CV en lecture seule ; si introuvable ou partage désactivé → page « CV introuvable »


📊 Diagramme UC15–UC16 : Adaptation à une offre et chat Clara

Séquence UC15-16 — Adaptation à une offre et chat Clara

UC15 — Adaptation à une offre (CvAdaptScreen) :

  1. Le Candidat colle le texte de l’offre puis clique « Analyser »

  2. matchCvToOffer(cvText, offerText) → POST /cv/match

  3. CvMatcherService.match est purement algorithmique (aucun appel IA) : normalisation des accents, filtrage des stop-words FR/EN, mots ≥ 3 caractères, score = mots-clĂ©s de l’offre prĂ©sents dans le CV

  4. Retour CvMatchResponse { score %, matched[], missing[], suggestions[] } → affichage du score et des mots-clés présents/manquants

  5. « Créer un variant » → POST /cv-documents/{id}/variants { name, matchScore } → CvVariantService.create → MongoDB — le CV master reste intact

UC16 — Chat Clara (AiCoachTab + useAiChat) :

  1. Le Candidat envoie un message → useAiChat.sendMessage(text)

  2. POST /ai/chat { message, cvData, conversationHistory } → CvChatService.chat

  3. Le service construit un prompt système incluant le CV actuel et le catalogue d’actions (update_identity, set_experiences, set_full_cv…) puis appelle GeminiClient en mode JSON

  4. Réponse { message, actions[] } : les actions informatives (suggest, score, recommend_template) sont exécutées immédiatement ; les actions modifiantes sont proposées sous forme de boutons « Appliquer » / « Tout appliquer » — validation utilisateur obligatoire

  5. Au clic, executeAction prend d’abord un snapshot d’annulation (cvSnapshotManager + undoStack) puis mute store.cvData

  6. store.autoSave() persiste immédiatement via PUT /cv-documents/{id}


🔗 Légende UML - Diagrammes de Séquences

Élément Signification

Participant

Rectangle en haut du diagramme (Candidat/Visiteur, composant Vue, service, controller, MongoDB)

Ligne de vie

Ligne pointillée verticale (durée de vie du participant)

Flèche pleine

Appel synchrone (méthode ou requête HTTP)

Flèche pointillée

Retour de valeur / réponse HTTP

BoĂ®te d’exĂ©cution

Rectangle sur la ligne de vie (activité en cours)

Message numéroté

Ordre chronologique de l’interaction

Auto-message

Traitement interne (debounce, parsing, extraction PDFBox…)

Note alt

Branche conditionnelle (409 slug pris, 404 partage désactivé, repli slug…)


✅ SYNC GATE 2 : Validation Dynamique ↔ Architecture

UC Séquence Métier Composants Techniques

UC01–02

Wizard IA / Import PDF → CV pré-rempli

ScratchWizardModal / CvInitScreen2 → AiController / CvDocumentController → CvGenerationService / CvImportService (PDFBox + AiClient) → MongoDB

UC06–07

Édition & réorganisation → persistance débouncée

Formulaires + sortablejs → cvBuilderStore → watchDebounced 2 s → PUT /cv-documents/{id} → CvDocumentService → adapter boundedElastic → MongoDB

UC12–13

Activation du partage → consultation publique

SharePanel → CvShareService (token UUID / slug 409) → GET public par token, repli slug → CvPublicView

UC15–16

Matching algorithmique + coach IA avec validation

CvMatcherService (sans IA) + CvVariantService · CvChatService → GeminiClient → actions validées → snapshot undo → autoSave

Verdict Sync Gate 2 : âś… APPROUVÉ — chaque sĂ©quence correspond au code effectif (chemins d’API, services et composants vĂ©rifiĂ©s dans clarajob-front-api et clarajob-front-gui).


📊 Résumé Statistique

Métriques Valeurs

Diagrammes de Séquences

4 (UC01–02, UC06–07, UC12–13, UC15–16)

Participants

6 Ă  7 par diagramme

Interactions

8 à 13 messages par séquence

Endpoints couverts

/ai/generate-cv, /files/upload, /cv-documents/import-pdf, /cv-documents/{id}, /cv-documents/{id}/share, /cv-documents/shared/{token}, /cv-documents/shared/s/{slug}, /cv/match, /cv-documents/{id}/variants, /ai/chat

Patterns

Synchrone (HTTP), débouncé (autosave 2 s), validation utilisateur (actions IA), repli (token → slug)