# 📋 RĂ©sumĂ© de l'implĂ©mentation - Endpoint `/companies/{id}/drivers` ## 🎯 Objectif Ajout d'un endpoint REST pour rĂ©cupĂ©rer la liste des chauffeurs d'une compagnie spĂ©cifique avec support de la pagination. ## đŸ—ïž Architecture implĂ©mentĂ©e ### 1. **Use Case** - Logique mĂ©tier **Fichier**: `src/application/use-cases/company/find-drivers-by-company.use-case.ts` ```typescript export class FindDriversByCompanyUseCase { async execute(companyId: number, page: number = 1, limit: number = 10) { return await this.companyRepository.findDriversByCompanyId(companyId, page, limit); } } ``` **ResponsabilitĂ©s**: - Orchestration de la rĂ©cupĂ©ration des chauffeurs - Validation des paramĂštres d'entrĂ©e - Appel au repository avec pagination ### 2. **Repository** - AccĂšs aux donnĂ©es **Fichier**: `src/infrastructure/repositories/company.repository.ts` ```typescript async findDriversByCompanyId(companyId: number, page: number = 1, limit: number = 10) { const skip = (page - 1) * limit; const [drivers, total] = await Promise.all([ this.prisma.user.findMany({ where: { companyId, role: 'DRIVER' }, include: { company: true, managedCompany: true, driver: { include: { vehicules: true } } }, skip, take: limit, orderBy: { createdAt: 'desc' } }), this.prisma.user.count({ where: { companyId, role: 'DRIVER' } }) ]); return { data: drivers, total, page, limit, totalPages: Math.ceil(total / limit) }; } ``` **ResponsabilitĂ©s**: - RequĂȘte Prisma avec filtrage par `companyId` et `role: 'DRIVER'` - Inclusion des relations (company, managedCompany, driver avec vehicules) - Gestion de la pagination (skip/take) - Calcul du nombre total de pages ### 3. **Controller** - Interface REST **Fichier**: `src/presentation/controllers/company.controller.ts` ```typescript @Get(':id/drivers') @ApiOperation({ summary: 'RĂ©cupĂ©rer les chauffeurs d\'une compagnie' }) @ApiResponse({ status: 200, description: 'Liste des chauffeurs rĂ©cupĂ©rĂ©e avec succĂšs' }) @ApiResponse({ status: 404, description: 'Compagnie non trouvĂ©e' }) @Roles(UserRole.ADMIN, UserRole.MANAGER, UserRole.EMPLOYEE) async getDrivers( @Param('id') id: string, @Query('page') page: string = '1', @Query('limit') limit: string = '10' ) { const companyId = parseInt(id, 10); const pageNum = parseInt(page, 10); const limitNum = parseInt(limit, 10); // VĂ©rifier que la compagnie existe const company = await this.findCompanyByIdUseCase.execute(companyId); if (!company) { throw new NotFoundException('Compagnie non trouvĂ©e'); } const result = await this.findDriversByCompanyUseCase.execute(companyId, pageNum, limitNum); return { success: true, message: 'Chauffeurs rĂ©cupĂ©rĂ©s avec succĂšs', data: result }; } ``` **ResponsabilitĂ©s**: - Validation et conversion des paramĂštres - VĂ©rification de l'existence de la compagnie - Gestion des autorisations (RBAC) - Documentation Swagger/OpenAPI - Formatage de la rĂ©ponse ## 🔧 Configuration et injection de dĂ©pendances ### Module principal **Fichier**: `src/app.module.ts` ```typescript // Import ajoutĂ© import { FindDriversByCompanyUseCase } from './application/use-cases/company/find-drivers-by-company.use-case'; // Provider ajoutĂ© providers: [ // ... autres providers FindDriversByCompanyUseCase, // ... ] ``` ## 🌐 Frontend - Service et composant ### Service mis Ă  jour **Fichier**: `app_transport_front/src/services/CompanyService.ts` ```typescript async getCompanyDrivers(id: number, page: number = 1, limit: number = 10): Promise<{ drivers: any[], pagination: { total: number, page: number, limit: number, totalPages: number } }> { const response = await authenticatedFetch(`${API_URL}/companies/${id}/drivers?page=${page}&limit=${limit}`); const result = await response.json(); return { drivers: result.data?.data || [], pagination: { total: result.data?.total || 0, page: result.data?.page || 1, limit: result.data?.limit || 10, totalPages: result.data?.totalPages || 1 } }; } ``` ### Composant Vue créé **Fichier**: `app_transport_front/src/components/CompanyDriversList.vue` **FonctionnalitĂ©s**: - Affichage de la liste des chauffeurs avec pagination - États de chargement et d'erreur - Affichage des informations du chauffeur et du vĂ©hicule assignĂ© - Interface utilisateur moderne avec TailwindCSS ## 📡 API Endpoint ### URL ``` GET /companies/{id}/drivers ``` ### ParamĂštres - **Path**: `id` (number) - ID de la compagnie - **Query**: `page` (number, optionnel) - NumĂ©ro de page (dĂ©faut: 1) - **Query**: `limit` (number, optionnel) - Nombre d'Ă©lĂ©ments par page (dĂ©faut: 10) ### Authentification - RĂŽles autorisĂ©s: `ADMIN`, `MANAGER`, `EMPLOYEE` - Token JWT requis ### RĂ©ponse ```json { "success": true, "message": "Chauffeurs rĂ©cupĂ©rĂ©s avec succĂšs", "data": { "data": [ { "id": 1, "firstName": "Jean", "lastName": "Dupont", "email": "jean.dupont@example.com", "telephone": "0123456789", "role": "DRIVER", "companyId": 1, "company": { ... }, "driver": { "vehicules": [ { "id": 1, "model": "Mercedes Sprinter", "immatriculation": "AB-123-CD" } ] } } ], "total": 25, "page": 1, "limit": 10, "totalPages": 3 } } ``` ## đŸ§Ș Tests ### Tests E2E **Fichier**: `test/e2e/company-drivers.e2e-spec.ts` **ScĂ©narios testĂ©s**: - ✅ RĂ©cupĂ©ration des chauffeurs d'une compagnie existante - ✅ Gestion d'une compagnie inexistante (404) - ✅ Pagination avec diffĂ©rents paramĂštres - ✅ Authentification et autorisation ### Script de test manuel **Fichier**: `test-endpoint.js` ```bash node test-endpoint.js ``` ## 📚 Documentation ### Documentation API **Fichier**: `docs/endpoints/companies-drivers.md` **Contenu**: - Description dĂ©taillĂ©e de l'endpoint - Exemples d'utilisation - Codes de rĂ©ponse - Notes techniques ## 🔄 Workflow de dĂ©veloppement 1. **Use Case** → Logique mĂ©tier pure 2. **Repository** → AccĂšs aux donnĂ©es avec Prisma 3. **Controller** → Interface REST avec validation 4. **Module** → Injection de dĂ©pendances 5. **Frontend** → Service et composant Vue 6. **Tests** → Validation E2E et tests manuels 7. **Documentation** → Guide d'utilisation ## ✅ FonctionnalitĂ©s implĂ©mentĂ©es - [x] Endpoint REST `/companies/{id}/drivers` - [x] Pagination complĂšte (page, limit, total, totalPages) - [x] Filtrage par rĂŽle DRIVER - [x] Inclusion des relations (company, driver, vehicules) - [x] Gestion des erreurs (404 pour compagnie inexistante) - [x] Authentification et autorisation RBAC - [x] Documentation Swagger/OpenAPI - [x] Service frontend avec gestion de la pagination - [x] Composant Vue avec interface moderne - [x] Tests E2E complets - [x] Documentation API dĂ©taillĂ©e ## 🚀 Utilisation ### Backend ```bash cd node_app npm run start:dev ``` ### Frontend ```bash cd app_transport_front npm run dev ``` ### Test de l'endpoint ```bash # Test manuel node test-endpoint.js # Tests E2E npm run test:e2e -- company-drivers.e2e-spec.ts ``` ## 🔗 IntĂ©gration L'endpoint est maintenant disponible et peut ĂȘtre utilisĂ© par : - Le composant `CompanyDriversList.vue` pour afficher les chauffeurs - D'autres composants nĂ©cessitant la liste des chauffeurs d'une compagnie - Applications tierces via l'API REST ## 📈 Performance - RequĂȘtes optimisĂ©es avec Prisma - Pagination pour Ă©viter la surcharge - Index sur `companyId` et `role` recommandĂ©s - Mise en cache possible au niveau du service