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

This commit is contained in:
2025-11-25 17:02:09 +00:00
parent c9ceb46746
commit 844c132915

View File

@@ -1,70 +1,61 @@
// FILE: api/src/main/java/fr/gameovergne/api/service/prestashop/PrestashopClient.java
package fr.gameovergne.api.service.prestashop;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestClientException;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
@Service
import java.net.URI;
@Component
public class PrestashopClient {
private final RestTemplate restTemplate = new RestTemplate();
private final String baseUrl;
private final String basicAuth; // valeur déjà encodée Base64 (Authorization: Basic ...)
private final String basicAuth;
public PrestashopClient(
@Value("${prestashop.base-url}") String baseUrl,
@Value("${prestashop.basic-auth}") String basicAuth) {
@Value("${prestashop.basic-auth}") String basicAuth
) {
this.baseUrl = baseUrl;
this.basicAuth = basicAuth;
}
public ResponseEntity<String> get(String path, String query) {
// path = ex: "/categories"
// query = ex: "display=...[...]" (déjà encodé)
String url = UriComponentsBuilder
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl(baseUrl)
.path("/api")
.path(path)
.query(query)
.build(true) // la query contient déjà les %5B..%5D
.toUriString();
.path(path); // ex: /suppliers
System.out.println("[Presta] GET " + url);
if (query != null && !query.isBlank()) {
// On parse la query reçue de l'appel Angular
MultiValueMap<String, String> params =
UriComponentsBuilder.newInstance().query(query).build().getQueryParams();
// On supprime output_format côté Presta : on laisse l'en-tête Accept gérer le JSON
params.remove("output_format");
// On réapplique tous les autres paramètres (display, filter[...], etc.)
for (var entry : params.entrySet()) {
for (String v : entry.getValue()) {
builder.queryParam(entry.getKey(), v);
}
}
}
URI uri = builder.build(true).toUri(); // true = les valeurs sont déjà encodées si besoin
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.AUTHORIZATION, "Basic " + basicAuth);
headers.set("Authorization", basicAuth);
headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON));
HttpEntity<Void> entity = new HttpEntity<>(headers);
try {
ResponseEntity<String> response =
restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
System.out.println("[Presta] <- " + response.getStatusCode());
return ResponseEntity
.status(response.getStatusCode())
.headers(response.getHeaders())
.body(response.getBody());
} catch (HttpStatusCodeException ex) {
// Erreur HTTP renvoyée par Presta (401, 403, 404, 500, ...)
System.err.println("[Presta] ERROR " + ex.getStatusCode() + " for URL: " + url);
System.err.println("[Presta] BODY: " + ex.getResponseBodyAsString());
return ResponseEntity
.status(ex.getStatusCode())
.body(ex.getResponseBodyAsString());
} catch (RestClientException ex) {
// Erreur réseau/TLS/etc
System.err.println("[Presta] CLIENT ERROR for URL: " + url);
ex.printStackTrace();
return ResponseEntity
.status(HttpStatus.BAD_GATEWAY)
.body("Error while calling Prestashop: " + ex.getMessage());
}
return restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
}
}