# PRD - Authentification Avancée & Administration

## 1. Contexte & Objectifs
L'application Memento dispose actuellement d'une authentification basique. Pour un usage multi-utilisateurs ou privé/familial sécurisé, il est nécessaire d'introduire des rôles (Admin vs Utilisateur standard) et de permettre la gestion des comptes.

**Objectifs :**
- Permettre à un Administrateur de gérer les utilisateurs (création manuelle, suppression).
- Permettre à tout utilisateur de modifier ses informations personnelles (nom, mot de passe).
- Sécuriser l'application en introduisant des rôles.

## 2. Spécifications Fonctionnelles

### 2.1 Gestion des Rôles (Backend)
- **Modèle User** : Ajouter un champ `role` avec deux valeurs possibles : `USER` (défaut) et `ADMIN`.
- **NextAuth** : Le rôle de l'utilisateur doit être disponible dans la session (via le token JWT) pour être vérifié côté client et serveur.

### 2.2 Dashboard Admin (`/admin`)
**Accès :** Restreint aux utilisateurs ayant le rôle `ADMIN`.
**Fonctionnalités :**
1.  **Liste des utilisateurs** :
    - Tableau affichant : Nom, Email, Rôle, Date de création.
    - Actions par ligne : "Supprimer", "Promouvoir Admin / Rétrograder".
2.  **Création d'utilisateur** :
    - Un bouton "Nouvel Utilisateur" ouvre une modale ou un formulaire.
    - Champs : Nom, Email, Mot de passe, Rôle.
    - Validation : Email unique, mot de passe min 6 caractères.

### 2.3 Profil Utilisateur (`/settings/profile`)
**Accès :** Tout utilisateur connecté.
**Fonctionnalités :**
1.  **Modifier le profil** :
    - Changer le nom d'affichage.
2.  **Sécurité** :
    - Changer le mot de passe (nécessite l'ancien mot de passe pour validation).

## 3. Spécifications Techniques

### 3.1 Base de Données (Prisma)
Modifier `schema.prisma` :
```prisma
model User {
  // ... champs existants
  role String @default("USER") // ou Enum si SQLite le supporte bien (sinon String géré par app)
}
```

### 3.2 Authentication (NextAuth v5)
- Modifier `auth.config.ts` :
  - Ajouter `role` au type `Session` et `User`.
  - Dans le callback `jwt`, récupérer le rôle depuis la DB et le persister dans le token.
  - Dans le callback `session`, passer le rôle du token à la session.

### 3.3 Server Actions
Créer `app/actions/admin.ts` :
- `getUsers()`: Retourne la liste (Admin only).
- `createUser(data)`: Crée un user avec hash du mot de passe (Admin only).
- `deleteUser(id)`: Supprime un user (Admin only).
- `updateUserRole(id, role)`: Change le rôle (Admin only).

Créer `app/actions/profile.ts` :
- `updateProfile(data)`: Met à jour nom/email.
- `changePassword(oldPwd, newPwd)`: Vérifie l'ancien hash et met à jour.

### 3.4 Interface Utilisateur (UI)
- **Admin** : Utiliser `Table`, `Dialog` et `Form` de Shadcn UI.
- **Profil** : Utiliser `Card`, `Input` et `Button` de Shadcn UI.
- **Menu** : Ajouter un lien "Admin" dans la Sidebar ou le menu utilisateur, visible uniquement si `role === 'ADMIN'`.

## 4. Plan d'Implémentation
1.  **Migration DB** : Ajouter le champ `role` et mettre à jour Prisma.
2.  **Config Auth** : Mettre à jour NextAuth pour propager le rôle.
3.  **Backend** : Implémenter les Server Actions (Admin & Profil).
4.  **Frontend Admin** : Créer la page `/admin` et ses composants.
5.  **Frontend Profil** : Créer la page `/settings/profile`.
6.  **Sécurisation** : Ajouter les vérifications de rôle dans le Middleware ou les Layouts.
