Skip to content

💡 [REQUEST] - Convention d'error handling inter-apps #2325

Description

@KepoParis

Description

Les erreurs ne sont pas formatées de la même façon selon le serveur qui répond :

  • Legacy (apps/server), erreurs gĂ©rĂ©es (ErrorResType) : { "message": "..." }
  • Legacy, erreurs non gĂ©rĂ©es (setErrorHandler dans app.ts) : { "status": 500, "error": "<message>", "stack": "..." }
  • NestJS (apps/server-nestjs) : sĂ©rialisation par dĂ©faut des HttpException : { "message": "<message mĂ©tier>", "error": "<raison HTTP gĂ©nĂ©rique>", "statusCode": ... }
  • NestJS, validation Zod (ZodValidationPipe) : BadRequestException(error.flatten()) → le body est l'objet flatten brut ({ formErrors, fieldErrors }), sans message ni error

Côté client, extractData (xhr-client.ts) doit deviner où se trouve le message (body.message ?? body.error ?? 'Erreur inconnue' depuis #2321). Les erreurs de validation Zod v2 s'affichent encore « Erreur inconnue ».

Proposition : ajouter un ExceptionFilter global dans apps/server-nestjs pour normaliser le format des erreurs v2, et y traiter le cas Zod (aplatir les fieldErrors en message lisible).

⚠️ Décision d'équipe requise : le format cible n'est pas qu'un détail technique — il faut un choix d'équipe sur la façon dont on gère les exceptions et le error handling à travers nos apps (server legacy, server-nestjs, client), notamment :

  • quel contrat d'erreur pour l'API v2 (alignĂ© sur le legacy { message } ? format NestJS enrichi ? RFC 7807 / problem+json ?) ;
  • comment exposer les erreurs de validation (Zod) au client de manière exploitable (affichage par champ ?) ;
  • ce qu'on logue vs ce qu'on expose (le legacy renvoie la stack en prod — Ă  rediscuter) ;
  • la stratĂ©gie de convergence du client une fois le format v2 stabilisĂ© (simplification d'extractData).

À mettre à l'ordre du jour d'une prochaine réunion technique avant implémentation.

PRs liées

À compléter une fois la décision prise.

Issues liées

Exemples simples

Sur POST /api/v2/projects/:projectId/environments avec des quotas dépassés, le client affichait « Bad Request » au lieu de « Le projet ne dispose pas de suffisamment de ressources : GPU. ». Avec un body invalide (Zod), il affiche encore « Erreur inconnue ».

Spécifications techniques

  • ExceptionFilter global enregistrĂ© dans apps/server-nestjs (via APP_FILTER ou useGlobalFilters), normalisant toutes les HttpException (et erreurs non gĂ©rĂ©es) vers le format d'erreur retenu par l'Ă©quipe.
  • Traitement dĂ©diĂ© du body flatten() de ZodValidationPipe.
  • Adaptation d'extractData cĂ´tĂ© client une fois le format stabilisĂ©.

Définition du fini

  • La fonctionnalitĂ© est terminĂ©e
  • Les tests liĂ©s Ă  cette fonctionnalitĂ© ont Ă©tĂ© ajoutĂ©s
  • La documentation liĂ©e Ă  cette fonctionnalitĂ© a Ă©tĂ© ajoutĂ©e (cf. https://github.com/cloud-pi-native/documentation)
  • La communication avec les autres Ă©quipes impliquĂ©es par cette fonctionnalitĂ© a Ă©tĂ© faite

Metadata

Metadata

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions