# 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 ```bash 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](http://localhost:3000). **Note :** Si la DB existe déjà (créée avec `db push`), pour basculer sur les migrations : ```bash 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) ```bash docker compose -f docker-compose.dev.yml up ``` ### Production — SQLite (simple, port 3044) ```bash AUTH_SECRET=$(openssl rand -base64 32) \ DB_VOLUME_PATH=/chemin/vers/data \ docker compose up -d ``` ### Production — Postgres ```bash docker compose -f docker-compose.postgres.yml up -d ``` > Le `Dockerfile` inclut le client Prisma compilé pour Linux (`debian-openssl-3.0.x`). > La base est migrée automatiquement au démarrage via `docker-start.sh`. ## Architecture ### Flux de données (server-first) 1. **Server Page** → `src/lib/server-data.ts` (appelle `auth()` + Prisma) 2. La page passe les données sérialisées aux **Client Components** (`src/components/`) 3. Les composants clients appellent les **Server Actions** (`src/actions/`) pour les mutations 4. 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) et `admin` - 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** : `isPublic` rend 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 ```bash 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 ```bash # 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) 1. Configurer `DATABASE_URL` vers Postgres (Supabase, Neon, etc.) 2. Générer `AUTH_SECRET` : `openssl rand -base64 32` 3. Appliquer les migrations : `pnpm db:migrate` 4. Seeder si besoin : `pnpm db:seed` 5. Build : `pnpm build && pnpm start` 6. 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 - [x] Auth bcrypt multi-utilisateurs, rôles admin/evaluator - [x] Dashboard : liste et cartes d'évaluations, groupement par équipe - [x] Créer/modifier une évaluation : candidat, rôle, équipe, date, template - [x] Templates : Full 15 dim, Short 8 dim - [x] Guide d'entretien : définition, rubrique 1→5, signaux, questions par dimension - [x] Scoring : note 1–5, justification, exemples, confiance - [x] Questions de sondage quand score ≤ 2 - [x] Assistant IA (stub) : suggestions de relance - [x] Radar chart + findings/recommandations auto-générés - [x] Export PDF et CSV - [x] Administration : templates et gestion des utilisateurs - [x] Partage d'évaluation avec d'autres utilisateurs - [x] Visibilité publique (`isPublic`) - [x] Alerte si tous les scores = 5 sans commentaires - [x] Modification post-soumission avec audit log - [x] Page paramètres : changer nom et mot de passe - [x] Responsive mobile (Tailwind)