chore: readme reset
This commit is contained in:
@@ -1,111 +0,0 @@
|
|||||||
# Migration vers UUIDs pour la sécurité
|
|
||||||
|
|
||||||
## 🎯 Objectif
|
|
||||||
|
|
||||||
Remplacer les user IDs séquentiels (1, 2, 3...) par des UUIDs pour éviter les attaques d'énumération.
|
|
||||||
|
|
||||||
## ⚠️ Important
|
|
||||||
|
|
||||||
Cette migration doit être effectuée quand l'application n'est pas en production ou pendant une maintenance.
|
|
||||||
|
|
||||||
## 📋 Étapes à suivre
|
|
||||||
|
|
||||||
### Scenario A : Nouvelle installation (recommandé)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Supprimer l'ancienne DB si elle existe
|
|
||||||
dropdb peakskills
|
|
||||||
|
|
||||||
# 2. Créer une nouvelle DB avec le nouveau schema UUID
|
|
||||||
createdb peakskills
|
|
||||||
psql -h localhost -U peakskills_user -d peakskills -f scripts/init.sql
|
|
||||||
|
|
||||||
# 3. Synchroniser les données skills et teams
|
|
||||||
pnpm run sync-skills
|
|
||||||
pnpm run sync-teams
|
|
||||||
|
|
||||||
# 4. Démarrer l'app
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scenario B : Migration base existante
|
|
||||||
|
|
||||||
**⚠️ Script de migration supprimé**
|
|
||||||
|
|
||||||
Le script `migrate-to-uuid.sql` a été supprimé. Pour migrer une base existante :
|
|
||||||
|
|
||||||
1. **Sauvegarde** tes données importantes
|
|
||||||
2. **Supprime** l'ancienne base : `dropdb peakskills`
|
|
||||||
3. **Recrée** avec le nouveau schéma : `createdb peakskills`
|
|
||||||
4. **Utilise** le Scenario A ci-dessus
|
|
||||||
|
|
||||||
### 4. Nettoyer les anciennes sessions
|
|
||||||
|
|
||||||
- Tous les utilisateurs devront se reconnecter (car les cookies utilisent maintenant des UUIDs)
|
|
||||||
- C'est normal et nécessaire pour la sécurité
|
|
||||||
|
|
||||||
## 🔒 Sécurité apportée
|
|
||||||
|
|
||||||
**Avant :**
|
|
||||||
|
|
||||||
- Cookie: `peakSkills_userId=2`
|
|
||||||
- Facilement hackable: essayer 1, 3, 4, 5...
|
|
||||||
|
|
||||||
**Après :**
|
|
||||||
|
|
||||||
- Cookie: `peakSkills_userId=a1b2c3d4-e5f6-7890-abcd-ef1234567890`
|
|
||||||
- Impossible à deviner: UUID v4 avec 2^122 possibilités
|
|
||||||
|
|
||||||
## 🚀 Tests à effectuer
|
|
||||||
|
|
||||||
1. **Login nouveau utilisateur**
|
|
||||||
|
|
||||||
- Créer un compte → doit générer un UUID
|
|
||||||
- Vérifier le cookie dans le navigateur
|
|
||||||
|
|
||||||
2. **Utilisateur existant**
|
|
||||||
|
|
||||||
- Se reconnecter → doit utiliser l'UUID existant
|
|
||||||
- Vérifier que les données sont préservées
|
|
||||||
|
|
||||||
3. **Actions d'évaluation**
|
|
||||||
- Modifier une skill → doit fonctionner avec UUID
|
|
||||||
- Vérifier que les données sont sauvées
|
|
||||||
|
|
||||||
## 📊 Migration status
|
|
||||||
|
|
||||||
- ✅ **Code application complètement adapté aux UUIDs**
|
|
||||||
- ✅ Nouvelles méthodes `*Uuid()` dans EvaluationService
|
|
||||||
- ✅ Toutes les APIs modifiées (`/api/auth`, `/api/evaluations`, `/api/evaluations/skills`)
|
|
||||||
- ✅ Functions SSR adaptées (server-auth.ts)
|
|
||||||
- ✅ Middleware mis à jour
|
|
||||||
- ✅ Types AuthService corrigés
|
|
||||||
- ⏳ **À faire : Exécuter la migration DB**
|
|
||||||
- ⏳ **À faire : Tester en développement**
|
|
||||||
- ⏳ **À faire : Nettoyer le code legacy une fois validé**
|
|
||||||
|
|
||||||
## 🔧 Fichiers modifiés
|
|
||||||
|
|
||||||
### Services
|
|
||||||
|
|
||||||
- `services/evaluation-service.ts` → Méthodes `*Uuid()` ajoutées
|
|
||||||
- `lib/server-auth.ts` → `getUserUuidFromCookie()` et adaptations
|
|
||||||
- `lib/auth-utils.ts` → Types de retour UUID
|
|
||||||
|
|
||||||
### APIs
|
|
||||||
|
|
||||||
- `app/api/auth/route.ts` → Cookies UUID
|
|
||||||
- `app/api/evaluations/route.ts` → `getUserByUuid()`
|
|
||||||
- `app/api/evaluations/skills/route.ts` → Toutes méthodes `*Uuid()`
|
|
||||||
|
|
||||||
### Infrastructure
|
|
||||||
|
|
||||||
- `middleware.ts` → Variables UUID
|
|
||||||
- `scripts/init.sql` → Schema DB initial avec UUIDs
|
|
||||||
|
|
||||||
## 🧹 Nettoyage futur
|
|
||||||
|
|
||||||
Une fois la migration validée, supprimer :
|
|
||||||
|
|
||||||
- Méthodes `upsertUser()` et `getUserById()` legacy
|
|
||||||
- Colonnes `id` et `user_id` dans les tables (garder seulement UUIDs)
|
|
||||||
105
README.md
105
README.md
@@ -1,105 +0,0 @@
|
|||||||
# Design System Template
|
|
||||||
|
|
||||||
Template Next.js avec un design system complet basé sur shadcn/ui, Tailwind CSS et Radix UI.
|
|
||||||
|
|
||||||
## 🚀 Usage rapide
|
|
||||||
|
|
||||||
1. **Copier le template**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp -r design-system-template my-new-app
|
|
||||||
cd my-new-app
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Installer les dépendances**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm install
|
|
||||||
# ou npm install / yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Lancer le dev server**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm dev
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Personnaliser**
|
|
||||||
- Changer le nom dans `package.json`
|
|
||||||
- Modifier `app/layout.tsx` (title, description)
|
|
||||||
- Customiser `app/page.tsx`
|
|
||||||
|
|
||||||
## 📦 Inclus
|
|
||||||
|
|
||||||
### Composants UI (shadcn/ui)
|
|
||||||
|
|
||||||
- **Tous les composants** : Button, Card, Dialog, Form, Input, Select, etc.
|
|
||||||
- **Layout** : ThemeProvider, ThemeToggle
|
|
||||||
- **Hooks** : use-mobile, use-toast
|
|
||||||
- **Utils** : clsx, tailwind-merge
|
|
||||||
|
|
||||||
### Styling
|
|
||||||
|
|
||||||
- **Tailwind CSS v4** avec PostCSS
|
|
||||||
- **Variables CSS** pour theming
|
|
||||||
- **Dark/Light mode** automatique
|
|
||||||
- **Animations custom** (glitch, holo, matrix)
|
|
||||||
- **Scrollbar custom**
|
|
||||||
|
|
||||||
### Config
|
|
||||||
|
|
||||||
- **TypeScript** setup complet
|
|
||||||
- **Path aliases** (@/components, @/lib, etc.)
|
|
||||||
- **ESLint/Prettier** ready
|
|
||||||
- **Next.js 15** avec App Router
|
|
||||||
|
|
||||||
## 🎨 Customisation
|
|
||||||
|
|
||||||
### Couleurs
|
|
||||||
|
|
||||||
Modifier les variables CSS dans `app/globals.css`:
|
|
||||||
|
|
||||||
```css
|
|
||||||
:root {
|
|
||||||
--primary: oklch(0.205 0 0);
|
|
||||||
--background: oklch(0.98 0.005 240);
|
|
||||||
/* ... */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Composants
|
|
||||||
|
|
||||||
Tous les composants sont dans `/components/ui/` et modifiables.
|
|
||||||
|
|
||||||
### Ajout de nouveaux composants
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npx shadcn@latest add [component-name]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🛠 Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
├── app/
|
|
||||||
│ ├── globals.css # Styles + variables CSS
|
|
||||||
│ ├── layout.tsx # Layout racine
|
|
||||||
│ └── page.tsx # Page d'accueil
|
|
||||||
├── components/
|
|
||||||
│ ├── ui/ # Tous les composants shadcn
|
|
||||||
│ └── layout/ # ThemeProvider, etc.
|
|
||||||
├── lib/
|
|
||||||
│ └── utils.ts # Utilities (cn, etc.)
|
|
||||||
├── hooks/ # Hooks réutilisables
|
|
||||||
└── package.json # Dépendances complètes
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Documentation
|
|
||||||
|
|
||||||
- [shadcn/ui](https://ui.shadcn.com/)
|
|
||||||
- [Tailwind CSS](https://tailwindcss.com/)
|
|
||||||
- [Radix UI](https://www.radix-ui.com/)
|
|
||||||
- [Next.js](https://nextjs.org/)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Prêt à développer !** 🎉
|
|
||||||
54
TODO.md
54
TODO.md
@@ -1,54 +0,0 @@
|
|||||||
# TODO List
|
|
||||||
|
|
||||||
## Completed ✅
|
|
||||||
|
|
||||||
### 1. Analyse de la structure existante
|
|
||||||
|
|
||||||
- [x] Analyser la structure existante des pages admin et des APIs
|
|
||||||
- [x] Identifier les composants existants et leurs responsabilités
|
|
||||||
|
|
||||||
### 2. Création de la page de gestion
|
|
||||||
|
|
||||||
- [x] Créer une nouvelle page admin avec onglets pour Skills et Teams
|
|
||||||
- [x] Implémenter les composants de gestion des Skills (CRUD)
|
|
||||||
- [x] Implémenter les composants de gestion des Teams (CRUD)
|
|
||||||
- [x] Créer/adapter les APIs nécessaires pour les opérations CRUD
|
|
||||||
|
|
||||||
### 3. Vue arborescente des Skills
|
|
||||||
|
|
||||||
- [x] Refactorer Skills Management avec une vue arborescente par catégorie
|
|
||||||
- [x] Implémenter le système expand/collapse pour les catégories
|
|
||||||
- [x] Adapter la recherche pour fonctionner avec la vue arborescente
|
|
||||||
- [x] Ajouter l'icône du skill au début de chaque ligne
|
|
||||||
|
|
||||||
### 4. Factorisation des composants
|
|
||||||
|
|
||||||
- [x] Créer des composants réutilisables pour la vue arborescente dans Skills et Teams Management
|
|
||||||
- [x] Factoriser le code entre les deux pages de gestion
|
|
||||||
- [x] Créer des composants génériques : TreeViewContainer, TreeCategoryHeader, TreeItemRow, TreeSearchControls, TeamMetrics
|
|
||||||
|
|
||||||
### 5. Suppression de direction
|
|
||||||
|
|
||||||
- [x] Ajouter la possibilité de supprimer une direction entière avec toutes ses équipes
|
|
||||||
- [x] Implémenter la vérification de sécurité (impossible si des équipes ont des membres)
|
|
||||||
- [x] Ajouter le bouton de suppression dans TreeCategoryHeader pour les directions
|
|
||||||
|
|
||||||
### 6. Réorganisation de la structure
|
|
||||||
|
|
||||||
- [x] Réorganiser tous les composants admin dans des dossiers logiques
|
|
||||||
- [x] Créer une structure claire : overview/, layout/, management/, team-detail/, utils/
|
|
||||||
- [x] Mettre à jour tous les imports et exports
|
|
||||||
- [x] Créer des fichiers d'index pour chaque dossier
|
|
||||||
- [x] Documenter la nouvelle structure avec un README
|
|
||||||
|
|
||||||
## Pending 🔄
|
|
||||||
|
|
||||||
### Aucune tâche en attente
|
|
||||||
|
|
||||||
## Next Steps 🚀
|
|
||||||
|
|
||||||
La structure des composants admin est maintenant parfaitement organisée et documentée. Tous les composants sont factorisés et réutilisables. La fonctionnalité de suppression de direction est implémentée et sécurisée.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Note** : Cette TODO list a été complètement réalisée ! 🎉
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
# API Clients Architecture
|
|
||||||
|
|
||||||
Cette architecture respecte les principes SOLID en séparant les responsabilités par domaine métier et en évitant le code mort.
|
|
||||||
|
|
||||||
## Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
clients/
|
|
||||||
├── base/
|
|
||||||
│ └── http-client.ts # Classe de base avec logique HTTP commune
|
|
||||||
├── domains/
|
|
||||||
│ ├── evaluation-client.ts # Client pour les évaluations (lecture + modification)
|
|
||||||
│ ├── teams-client.ts # Client pour la gestion des équipes (lecture + CRUD)
|
|
||||||
│ ├── skills-client.ts # Client pour les compétences (lecture + création)
|
|
||||||
│ ├── auth-client.ts # Client pour l'authentification (login, logout, getCurrentUser)
|
|
||||||
│ └── admin-client.ts # Client pour la gestion admin (skills, teams, users)
|
|
||||||
├── index.ts # Exports publics de tous les clients
|
|
||||||
├── client.ts # Wrapper client-side sécurisé
|
|
||||||
└── README.md # Ce fichier
|
|
||||||
```
|
|
||||||
|
|
||||||
## Services associés
|
|
||||||
|
|
||||||
- **`services/auth-service.ts`** - Service d'authentification côté client (renommé depuis auth-utils)
|
|
||||||
- **`services/evaluation-service.ts`** - Service d'évaluation côté serveur
|
|
||||||
- **`services/teams-service.ts`** - Service des équipes côté serveur
|
|
||||||
- **`services/skills-service.ts`** - Service des compétences côté serveur
|
|
||||||
|
|
||||||
## Principes
|
|
||||||
|
|
||||||
- **Single Responsibility** : Chaque client gère un seul domaine métier
|
|
||||||
- **Open/Closed** : Facile d'étendre sans modifier le code existant
|
|
||||||
- **Liskov Substitution** : Tous les clients héritent de BaseHttpClient
|
|
||||||
- **Interface Segregation** : Chaque client expose uniquement ses méthodes
|
|
||||||
- **Dependency Inversion** : Dépend de l'abstraction BaseHttpClient
|
|
||||||
|
|
||||||
## Clients par responsabilité
|
|
||||||
|
|
||||||
### EvaluationClient
|
|
||||||
|
|
||||||
- **`loadUserEvaluation()`** - Chargement d'une évaluation utilisateur
|
|
||||||
- **`saveUserEvaluation()`** - Sauvegarde d'une évaluation
|
|
||||||
- **`updateSkillLevel()`** - Mise à jour du niveau d'une skill
|
|
||||||
- **`updateSkillMentorStatus()`** - Mise à jour du statut mentor
|
|
||||||
- **`updateSkillLearningStatus()`** - Mise à jour du statut d'apprentissage
|
|
||||||
- **`addSkillToEvaluation()`** - Ajout d'une skill à l'évaluation
|
|
||||||
- **`removeSkillFromEvaluation()`** - Suppression d'une skill
|
|
||||||
|
|
||||||
### SkillsClient
|
|
||||||
|
|
||||||
- **`loadSkillCategories()`** - Chargement des catégories de skills
|
|
||||||
- **`createSkill()`** - Création d'une nouvelle skill
|
|
||||||
|
|
||||||
### TeamsClient
|
|
||||||
|
|
||||||
- **`loadTeams()`** - Chargement des équipes
|
|
||||||
- **`createTeam()`** - Création d'une équipe
|
|
||||||
- **`updateTeam()`** - Mise à jour d'une équipe
|
|
||||||
- **`deleteTeam()`** - Suppression d'une équipe
|
|
||||||
|
|
||||||
### AuthClient
|
|
||||||
|
|
||||||
- **`login()`** - Authentification d'un utilisateur
|
|
||||||
- **`getCurrentUser()`** - Récupération de l'utilisateur actuel
|
|
||||||
- **`logout()`** - Déconnexion d'un utilisateur
|
|
||||||
|
|
||||||
### AdminClient
|
|
||||||
|
|
||||||
- **`getSkills()`** - Récupération de toutes les skills
|
|
||||||
- **`createSkill()`** - Création d'une nouvelle skill
|
|
||||||
- **`updateSkill()`** - Mise à jour d'une skill
|
|
||||||
- **`deleteSkill()`** - Suppression d'une skill
|
|
||||||
- **`getTeams()`** - Récupération de toutes les équipes
|
|
||||||
- **`createTeam()`** - Création d'une nouvelle équipe
|
|
||||||
- **`updateTeam()`** - Mise à jour d'une équipe
|
|
||||||
- **`deleteTeam()`** - Suppression d'une équipe
|
|
||||||
- **`deleteDirection()`** - Suppression d'une direction
|
|
||||||
- **`getTeamMembers()`** - Récupération des membres d'une équipe
|
|
||||||
- **`removeTeamMember()`** - Suppression d'un membre d'équipe
|
|
||||||
- **`deleteUser()`** - Suppression d'un utilisateur
|
|
||||||
|
|
||||||
## Utilisation
|
|
||||||
|
|
||||||
### Import direct
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import {
|
|
||||||
evaluationClient,
|
|
||||||
teamsClient,
|
|
||||||
skillsClient,
|
|
||||||
authClient,
|
|
||||||
adminClient,
|
|
||||||
} from "@/clients";
|
|
||||||
```
|
|
||||||
|
|
||||||
### Import client-side sécurisé
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import {
|
|
||||||
evaluationClient,
|
|
||||||
teamsClient,
|
|
||||||
skillsClient,
|
|
||||||
authClient,
|
|
||||||
adminClient,
|
|
||||||
} from "@/services/client";
|
|
||||||
```
|
|
||||||
|
|
||||||
## Avantages
|
|
||||||
|
|
||||||
- **Code mort supprimé** : Plus de méthodes dupliquées
|
|
||||||
- **Architecture simple** : Chaque client gère son domaine complet
|
|
||||||
- **Performance** : Seules les méthodes nécessaires sont importées
|
|
||||||
- **Maintenabilité** : Architecture claire et logique
|
|
||||||
- **Testabilité** : Chaque client peut être testé indépendamment
|
|
||||||
- **Séparation claire** : Client HTTP vs services métier
|
|
||||||
113
lib/README.md
113
lib/README.md
@@ -1,113 +0,0 @@
|
|||||||
# Server-Side Utilities Architecture
|
|
||||||
|
|
||||||
Cette architecture respecte les principes SOLID en séparant clairement les responsabilités côté serveur et en évitant le code mort.
|
|
||||||
|
|
||||||
## Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
lib/
|
|
||||||
├── evaluation-utils.ts # Utilitaires pour les évaluations
|
|
||||||
├── evaluation-actions.ts # Actions d'évaluation
|
|
||||||
├── score-utils.ts # Utilitaires pour les scores
|
|
||||||
├── skill-file-loader.ts # Chargement des fichiers de skills
|
|
||||||
├── types.ts # Types TypeScript généraux
|
|
||||||
├── admin-types.ts # Types pour l'administration
|
|
||||||
├── utils.ts # Utilitaires généraux
|
|
||||||
├── category-icons.ts # Icônes des catégories
|
|
||||||
├── tech-colors.ts # Couleurs des technologies
|
|
||||||
├── pattern-colors.ts # Couleurs des patterns
|
|
||||||
└── README.md # Ce fichier
|
|
||||||
```
|
|
||||||
|
|
||||||
## Responsabilités
|
|
||||||
|
|
||||||
### evaluation-utils.ts
|
|
||||||
|
|
||||||
- **Utilitaires** pour les évaluations côté client
|
|
||||||
- **Génération de données** pour les graphiques radar
|
|
||||||
|
|
||||||
### evaluation-actions.ts
|
|
||||||
|
|
||||||
- **Actions d'évaluation** côté serveur
|
|
||||||
- **Gestion des profils** utilisateur
|
|
||||||
|
|
||||||
### score-utils.ts
|
|
||||||
|
|
||||||
- **Calcul des scores** et niveaux de compétences
|
|
||||||
- **Logique métier** pour les évaluations
|
|
||||||
|
|
||||||
### skill-file-loader.ts
|
|
||||||
|
|
||||||
- **Chargement des fichiers** de compétences depuis le système de fichiers
|
|
||||||
- **Parsing des données** JSON
|
|
||||||
|
|
||||||
### types.ts
|
|
||||||
|
|
||||||
- **Types TypeScript** généraux de l'application
|
|
||||||
- **Interfaces** pour les entités principales
|
|
||||||
|
|
||||||
### admin-types.ts
|
|
||||||
|
|
||||||
- **Types pour l'administration** et les statistiques
|
|
||||||
- **Interfaces** pour TeamMember, TeamStats, DirectionStats
|
|
||||||
|
|
||||||
## Services d'authentification
|
|
||||||
|
|
||||||
### AuthClient (client-side uniquement)
|
|
||||||
|
|
||||||
- **`login()`** - Authentification côté client
|
|
||||||
- **`getCurrentUser()`** - Récupération utilisateur côté client
|
|
||||||
- **`logout()`** - Déconnexion côté client
|
|
||||||
|
|
||||||
### AuthService (server-side uniquement)
|
|
||||||
|
|
||||||
- **`getUserUuidFromCookie()`** - Récupère l'UUID depuis le cookie côté serveur
|
|
||||||
- **`isUserAuthenticated()`** - Vérifie l'authentification côté serveur
|
|
||||||
|
|
||||||
## Séparation client/serveur
|
|
||||||
|
|
||||||
- **`clients/domains/auth-client.ts`** - Côté client uniquement (React components, hooks)
|
|
||||||
- **`services/auth-service.ts`** - Côté serveur uniquement (API routes, pages)
|
|
||||||
- **Pas de duplication** entre les deux services
|
|
||||||
|
|
||||||
## Utilisation
|
|
||||||
|
|
||||||
### Import direct des services
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { AuthService } from "@/services";
|
|
||||||
import { SkillsService, TeamsService } from "@/services";
|
|
||||||
import { evaluationService } from "@/services/evaluation-service";
|
|
||||||
```
|
|
||||||
|
|
||||||
### Utilisation dans les pages
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export default async function HomePage() {
|
|
||||||
const userUuid = await AuthService.getUserUuidFromCookie();
|
|
||||||
|
|
||||||
if (!userUuid) {
|
|
||||||
redirect("/login");
|
|
||||||
}
|
|
||||||
|
|
||||||
const [userEvaluation, skillCategories, teams] = await Promise.all([
|
|
||||||
evaluationService.getServerUserEvaluation(userUuid!),
|
|
||||||
SkillsService.getSkillCategories(),
|
|
||||||
TeamsService.getTeams(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Avantages
|
|
||||||
|
|
||||||
- **Séparation claire** : Chaque fichier a une seule responsabilité
|
|
||||||
- **Pas de code mort** : Utilisation directe des services existants
|
|
||||||
- **Maintenabilité** : Code organisé et facile à comprendre
|
|
||||||
- **Réutilisabilité** : Fonctions modulaires et indépendantes
|
|
||||||
- **Testabilité** : Chaque module peut être testé séparément
|
|
||||||
- **Évolutivité** : Facile d'ajouter de nouvelles fonctionnalités
|
|
||||||
- **Architecture logique** : L'authentification est dans les services d'auth
|
|
||||||
- **Séparation client/serveur** : Pas de confusion entre les deux environnements
|
|
||||||
- **Noms cohérents** : AuthService pour le serveur, AuthClient pour le client
|
|
||||||
- **Imports directs** : Plus de wrapper inutile, appel direct des services
|
|
||||||
- **Simplicité** : Architecture claire et directe
|
|
||||||
Reference in New Issue
Block a user