diff --git a/api/src/main/java/fr/gameovergne/api/controller/prestashop/PrestashopProxyController.java b/api/src/main/java/fr/gameovergne/api/controller/prestashop/PrestashopProxyController.java index 386495e..98c6f52 100644 --- a/api/src/main/java/fr/gameovergne/api/controller/prestashop/PrestashopProxyController.java +++ b/api/src/main/java/fr/gameovergne/api/controller/prestashop/PrestashopProxyController.java @@ -8,6 +8,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.AntPathMatcher; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.HandlerMapping; import java.net.URLDecoder; @@ -115,4 +116,28 @@ public class PrestashopProxyController { .contentType(MediaType.APPLICATION_XML) .body(prestaResponse.getBody()); } + + + /** + * Upload d'une image produit : + * Front → (multipart/form-data) → /api/ps/images/products/{productId} + * Backend → (bytes) → https://shop.gameovergne.fr/api/images/products/{productId} + */ + @PostMapping( + path = "/api/ps/images/products/{productId}", + consumes = MediaType.MULTIPART_FORM_DATA_VALUE, + produces = MediaType.APPLICATION_XML_VALUE + ) + public ResponseEntity uploadProductImage( + jakarta.servlet.http.HttpServletRequest request, + @PathVariable("productId") String productId, + @RequestPart("image") MultipartFile imageFile + ) { + String rawQuery = request.getQueryString(); // si jamais tu ajoutes des options côté Presta + + log.info("[Proxy] Upload image produit {} (size={} bytes, ct={})", + productId, imageFile.getSize(), imageFile.getContentType()); + + return prestashopClient.uploadProductImage(productId, rawQuery, imageFile); + } } \ No newline at end of file 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 8f919c6..2ebd5a1 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 @@ -10,8 +10,10 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestClientResponseException; +import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriComponentsBuilder; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -222,4 +224,61 @@ public class PrestashopClient { .body("Error while calling PrestaShop WebService"); } } + + + /** + * Upload d'une image produit vers PrestaShop : + * POST /api/images/products/{productId} + * + * On envoie directement les bytes du fichier avec le bon content-type (image/jpeg, image/png, ...). + */ + public ResponseEntity uploadProductImage(String productId, String rawQuery, MultipartFile imageFile) { + String uri = baseUrl + "/images/products/" + productId; + if (rawQuery != null && !rawQuery.isBlank()) { + uri = uri + "?" + rawQuery; + } + + // Content-Type de l'image : on essaie de respecter celui fourni par le client, + // sinon on force sur du JPEG par défaut. + String ct = imageFile.getContentType(); + MediaType mediaType = (ct != null && !ct.isBlank()) + ? MediaType.parseMediaType(ct) + : MediaType.IMAGE_JPEG; + + log.info("[PrestaShop] POST (image) {} (size={} bytes, contentType={})", + uri, imageFile.getSize(), mediaType); + + try { + byte[] bytes = imageFile.getBytes(); + + return client.post() + .uri(uri) + .contentType(mediaType) + .body(bytes) + .retrieve() + .toEntity(String.class); + + } catch (RestClientResponseException ex) { + // Erreur fonctionnelle renvoyée par Presta (taille, format, etc.) + log.error("[PrestaShop] POST image error {} : {}", ex.getRawStatusCode(), ex.getResponseBodyAsString()); + return ResponseEntity + .status(ex.getRawStatusCode()) + .contentType(MediaType.APPLICATION_XML) + .body(ex.getResponseBodyAsString()); + } catch (IOException ex) { + // Problème de lecture du fichier envoyé depuis le client + log.error("[PrestaShop] POST image, erreur lecture fichier", ex); + return ResponseEntity + .status(400) + .contentType(MediaType.TEXT_PLAIN) + .body("Invalid image file"); + } catch (RestClientException ex) { + // Cas réseau / technique + log.error("[PrestaShop] POST image technical error", ex); + return ResponseEntity + .status(502) + .contentType(MediaType.TEXT_PLAIN) + .body("Error while calling PrestaShop WebService"); + } + } } \ No newline at end of file