From 007cb34c8169bf617e235573a57a3bde5c53b96a Mon Sep 17 00:00:00 2001 From: Vincent Guillet Date: Sat, 29 Nov 2025 11:32:41 +0100 Subject: [PATCH] Enhance PrestashopClient and PrestashopProxyController with new proxy method and improved response handling --- .../controller/PrestashopProxyController.java | 10 ++++++-- .../api/service/PrestashopClient.java | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/fr/gameovergne/api/controller/PrestashopProxyController.java b/api/src/main/java/fr/gameovergne/api/controller/PrestashopProxyController.java index 448ff9e..90f542f 100644 --- a/api/src/main/java/fr/gameovergne/api/controller/PrestashopProxyController.java +++ b/api/src/main/java/fr/gameovergne/api/controller/PrestashopProxyController.java @@ -32,6 +32,7 @@ public class PrestashopProxyController { String relativePath = new AntPathMatcher() .extractPathWithinPattern(bestMatchPattern, fullPath); + // Path Presta : "/categories" ou "/manufacturers/3" etc. String path = relativePath.isEmpty() ? "/" : "/" + relativePath; // Query string brute, déjà encodée (display=%5Bid,name,active%5D&output_format=JSON) @@ -39,10 +40,15 @@ public class PrestashopProxyController { var prestaResponse = prestashopClient.getWithRawQuery(path, rawQuery); - // On renvoie EXACTEMENT le même status + body, en forçant JSON + // On propage le status + body, et on garde le Content-Type renvoyé par Presta + MediaType contentType = prestaResponse.getHeaders().getContentType(); + if (contentType == null) { + contentType = MediaType.APPLICATION_JSON; + } + return ResponseEntity .status(prestaResponse.getStatusCode()) - .contentType(MediaType.APPLICATION_JSON) + .contentType(contentType) .body(prestaResponse.getBody()); } } \ No newline at end of file diff --git a/api/src/main/java/fr/gameovergne/api/service/PrestashopClient.java b/api/src/main/java/fr/gameovergne/api/service/PrestashopClient.java index 9ac7c62..86b2b7a 100644 --- a/api/src/main/java/fr/gameovergne/api/service/PrestashopClient.java +++ b/api/src/main/java/fr/gameovergne/api/service/PrestashopClient.java @@ -1,3 +1,4 @@ +// File: src/main/java/fr/gameovergne/api/service/PrestashopClient.java package fr.gameovergne.api.service; import lombok.extern.slf4j.Slf4j; @@ -44,6 +45,8 @@ public class PrestashopClient { return builder.build(true).toUriString(); } + // -------- Méthodes "typed" JSON / XML utilisées par ps-admin -------- + public String getJson(String path, MultiValueMap params) { String uri = buildUri(path, params); log.info("[PrestaShop] GET JSON {}", uri); @@ -94,4 +97,25 @@ public class PrestashopClient { .retrieve() .toBodilessEntity(); } + + // -------- Méthode générique utilisée par le proxy /api/ps/** -------- + + /** + * Proxy brut : on lui donne le path Presta (ex: "/categories") et la query string déjà encodée. + * On récupère un ResponseEntity pour pouvoir propager le status code. + */ + public ResponseEntity getWithRawQuery(String path, String rawQuery) { + String uri = baseUrl + path; + if (rawQuery != null && !rawQuery.isBlank()) { + uri = uri + "?" + rawQuery; + } + + log.info("[PrestaShop] GET (proxy) {}", uri); + + return client.get() + .uri(uri) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .toEntity(String.class); + } } \ No newline at end of file