437b5db1da74c4c0c11f57070f889f7c250489ac
Le champ "Notes candidat" passe en bordure ambre tant qu'il y a des changements non sauvegardés. Au défocus, la sauvegarde se déclenche automatiquement et la bordure revient à la normale. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IA Gen Maturity Evaluator
Application web de maturité IA/GenAI pour évaluer les candidats lors d'entretiens techniques. Développée par Peaksys pour Peaksys.
Stack technique
- Next.js 15 (App Router), React 19, TypeScript, TailwindCSS
- NextAuth v5 — authentification JWT, bcrypt, rôles
admin/evaluator - Prisma + SQLite (dev) — basculer sur Postgres/Supabase en production
- Recharts — radar chart des scores
- jsPDF — export PDF
- Vitest — tests unitaires | Playwright — tests E2E
Prérequis
- Node.js ≥ 20
- pnpm (
npm install -g pnpm)
Installation & démarrage local
pnpm install
cp .env.example .env # puis remplir AUTH_SECRET
pnpm db:generate
pnpm db:push # ou pnpm db:migrate pour une DB vide
pnpm db:seed
pnpm dev
Ouvrir http://localhost:3000.
Note : Si la DB existe déjà (créée avec db push), pour basculer sur les migrations :
pnpm prisma migrate resolve --applied 20250220000000_init
Variables d'environnement
| Variable | Obligatoire | Description |
|---|---|---|
DATABASE_URL |
Oui | file:./dev.db en local, URL Postgres en prod |
AUTH_SECRET |
Oui | Secret JWT NextAuth (générer avec openssl rand -base64 32) |
NEXTAUTH_URL |
Prod | URL publique de l'app (ex. https://eval.peaksys.io) |
Docker
Trois configurations disponibles :
Développement (hot-reload)
docker compose -f docker-compose.dev.yml up
Production — SQLite (simple, port 3044)
AUTH_SECRET=$(openssl rand -base64 32) \
DB_VOLUME_PATH=/chemin/vers/data \
docker compose up -d
Production — Postgres
docker compose -f docker-compose.postgres.yml up -d
Le
Dockerfileinclut le client Prisma compilé pour Linux (debian-openssl-3.0.x). La base est migrée automatiquement au démarrage viadocker-start.sh.
Architecture
Flux de données (server-first)
- Server Page →
src/lib/server-data.ts(appelleauth()+ Prisma) - La page passe les données sérialisées aux Client Components (
src/components/) - Les composants clients appellent les Server Actions (
src/actions/) pour les mutations - Les server actions appellent
revalidatePath()pour invalider le cache
Authentification & rôles
src/auth.ts— NextAuth v5, Credentials provider (email + bcrypt), stratégie JWT- Deux rôles :
evaluator(défaut) etadmin - Inscription via
/auth/signup(POST /api/auth/signup) src/middleware.ts— protège toutes les routes ; redirige les non-admins hors des routes admin
Contrôle d'accès aux évaluations
src/lib/evaluation-access.ts — canAccessEvaluation() est la source de vérité unique :
- Utilisateur admin → accès total
- Utilisateur evaluator propriétaire → accès total
- Évaluation partagée (
EvaluationShare) → accès lecture/écriture - Évaluation publique (
isPublic = true) → accès lecture seule
Important : staleness du JWT
session.user.name est gelé au moment du login. Pour afficher le nom à jour, interroger Prisma via session.user.id — ne pas se fier à la session.
Pages & fonctionnalités
| Route | Accès | Description |
|---|---|---|
/ |
Tous | Redirect vers /dashboard |
/dashboard |
Auth | Liste des évaluations, groupement par équipe, vue carte ou tableau |
/evaluations/new |
Auth | Créer une évaluation (candidat, rôle, équipe, template) |
/evaluations/[id] |
Voir accès | Guide d'entretien, scores 1–5, justifications, radar chart, export |
/admin |
Admin | Gestion des templates et des utilisateurs |
/settings |
Auth | Modifier son nom et son mot de passe |
/auth/login |
Public | Connexion |
/auth/signup |
Public | Inscription |
Fonctionnalités clés
- Scoring : note 1–5, justification, exemples observés, niveau de confiance
- Questions de sondage : affichées automatiquement quand score ≤ 2
- Assistant IA (stub) : suggestions de questions de relance (
/api/ai/suggest-followups) - Export : CSV (
/api/export/csv?id=) et PDF (/api/export/pdf?id=) - Radar chart : visualisation des scores par dimension
- Partage : partager une évaluation avec d'autres utilisateurs (
EvaluationShare) - Visibilité publique :
isPublicrend une évaluation lisible sans authentification - Audit log : toute modification post-soumission est tracée
- Warning : alerte si tous les scores = 5 sans justification
Commandes utiles
pnpm dev # Serveur de développement
pnpm build # Build production
pnpm lint # ESLint
pnpm typecheck # tsc --noEmit
pnpm db:generate # Régénérer le client Prisma après modif du schéma
pnpm db:push # Synchroniser le schéma (dev, sans fichiers de migration)
pnpm db:migrate # Appliquer les migrations (production)
pnpm db:seed # Injecter les données de seed
pnpm db:studio # Ouvrir Prisma Studio
Tests
# Tests unitaires (Vitest)
pnpm test
# Tests E2E (Playwright) — nécessite le serveur dev lancé
pnpm exec playwright install # une seule fois
pnpm test:e2e
Déploiement (production)
- Configurer
DATABASE_URLvers Postgres (Supabase, Neon, etc.) - Générer
AUTH_SECRET:openssl rand -base64 32 - Appliquer les migrations :
pnpm db:migrate - Seeder si besoin :
pnpm db:seed - Build :
pnpm build && pnpm start - Ou déployer sur Vercel (variables d'env à configurer, Vercel Postgres ou DB externe)
Structure des fichiers
src/
├── app/
│ ├── api/ # Routes API (export CSV/PDF, auth, AI stub)
│ ├── auth/ # Pages login / signup
│ ├── dashboard/ # Dashboard principal
│ ├── evaluations/ # Pages évaluation (new, [id])
│ ├── admin/ # Administration (templates, utilisateurs)
│ ├── settings/ # Paramètres utilisateur
│ └── page.tsx # Redirect vers /dashboard
├── actions/ # Server Actions (mutations)
│ ├── evaluations.ts
│ ├── share.ts
│ ├── admin.ts
│ └── password.ts
├── components/ # Composants UI (client + server)
└── lib/
├── server-data.ts # Toutes les requêtes DB (server-side)
├── evaluation-access.ts
├── export-utils.ts
└── ai-stub.ts
prisma/
├── schema.prisma
└── seed.ts
tests/e2e/ # Tests Playwright
Données de seed
- Utilisateur admin :
admin@peaksys.local/admin123 - 3 évaluations de démonstration (Alice Chen, Bob Martin, Carol White) avec équipes
- 2 templates : Full 15 dimensions, Short 8 dimensions
Critères d'acceptation
- Auth bcrypt multi-utilisateurs, rôles admin/evaluator
- Dashboard : liste et cartes d'évaluations, groupement par équipe
- Créer/modifier une évaluation : candidat, rôle, équipe, date, template
- Templates : Full 15 dim, Short 8 dim
- Guide d'entretien : définition, rubrique 1→5, signaux, questions par dimension
- Scoring : note 1–5, justification, exemples, confiance
- Questions de sondage quand score ≤ 2
- Assistant IA (stub) : suggestions de relance
- Radar chart + findings/recommandations auto-générés
- Export PDF et CSV
- Administration : templates et gestion des utilisateurs
- Partage d'évaluation avec d'autres utilisateurs
- Visibilité publique (
isPublic) - Alerte si tous les scores = 5 sans commentaires
- Modification post-soumission avec audit log
- Page paramètres : changer nom et mot de passe
- Responsive mobile (Tailwind)
Description
Languages
TypeScript
98.3%
Dockerfile
0.7%
CSS
0.4%
JavaScript
0.3%
Shell
0.3%