IMPLEMENTATION_SUMMARY.md 7.7 KB

📋 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

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

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

@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

// 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

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

{
  "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

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

  • Endpoint REST /companies/{id}/drivers
  • Pagination complète (page, limit, total, totalPages)
  • Filtrage par rôle DRIVER
  • Inclusion des relations (company, driver, vehicules)
  • Gestion des erreurs (404 pour compagnie inexistante)
  • Authentification et autorisation RBAC
  • Documentation Swagger/OpenAPI
  • Service frontend avec gestion de la pagination
  • Composant Vue avec interface moderne
  • Tests E2E complets
  • Documentation API détaillée

🚀 Utilisation

Backend

cd node_app
npm run start:dev

Frontend

cd app_transport_front
npm run dev

Test de l'endpoint

# 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