diff --git a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/MultilangStringDeserializer.java b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/MultilangStringDeserializer.java new file mode 100644 index 0000000..623c259 --- /dev/null +++ b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/MultilangStringDeserializer.java @@ -0,0 +1,43 @@ +package com.teterialosjuanjos.tfg.sync_service.integration.prestashop.dto; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; + +import java.io.IOException; + +/** + * Handles PrestaShop's multilingual fields, which the webservice returns as either: + * + * Extracts the {@code value} of the first language entry, or returns the string as-is. + */ +public class MultilangStringDeserializer extends JsonDeserializer { + + @Override + public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + if (p.currentToken() == JsonToken.VALUE_STRING) { + return p.getText(); + } + if (p.currentToken() == JsonToken.START_ARRAY) { + String first = null; + while (p.nextToken() != JsonToken.END_ARRAY) { + if (p.currentToken() == JsonToken.START_OBJECT && first == null) { + JsonNode node = p.readValueAsTree(); + if (node.has("value")) { + first = node.get("value").asText(null); + } + } else { + p.skipChildren(); + } + } + return first; + } + p.skipChildren(); + return null; + } +} diff --git a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/PrestashopProductDto.java b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/PrestashopProductDto.java index deef4ca..542856b 100644 --- a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/PrestashopProductDto.java +++ b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/dto/PrestashopProductDto.java @@ -3,6 +3,7 @@ package com.teterialosjuanjos.tfg.sync_service.integration.prestashop.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.List; @@ -27,9 +28,10 @@ public record PrestashopProductDto( /** "1" = active, "0" = inactive */ String active, @JsonProperty("id_category_default") String idCategoryDefault, - String name, - String description, - @JsonProperty("description_short") String descriptionShort + @JsonDeserialize(using = MultilangStringDeserializer.class) String name, + @JsonDeserialize(using = MultilangStringDeserializer.class) String description, + @JsonProperty("description_short") + @JsonDeserialize(using = MultilangStringDeserializer.class) String descriptionShort ) { /** Envelope for {@code GET /api/products?display=full} */