ajust countries function

This commit is contained in:
root 2026-03-06 12:39:21 +01:00
parent f782796ef6
commit 5dec4e36ef
1 changed files with 57 additions and 1 deletions

View File

@ -18,6 +18,8 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
class HelperController extends Controller class HelperController extends Controller
{ {
@ -344,7 +346,61 @@ class HelperController extends Controller
public function allCountries() 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); return $this->successResponse($countries);
} }
} }