Update api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
try {
|
||||||
HttpRequest request = HttpRequest.newBuilder()
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
.uri(URI.create(url))
|
.uri(URI.create(url)) // si l’URL est invalide, ça lèvera IllegalArgumentException
|
||||||
.header("Authorization", "Basic " + basicAuth)
|
.header("Authorization", "Basic " + basicAuth)
|
||||||
.GET()
|
.GET()
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
try {
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user