Implement robust error handling and configuration for Logistics API interactions

- Introduced `LogisticsApiException` to handle connection and request errors with user-friendly messages in French.
- Updated `LogisticsService` to include configurable timeout, connection timeout, retry attempts, and sleep duration for retries.
- Enhanced error handling in Filament pages to catch `LogisticsApiException` and provide clear feedback to users.
- Updated `.env` and `config/logistics.php` to support new configuration options.
- Added logging for failed API requests in `api_request_logs`.
- Created comprehensive API documentation for Logistics endpoints.
This commit is contained in:
2026-02-20 10:06:04 +01:00
parent 07a3b3a874
commit 4aef33f270
18 changed files with 820 additions and 64 deletions

View File

@@ -1,6 +1,6 @@
# System Patterns
Derniere mise a jour : 2026-02-19
Derniere mise a jour : 2026-02-20
## Architecture applicative
@@ -14,8 +14,12 @@ Utilisateur --> Filament Dashboard (/admin)
LogisticsService (app/Services/)
|
+---> API Logistics (HTTP POST + X-API-KEY)
| (retry automatique sur ConnectionException)
|
+---> api_request_logs (MySQL)
| (succes ET echecs)
|
+---> LogisticsApiException (en cas d'erreur)
```
## Patterns utilises
@@ -26,8 +30,19 @@ Utilisateur --> Filament Dashboard (/admin)
- Construit l'URL a partir de `config('logistics.base_url')`, `config('logistics.folder')` et le nom de l'endpoint.
- Ajoute automatiquement le header `X-API-KEY`.
- Enregistre chaque requete dans la table `api_request_logs`.
- Configure `timeout()` et `connectTimeout()` depuis la config.
- Effectue un retry automatique (nombre et delai configurables) uniquement sur les `ConnectionException`.
- Enregistre chaque requete dans la table `api_request_logs` (succes et echecs).
- Retourne un tableau PHP avec les cles `data`, `metadata`, `error`.
- Lance une `LogisticsApiException` en cas d'erreur de connexion ou de requete.
### Exception dediee
`App\Exceptions\LogisticsApiException` (etend `RuntimeException`) fournit :
- Des messages d'erreur en francais lisibles par l'utilisateur.
- Des proprietes `endpoint` et `params` pour le contexte de l'erreur.
- Deux methodes statiques : `connectionTimeout()` (API injoignable) et `requestFailed()` (erreur de requete).
### Pages Filament personnalisees (pas de Resources)
@@ -36,33 +51,38 @@ L'application n'utilise pas de Resources Filament (pas de CRUD local). Chaque pa
- Etend `Filament\Pages\Page`.
- Utilise des proprietes Livewire publiques pour les champs de formulaire.
- Appelle `LogisticsService` via `app(LogisticsService::class)` dans des methodes d'action (ex: `searchArticles()`).
- Attrape `LogisticsApiException` pour afficher un message clair, et `\Throwable` en fallback.
- Affiche les resultats dans des tableaux HTML dynamiques generes dans les vues Blade.
### Configuration externalisee
Les parametres de connexion a l'API sont dans `config/logistics.php` et lus depuis `.env`.
Les parametres de connexion a l'API (URL, cle, dossier, timeout, retry) sont dans `config/logistics.php` et lus depuis `.env`.
## Structure des repertoires
```
app/
Exceptions/
LogisticsApiException.php # Exception dediee API
Filament/
Pages/
Articles.php # Recherche articles + stock
Documents.php # Recherche documents + detail
Journaux.php # Recherche journaux
TablesExplorer.php # Exploration tables + colonnes
Tiers.php # Recherche tiers + historique
Articles.php # Recherche articles + stock
Documents.php # Recherche documents + detail
Journaux.php # Recherche journaux
TablesExplorer.php # Exploration tables + colonnes
Tiers.php # Recherche tiers + historique
Models/
User.php # Modele utilisateur (Fortify)
User.php # Modele utilisateur (Fortify)
Providers/
Filament/
AdminPanelProvider.php # Configuration du panel (sans auth)
AdminPanelProvider.php # Configuration du panel (sans auth)
FortifyServiceProvider.php # Authentification Fortify
AppServiceProvider.php # Config globale (CarbonImmutable, DB safety)
Services/
LogisticsService.php # Service centralise API Logistics
LogisticsService.php # Service centralise API Logistics
config/
logistics.php # Configuration API Logistics
logistics.php # Configuration API Logistics (URL, cle, timeout, retry)
database/
migrations/
@@ -81,7 +101,7 @@ resources/views/
tiers.blade.php
tests/Feature/
LogisticsServiceTest.php # 8 tests avec mocks HTTP
LogisticsServiceTest.php # 12 tests avec mocks HTTP
```
## Conventions
@@ -90,3 +110,5 @@ tests/Feature/
- Filament v5 : la propriete `$view` est non-static (`protected string $view`).
- Les proprietes statiques (`$navigationIcon`, `$navigationLabel`, `$title`, `$navigationSort`) restent static.
- Les appels API passent toujours par `LogisticsService`, jamais directement par `Http::`.
- Les pages Filament attrapent `LogisticsApiException` en premier, puis `\Throwable` en fallback.
- Les messages d'erreur affiches a l'utilisateur sont en francais.