From 47edec0d33e7468e240b5cbe4693b2b2a3466bbe Mon Sep 17 00:00:00 2001 From: Vincent Guillet Date: Tue, 25 Nov 2025 18:05:56 +0000 Subject: [PATCH] Update api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java --- .../service/prestashop/PrestashopClient.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java b/api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java index 8e9645d..8ea1d8d 100644 --- a/api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java +++ b/api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java @@ -1,5 +1,7 @@ package fr.gameovergne.api.service.prestashop; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -17,10 +19,12 @@ import java.util.Map; @Service public class PrestashopClient { + private static final Logger log = LoggerFactory.getLogger(PrestashopClient.class); + private final HttpClient httpClient = HttpClient.newHttpClient(); private final String baseUrl; - private final String basicAuth; // valeur déjà encodée Base64 (sans le "Basic ") + private final String basicAuth; // valeur déjà en Base64, sans le "Basic " public PrestashopClient( @Value("${prestashop.base-url}") String baseUrl, @@ -31,36 +35,44 @@ public class PrestashopClient { } public ResponseEntity get(String path, String query) { - // path : ex "/suppliers" - // query : ex "display=%5Bid,name,active%5D&output_format=JSON" String url = buildUrl(path, query); - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Authorization", "Basic " + basicAuth) - .GET() - .build(); + log.info("[PrestaShop] Appel URL = {}", url); try { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) // si l’URL est invalide, ça lèvera IllegalArgumentException + .header("Authorization", "Basic " + basicAuth) + .GET() + .build(); + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); - // On reconstruit une ResponseEntity en gardant le status PrestaShop + log.info("[PrestaShop] Réponse HTTP {} pour {}", response.statusCode(), url); + HttpHeaders springHeaders = new HttpHeaders(); for (Map.Entry> entry : response.headers().map().entrySet()) { springHeaders.put(entry.getKey(), entry.getValue()); } - return new ResponseEntity<>(response.body(), springHeaders, - HttpStatus.valueOf(response.statusCode())); + return new ResponseEntity<>( + response.body(), + springHeaders, + HttpStatus.valueOf(response.statusCode()) + ); } catch (IOException | InterruptedException e) { - // En prod tu pourrais logger proprement if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } + log.error("[PrestaShop] Erreur I/O pour {}", url, e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("{\"error\":\"Failed to call PrestaShop Webservice\"}"); + .body("{\"error\":\"" + e.getClass().getSimpleName() + "\",\"message\":\"" + e.getMessage() + "\"}"); + } catch (Exception e) { + // <-- ICI on récupère IllegalArgumentException, etc. + log.error("[PrestaShop] Erreur inattendue pour {}", url, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("{\"error\":\"" + e.getClass().getSimpleName() + "\",\"message\":\"" + e.getMessage() + "\"}"); } } @@ -70,7 +82,7 @@ public class PrestashopClient { // baseUrl, ex: https://shop.gameovergne.fr sb.append(baseUrl); if (baseUrl.endsWith("/")) { - sb.setLength(sb.length() - 1); // on enlève le / final si présent + sb.setLength(sb.length() - 1); } // /api @@ -84,7 +96,7 @@ public class PrestashopClient { sb.append(path); } - // query déjà encodée par le navigateur : NE PAS la ré-encoder ! + // query : on NE RÉ-ENCODE PAS, on colle tel quel (déjà encodée par Angular / le navigateur) if (query != null && !query.isBlank()) { sb.append('?').append(query); }