feat(candidatures): éditeur de CV in-app, suivi, design par-CV & compétences clés - #22
Conversation
…étences clés Parcours complet : import/profil → offre → match → génération → édition → export, avec persistance des candidatures (plus de perte au changement d'onglet). Persistance & suivi - Modèle Candidature (statuts brouillon→postulé→entretien→refusé/accepté), endpoints list/detail/patch/delete, page de suivi /candidatures. - La génération persiste le CV et redirige vers l'éditeur. Éditeur in-app (/candidatures/:id) - Édition contenu (sections, textes, ordre, ajout/suppression) provenance-safe, aperçu live débouncé, sauvegarde, statut, export PDF, suppression. - Apparence : disposition, couleurs, police, et tokens photo (position, taille en px, marge, padding, rayon sidebar). - Recadrage interactif de la photo (déplacer + zoomer), sortie nette. Compétences clés (phrases verbe d'action) - Stockées au profil, extraites du CV importé, injectées au-dessus des expériences et ADAPTÉES à l'offre sans rien inventer (repli verbatim). Profil - Identité complète, langues, formations, « CV de base » (design + contenu) extrait d'un PDF ; import dédupliqué (plus de doublons au ré-import). Rendu - Gabarit maîtrisé + tokens (cv-html), export forcé sur 1 page (cut), élagage des sections vides, validation/bornage des tokens côté serveur. Tests : 118 (app) + 6 (shared) ; typecheck clean. Page /ui supprimée. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
✅ Deploy Preview for monumental-speculoos-a69398 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (69)
📝 WalkthroughWalkthroughThis PR introduces full candidature lifecycle persistence (DB schema, CRUD API, list and editor pages), a ChangesCandidature persistence, CV design system, and profile enrichment
Sequence Diagram(s)sequenceDiagram
participant User
participant candidaturePage as candidature.vue
participant GenerateAPI as POST /api/candidature/generate
participant adaptKeySkills
participant prismaDB as Prisma DB
participant EditorPage as candidatures/[id].vue
participant PreviewAPI as POST /api/cv/preview
participant ExportAPI as POST /api/cv/export-pdf
User->>candidaturePage: submit offer + match
candidaturePage->>GenerateAPI: {offer, match}
GenerateAPI->>prismaDB: fetch user name/email
GenerateAPI->>adaptKeySkills: adapt keySkills to offer
adaptKeySkills-->>GenerateAPI: adapted phrases[]
GenerateAPI->>prismaDB: candidature.create(snapshot, cv, design)
GenerateAPI-->>candidaturePage: {cv, candidatureId}
candidaturePage->>EditorPage: navigate /candidatures/:id
EditorPage->>prismaDB: GET /api/candidatures/:id
EditorPage->>PreviewAPI: POST {cv, design} (debounced)
PreviewAPI-->>EditorPage: themed HTML (srcdoc iframe)
User->>EditorPage: export PDF
EditorPage->>ExportAPI: POST {cv, design}
ExportAPI-->>EditorPage: PDF blob download
sequenceDiagram
participant User
participant ProfilPage as profil.vue
participant ExtractAPI as POST /api/profile/cv-design/extract
participant anthropicComplete
participant extractCvDesign
participant extractCvContent
participant DesignPutAPI as PUT /api/profile/cv-design
participant prismaDB as Prisma DB
User->>ProfilPage: upload PDF (CV de base)
ProfilPage->>ExtractAPI: multipart PDF
ExtractAPI->>anthropicComplete: PDF base64 (parallel)
anthropicComplete-->>extractCvDesign: design tokens
anthropicComplete-->>extractCvContent: ParsedCvProfile
ExtractAPI-->>ProfilPage: {design, parsed}
User->>ProfilPage: review & apply
ProfilPage->>DesignPutAPI: PUT normalizeDesign(design)
DesignPutAPI->>prismaDB: profile.baseCvDesign = design
ProfilPage->>prismaDB: PATCH header fields (if empty)
ProfilPage->>prismaDB: POST experiences/education/skills/languages (dedup)
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Parcours
Import/profil → offre → score de match → génération → édition → export, avec persistance des candidatures (plus de perte au changement d'onglet) et suivi.
Highlights
Candidature(statuts brouillon→postulé→entretien→refusé/accepté), endpoints list/detail/patch/delete, page/candidatures. La génération persiste le CV et redirige vers l'éditeur./candidatures/:id) : édition de contenu provenance-safe (sections, textes, ordre, ajout/suppression), aperçu live débouncé, sauvegarde, statut, export PDF, suppression. Panneau Apparence : disposition, couleurs, police, tokens photo (position, taille en px, marge, padding, rayon sidebar) + recadrage interactif (déplacer/zoomer).Migrations
5 migrations Prisma additives (identity, languages, base_cv_design, candidatures, key_skills).
Vérification
npx vitest run: 118 (app) + 6 (shared) verts.npx nuxt typecheck: clean.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Chores