🌐 Diagramme Global d’Interactions — CV-Builder ClaraJob

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

Note

📺 Diagramme Global d’Interactions


Vue d’ensemble

Le diagramme global d’interactions donne la vue macro de toutes les interactions du CV-builder, telles qu’elles existent dans le code : acteurs, frontières (navigateur / backend / systèmes externes), protocoles et chemins de données.

Trois frontières structurent le système :

  • Navigateur : SPA Vue 3 — route /cv-builder (16 écrans navigués par ?screen=<id>&cv=<id>) et route publique /cv/:token. L’export PDF et le score ATS restent entièrement dans cette frontière.

  • Backend clarajob-front-api : Spring Boot WebFlux (Netty) — controllers spec-first OpenAPI, services applicatifs DDD, adapters MongoDB isolés sur boundedElastic.

  • Systèmes externes : Keycloak (OAuth2/JWT), MongoDB, MinIO (S3), IA générative (Gemini ou Groq selon clarajob.ai.provider), Redis (présent mais quota IA inactif).


📊 Diagramme

Diagramme Global d’Interactions — CV-Builder

🔄 Flux d’interaction principaux

N° Flux Chemin UC couverts

1

Authentification

Candidat → SPA → Keycloak (OAuth2 PKCE) → jeton JWT joint par axios en Authorization: Bearer

tous les UC authentifiés

2

CRUD des CV

SPA → CvDocumentController → CvDocumentService / CvVersionService / CvShareService / CvVariantService → adapters boundedElastic → MongoDB (cvDocuments, cvDocumentVersions, cvVariants, appConfig)

UC04-07, UC09, UC12, UC14, UC19

3

Import de CV

SPA → CvDocumentController → CvImportService → MinIO (téléchargement du PDF, bucket clarajob) → PDFBox (extraction texte, lecture seule) → GeminiClient.generateJson (structuration IA) → MongoDB

UC02-03

4

Assistance IA

SPA → AiController (/ai/reformulate, /ai/generate-cv, /ai/generate-section, /ai/chat, /ai/detect-skills) → AiService / CvGenerationService / CvChatService → GeminiClient → API Gemini ou Groq (HTTPS)

UC01, UC16-17

5

Matching offre

SPA → POST /api/v1/cv/match (public) → CvMatcherService — matching purement algorithmique, sans IA

UC15

6

Consultation publique

Visiteur → /cv/:token (CvPublicView) → GET /cv-documents/shared/{token} ou /shared/s/{slug} (permitAll, X-Robots-Tag: noindex)

UC13

7

Export PDF

SPA → window.print() sur CvPrintDocument — aucun octet ne quitte le navigateur (endpoint exportCv = 501)

UC11

8

Config admin

Admin → GET/PUT /cv-documents/admin/config (rôle ADMIN) → collection appConfig (max versions)

UC14


🧭 Frontières et protocoles

Frontière Protocole Remarques

Navigateur → Backend

HTTPS JSON, Authorization: Bearer <JWT Keycloak> via axios (httpClient)

endpoints publics : shared/{token}, shared/s/{slug}, POST /cv/match

Navigateur → Keycloak

OAuth2 Authorization Code + PKCE

jeton JWT vérifié par le backend en Resource Server

Backend → MongoDB

driver MongoDB — MongoRepository bloquant isolé sur Schedulers.boundedElastic()

aucune table CV en PostgreSQL

Backend → MinIO

AWS SDK v2 S3, bucket clarajob

fichiers uploadés uniquement (import PDF) ; clé contrôlée resumes/{userId}/…

Backend → IA générative

HTTPS — Gemini POST /v1beta/models/{model}:generateContent ou Groq POST /openai/v1/chat/completions

provider unique GeminiClient, bi-provider par configuration

Backend → Redis

Lettuce réactif (ai-usage:{userId}:{yyyyMMdd}, TTL 24 h)

présent mais inactif : checkAndConsume n’est appelé nulle part

Navigateur (local)

localStorage

conversations Clara (50 conversations × 200 messages max)


🔍 Points clés (réalité du code)

  • Export PDF 100 % navigateur : useCvVectorExport.exportVectorPdf() → window.print(), rendu CvPrintDocument (@page A4, marges 12 mm). Aucun PDF stocké serveur.

  • Autosave : watchDebounced 2 s sur cvData (UC19) → PUT /cv-documents/{id} — pas de timer 30 s, pas d’IndexedDB, pas de brouillon séparé.

  • Chat Clara : les actions proposées par l’IA ne sont jamais appliquées sans validation du candidat ; l’historique de conversation vit en localStorage, pas en base.

  • Templates : aucune entité backend — 57 layouts Vue × 20 palettes générés côté client (useCvTemplates.ts) ; templateLayout est une simple String du document Mongo.

  • Kafka + Avro présents dans le projet mais non utilisés par le CV-builder.

  • Fonctionnalités « coming soon » (maquettes UI sans backend) : collaboration, interview prep, extras premium, analytics de partage.


🔗 Légende du diagramme

Élément Signification

Bonhomme

Acteur : Candidat (authentifié), Visiteur (lien public), Admin

Cadre pointillé

Frontière : navigateur / backend / systèmes externes

Boîte bleue

Composant frontend (Vue 3 / composable / store Pinia)

Boîte violette

Composant backend (controller / service / adapter Spring WebFlux)

Boîte verte

Stockage (MongoDB, MinIO, localStorage)

Boîte rose

Système externe (Keycloak, IA générative)

Boîte grisée pointillée

Présent dans le code mais inactif (Redis quota IA)

Flèche pleine

Appel synchrone (HTTPS JSON / appel de méthode)

Flèche pointillée

Retour, événement asynchrone ou flux local


✅ SYNC GATE 2 : Cohérence Globale

Critère Vérification

Chaque flux correspond à des UC de la liste officielle (UC01-UC19)

✅ cas-d-utilisations.adoc

Les endpoints du diagramme existent dans openapi.yaml / les controllers

✅ CvDocumentController, AiController, CvMatcherController

Les frontières reflètent le déploiement réel

✅ navigateur / clarajob-front-api / Keycloak-MongoDB-MinIO-IA

L’export PDF n’apparaît dans aucun flux backend

✅ window.print() uniquement (exportCv = 501)

Les composants référencés existent dans le diagramme de composants

✅ services applicatifs, adapters boundedElastic, GeminiClient

Verdict Sync Gate 2 : ✅ APPROUVÉ — la vue macro (frontières, protocoles) et les vues micro (séquences par UC) sont alignées sur le code réel.


Phase 2 Analysis — Diagramme global d’interactions complété