Update api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java

This commit is contained in:
2025-11-25 18:05:56 +00:00
parent c7b9b68d42
commit 47edec0d33

View File

@@ -1,5 +1,7 @@
package fr.gameovergne.api.service.prestashop; package fr.gameovergne.api.service.prestashop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@@ -17,10 +19,12 @@ import java.util.Map;
@Service @Service
public class PrestashopClient { public class PrestashopClient {
private static final Logger log = LoggerFactory.getLogger(PrestashopClient.class);
private final HttpClient httpClient = HttpClient.newHttpClient(); private final HttpClient httpClient = HttpClient.newHttpClient();
private final String baseUrl; 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( public PrestashopClient(
@Value("${prestashop.base-url}") String baseUrl, @Value("${prestashop.base-url}") String baseUrl,
@@ -31,36 +35,44 @@ public class PrestashopClient {
} }
public ResponseEntity<String> get(String path, String query) { public ResponseEntity<String> get(String path, String query) {
// path : ex "/suppliers"
// query : ex "display=%5Bid,name,active%5D&output_format=JSON"
String url = buildUrl(path, query); String url = buildUrl(path, query);
log.info("[PrestaShop] Appel URL = {}", url);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Basic " + basicAuth)
.GET()
.build();
try { try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url)) // si lURL est invalide, ça lèvera IllegalArgumentException
.header("Authorization", "Basic " + basicAuth)
.GET()
.build();
HttpResponse<String> response = HttpResponse<String> response =
httpClient.send(request, HttpResponse.BodyHandlers.ofString()); 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(); HttpHeaders springHeaders = new HttpHeaders();
for (Map.Entry<String, List<String>> entry : response.headers().map().entrySet()) { for (Map.Entry<String, List<String>> entry : response.headers().map().entrySet()) {
springHeaders.put(entry.getKey(), entry.getValue()); springHeaders.put(entry.getKey(), entry.getValue());
} }
return new ResponseEntity<>(response.body(), springHeaders, return new ResponseEntity<>(
HttpStatus.valueOf(response.statusCode())); response.body(),
springHeaders,
HttpStatus.valueOf(response.statusCode())
);
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
// En prod tu pourrais logger proprement
if (e instanceof InterruptedException) { if (e instanceof InterruptedException) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
log.error("[PrestaShop] Erreur I/O pour {}", url, e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) 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 // baseUrl, ex: https://shop.gameovergne.fr
sb.append(baseUrl); sb.append(baseUrl);
if (baseUrl.endsWith("/")) { if (baseUrl.endsWith("/")) {
sb.setLength(sb.length() - 1); // on enlève le / final si présent sb.setLength(sb.length() - 1);
} }
// /api // /api
@@ -84,7 +96,7 @@ public class PrestashopClient {
sb.append(path); 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()) { if (query != null && !query.isBlank()) {
sb.append('?').append(query); sb.append('?').append(query);
} }