From 5dec4e36efad113434cdb5808a812793ebb7c94c Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 Mar 2026 12:39:21 +0100 Subject: [PATCH] ajust countries function --- app/Http/Controllers/HelperController.php | 58 ++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/HelperController.php b/app/Http/Controllers/HelperController.php index 383b295..f6f810e 100755 --- a/app/Http/Controllers/HelperController.php +++ b/app/Http/Controllers/HelperController.php @@ -18,6 +18,8 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Maatwebsite\Excel\Facades\Excel; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Http; class HelperController extends Controller { @@ -344,7 +346,61 @@ class HelperController extends Controller public function allCountries() { - $countries = Country::select('id', 'name', 'code_dial', 'code_country')->get(); + // On utilise Cache::remember mais avec une vérification pour ne pas stocker de résultats vides + $countries = Cache::remember('countries_list', 86400, function () { + try { + // Ajout d'un timeout et désactivation SSL si nécessaire (pour certains environnements locaux) + $response = Http::timeout(60) + ->withOptions(['verify' => false]) // Utile si vous avez des erreurs de certificat SSL + ->get('https://restcountries.com/v3.1/all?fields=name,cca3,idd,translations,flag'); + + if ($response->failed()) { + Log::error("Échec API RestCountries : " . $response->status()); + return null; // On retourne null pour que le cache ne soit pas enregistré + } + + $data = $response->json(); + + if (empty($data)) return null; + + return collect($data)->map(function ($country) { + // Gestion plus robuste du code de numérotation (Dial Code) + $dial = null; + if (!empty($country['idd']['root'])) { + $root = $country['idd']['root']; + // Certains pays (comme USA +1) ont beaucoup de suffixes, on prend le premier + $suffix = $country['idd']['suffixes'][0] ?? ''; + $dial = $root . $suffix; + } + + return [ + 'code_country' => $country['cca3'] ?? null, + 'code_dial' => $dial, + 'name_en' => $country['name']['common'] ?? null, + 'name_fr' => $country['translations']['fra']['common'] + ?? $country['name']['common'] + ?? null, + 'flag' => $country['flag'] ?? null, // Petit plus : l'emoji du drapeau + ]; + }) + ->filter(fn($c) => !empty($c['code_country'])) // On nettoie les éventuels pays mal formés + ->sortBy('name_fr', SORT_NATURAL | SORT_FLAG_CASE) // Tri naturel (A, B, C...) + ->values() + ->toArray(); + + } catch (\Exception $e) { + Log::error("Exception lors de la récupération des pays : " . $e->getMessage()); + return null; + } + }); + + // 3. Si l'API a échoué et que le cache est vide, on renvoie une erreur au lieu d'un [] vide + if (is_null($countries) || empty($countries)) { + // Optionnel : Nettoyer le cache s'il est corrompu + Cache::forget('countries_list'); + return $this->errorResponse("Impossible de charger la liste des pays pour le moment.", 503); + } + return $this->successResponse($countries); } }