đź”§ Architecture Backend CV-builder
|
Note
|
📺 Diagrammes SVG de ce document
Documents liĂ©s : Cas d’utilisation · Diagramme de classes |
Track Technique 2TUP — Phase 1 : Choix d’architecture
Style d’architecture : monolithe modulaire DDD dĂ©coupĂ© en bounded contexts (cvbuilder, ai, job, user, shared.storage), chaque contexte Ă©tant organisĂ© en couches hexagonales Presentation → Application → Domain (ports) → Infrastructure (adapters). L’API est spec-first OpenAPI : les controllers implĂ©mentent les interfaces gĂ©nĂ©rĂ©es depuis openapi.yaml (CvsApi, AiApi, CvMatchingApi, FilesApi).
| Composant | Technologie | RĂ´le |
|---|---|---|
Framework |
Spring Boot 4.1.0-M1 (WebFlux réactif sur Netty) — Java 25 |
REST API non bloquante, injection de dépendances |
Contrat API |
OpenAPI spec-first ( |
Interfaces |
Persistance documents |
Spring Data MongoDB — |
Contenu des CV : collections |
Persistance SQL |
R2DBC (réactif) + Liquibase — PostgreSQL |
Référentiel relationnel : |
Stockage objet |
MinIO (S3) — bucket |
Fichiers uploadés : |
Lecture PDF |
Apache PDFBox — lecture seule ( |
Extraction du texte brut Ă l’import d’un CV PDF (aucune gĂ©nĂ©ration de PDF cĂ´tĂ© serveur) |
IA générative |
|
Reformulation, génération de CV/sections, chat Clara, structuration des imports, matching CV/offre |
Cache / quota |
Redis 7 (réactif) |
Quota IA journalier par utilisateur (clé |
Sécurité |
Keycloak — resource server JWT (rôles |
Tous les endpoints CV sont authentifiés sauf |
Validation |
Jakarta Validation |
Contraintes sur les DTO d’entrĂ©e |
Logging |
SLF4J + Logback |
Observabilité |
Diagramme en couches
Lecture du diagramme :
-
Présentation — 3 REST controllers spec-first :
CvDocumentController(implémenteCvsApi),AiController(AiApi),CvMatcherController(CvMatchingApi) -
Application — 8 services :
CvDocumentService,CvVersionService,CvVariantService,CvShareService,CvImportService,AiService,CvGenerationService,CvChatService— plus les DTOs de réponse (CvDocumentResponse,CvVersionResponse,CvVariantResponse,CvShareResponse,CvPublicResponse…) -
Domaine —
CvDocument(aggregate root),CvDocumentVersion,CvVariant, value objects (CvDocumentId,CvVariantId,JobOfferReference…) et ports (CvDocumentRepository,CvDocumentVersionRepository,CvVariantRepository,AiClient,AiUsageQuotaPort,FileStorageService) -
Infrastructure / Persistance — adapters :
CvDocument/Version/Variant RepositoryAdapterqui enveloppent desMongoCv*Repositorybloquants isolés surboundedElastic(),AppConfigRepository(MongoappConfig),MinioFileStorageService,GeminiClient,AiUsageQuotaRedisAdapter,PdfTextExtractor(PDFBox) -
Bases & services externes — MongoDB (
cvDocuments,cvDocumentVersions,cvVariants,appConfig), PostgreSQL (users,resumes— aucune table CV), Redis, MinIO, API Gemini/Groq
Chaque couche ne dépend que de la couche inférieure via les ports du domaine ; les adapters sont injectés dans les services par DI Spring.
Diagramme de composants
Points clés :
-
CvDocumentControllerdélègue à 5 services (CvDocumentService,CvVersionService,CvVariantService,CvShareService,CvImportService) — pas de logique métier dans la couche REST -
CvImportServicecollabore avecFileStorageService(téléchargement MinIO),PdfTextExtractor(PDFBox),AiClient(structuration IA) etUserRepository/UserSkillRepository(import depuis le profil) -
AiController→AiService/CvGenerationService/CvChatService→ portAiClient→GeminiClient→ API Gemini ou Groq ;CvMatcherController→CvMatcherServicesuit le même chemin IA -
CvVersionServicelit/écrit le plafondmaxVersionsPerCvdans la collection MongoappConfig(endpoints adminGET/PUT /api/v1/cv-documents/admin/config) -
Aucune dépendance circulaire : le sens Controller → Service → Port → Adapter → Base est strict
Endpoints réellement exposés (préfixe /api/v1) :
| Endpoint | Chemin technique |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
seuls endpoints du contrat |
|
|
Diagramme de sĂ©quence — Import d’un CV PDF
Ce flux est reprĂ©sentatif du modèle dynamique : le frontend uploade d’abord le PDF dans MinIO (POST /api/v1/files/upload → fileKey), puis appelle POST /api/v1/cv-documents/import-pdf. Le controller reste passif ; CvImportService orchestre : contrĂ´le de propriĂ©tĂ© du fileKey (prĂ©fixe resumes/{userId}/), tĂ©lĂ©chargement MinIO (FileStorageService.download), extraction du texte avec PDFBox (PdfTextExtractor, isolĂ© sur boundedElastic()), structuration par l’IA (AiClient.generateJson avec le STRUCTURATION_PROMPT), rĂ©paration d’un Ă©ventuel JSON tronquĂ© puis normalizeImportedData, et enfin persistance (CvDocument.create → CvDocumentRepository.save → Mongo cvDocuments). La rĂ©ponse est un CvDocumentResponse (201 Created).
|
Important
|
Écarts assumĂ©s entre le contrat et l’implĂ©mentation :
|
Sync Gate 2 — Vérification track fonctionnel ↔ track technique
| UC | Chemin technique réel | Statut |
|---|---|---|
UC01 Créer |
|
âś… backend |
UC02 Modifier |
|
âś… backend |
UC03 Consulter |
|
âś… backend |
UC04 Supprimer |
|
âś… backend |
UC05 Dupliquer |
copie du contenu côté frontend puis |
⚠️ frontend + UC01 |
UC06–UC08 Sections |
sections éditées dans le JSON |
âś… via UC02 |
UC09 Photo |
|
âś… backend |
UC10 Template |
champs |
âś… via UC02 |
UC11 Admin |
|
⚠️ partiel |
UC12 Aperçu |
rendu côté frontend à partir de |
⚠️ frontend |
UC13 Export PDF |
génération côté navigateur — |
⚠️ frontend |
UC14 Partager |
|
âś… backend |
UC15 Valider |
Jakarta Validation sur les DTO + validation temps réel côté frontend — pas de service de validation dédié |
⚠️ partiel |
UC16 Sauvegarder |
|
âś… backend |
UC17 Restaurer |
|
âś… backend |
UC18 Auto-save |
timer côté frontend → |
⚠️ frontend |
UC19 Nettoyage |
non implémenté : aucun |
❌ non couvert |
Fonctionnalités réelles supplémentaires, hors référentiel UC : import PDF / profil / texte (CvImportService), variantes ciblées par offre (CvVariantService), IA générative (reformulation, génération, chat Clara, détection de compétences) et matching CV/offre (POST /api/v1/cv/match).
Verdict Sync Gate 2 : le cĹ“ur CRUD, le versionnage, le partage, l’upload et l’import IA ont un chemin technique complet sans dĂ©pendance circulaire. Les UC d’aperçu, d’export PDF et d’auto-save sont portĂ©s par le frontend (choix assumĂ©), UC19 reste Ă implĂ©menter cĂ´tĂ© backend.