access = new Access($pdo); } /** * GET api/search_address.php — propositions d'adresses. * Paramètres GET : q (saisie en cours), limit (facultatif, 1 à 8). */ public function search(): void { $this->access->requireService(); $query = trim((string) ($_GET['q'] ?? '')); $length = function_exists('mb_strlen') ? mb_strlen($query, 'UTF-8') : strlen($query); if ($length < AddressApiService::MIN_QUERY_LENGTH) { JsonResponse::send(422, [ 'error' => sprintf('Saisissez au moins %d caractères.', AddressApiService::MIN_QUERY_LENGTH), ]); } // Plafond de saisie : la BAN n'exploite pas au-delà, et cela borne le // coût d'une requête forgée. if ($length > 120) { JsonResponse::send(422, ['error' => 'Saisie trop longue pour une recherche d’adresse.']); } $limit = filter_var($_GET['limit'] ?? 5, FILTER_VALIDATE_INT); if ($limit === false) { $limit = 5; } try { $suggestions = (new AddressApiService())->search($query, $limit); } catch (Throwable $e) { JsonResponse::send(502, [ 'error' => 'Le service national des adresses est momentanément indisponible. Vous pouvez saisir l’adresse manuellement.', 'details' => (getenv('PTA_DEBUG') ?: '0') !== '0' ? $e->getMessage() : null, ]); } JsonResponse::send(200, [ 'query' => $query, 'suggestions' => $suggestions, ]); } }