diff --git a/integration-test/features/config/config.json b/integration-test/features/config/config.json index e635514..59da410 100644 --- a/integration-test/features/config/config.json +++ b/integration-test/features/config/config.json @@ -5,7 +5,7 @@ "input_container_name": "input", "output_container_name": "output", "csv_blob_name": "taxonomy.csv", - "json_blob_name": "taxonomy.json", + "json_blob_name": "taxonomy_standard.json", "taxonomy_csv_example": "codice_tipo_ente_creditore;tipo_ente_creditore;progressivo_macro_area_per_ente_creditore;nome_macro_area;descrizione_macro_area;codice_tipologia_servizio;tipo_servizio;motivo_giuridico_della_riscossione;descrizione_tipo_servizio;versione_tassonomia;dati_specifici_di_incasso;data_inizio_validita;data_fine_validita;combinazione_topic_subtopic\n05;SERVIZIO SANITARIO NAZIONALE;01;SERVIZIO SANITARIO NAZIONALE;I servizi sanitari sono quelli di assistenza sanitaria a tutela della salute della popolazione e degli animali. Tali servizi vengono erogati dalle ASL e dagli Ospedali, che a loro volta si distinguono in Presidi ospedalieri e Aziende ospedaliere.;153;incassi servizi sociali;SP;pagamento servizi rivolti a Persone non autosufficienti o portatrici di particolari patologie e disabilità;36;9/0501153SP/;07/03/2023;01/01/2080;Benessere sociale + Altro", "force_taxomy_example": false } diff --git a/postman-collection/Taxonomy.postman_collection.json b/postman-collection/Taxonomy.postman_collection.json index c0e8c97..90a2db2 100644 --- a/postman-collection/Taxonomy.postman_collection.json +++ b/postman-collection/Taxonomy.postman_collection.json @@ -87,7 +87,7 @@ "response": [] }, { - "name": "Healthcheck", + "name": "Info - Healthcheck", "request": { "method": "GET", "header": [], diff --git a/src/main/java/it/gov/pagopa/taxonomy/TaxonomyGetFunction.java b/src/main/java/it/gov/pagopa/taxonomy/TaxonomyGetFunction.java index f9428a5..4968147 100644 --- a/src/main/java/it/gov/pagopa/taxonomy/TaxonomyGetFunction.java +++ b/src/main/java/it/gov/pagopa/taxonomy/TaxonomyGetFunction.java @@ -6,7 +6,6 @@ import com.azure.storage.blob.models.BlobErrorCode; import com.azure.storage.blob.models.BlobStorageException; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.microsoft.azure.functions.ExecutionContext; @@ -22,9 +21,7 @@ import it.gov.pagopa.taxonomy.exception.AppErrorCodeMessageEnum; import it.gov.pagopa.taxonomy.exception.AppException; import it.gov.pagopa.taxonomy.model.function.ErrorMessage; -import it.gov.pagopa.taxonomy.model.json.TaxonomyJson; -import it.gov.pagopa.taxonomy.model.json.TaxonomyStandard; -import it.gov.pagopa.taxonomy.model.json.TaxonomyTopicFlag; +import it.gov.pagopa.taxonomy.model.json.TaxonomyMetadata; import it.gov.pagopa.taxonomy.util.AppConstant; import it.gov.pagopa.taxonomy.util.AppMessageUtil; import it.gov.pagopa.taxonomy.util.AppUtil; @@ -33,7 +30,6 @@ import java.text.MessageFormat; import java.time.Instant; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Optional; import java.util.logging.Level; @@ -125,6 +121,7 @@ public HttpResponseMessage getTaxonomy( HttpStatus.BAD_REQUEST, payload); } + if(extension.equalsIgnoreCase("CSV")) { byte[] taxonomyCsv = getTaxonomyCsv(logger); HttpResponseMessage.Builder response = request.createResponseBuilder(HttpStatus.OK) @@ -134,18 +131,17 @@ public HttpResponseMessage getTaxonomy( return response.build(); } - TaxonomyJson taxonomyJson = getTaxonomy(logger); + String taxonomyJson = getTaxonomyList(logger, version); + TaxonomyMetadata taxonomyMetadata = getMetadata(logger); Map map = new LinkedHashMap<>(); - map.put(AppConstant.RESPONSE_HEADER_UUID, taxonomyJson.getUuid()); - map.put(AppConstant.RESPONSE_HEADER_CREATED, taxonomyJson.getCreated().toString()); + map.put(AppConstant.RESPONSE_HEADER_UUID, taxonomyMetadata.getUuid()); + map.put(AppConstant.RESPONSE_HEADER_CREATED, taxonomyMetadata.getCreated().toString()); map.put(AppConstant.RESPONSE_HEADER_VERSION, version); - String payload = generatePayload(logger, version, taxonomyJson); - return AppUtil.writeResponseWithHeaders(request, HttpStatus.OK, - payload, + taxonomyJson, map); } catch (AppException e) { @@ -197,20 +193,34 @@ public HttpResponseMessage getTaxonomy( } } - private static TaxonomyJson getTaxonomy(Logger logger) { - try { - msg = MessageFormat.format("Retrieving the json file from the blob storage at: [{0}]", Instant.now()); + private static TaxonomyMetadata getMetadata(Logger logger) { + try { + msg = MessageFormat.format("Retrieving the metadata json file from the blob storage at: [{0}]", Instant.now()); logger.info(msg); String content = getBlobContainerClientOutput() - .getBlobClient(JSON_NAME) - .downloadContent() - .toString(); - return getObjectMapper().readValue(content, TaxonomyJson.class); - } catch (JsonProcessingException parsingException) { + .getBlobClient("taxonomy_metadata.json") + .downloadContent() + .toString(); + return getObjectMapper().readValue(content, TaxonomyMetadata.class); + } catch (JsonProcessingException exception) { logger.info("An AppException has occurred"); - throw new AppException(parsingException, AppErrorCodeMessageEnum.JSON_PARSING_ERROR); + logger.info("Problem mapping Metadata Object from JSON file"); + throw new AppException(exception, AppErrorCodeMessageEnum.JSON_PARSING_ERROR); } } + private static String getTaxonomyList(Logger logger, String version) { + final String STANDARD_JSON_NAME = JSON_NAME.split("\\.")[0]+"_standard.json"; + final String TOPIC_JSON_NAME = JSON_NAME.split("\\.")[0]+"_topic.json"; + msg = MessageFormat.format("Retrieving the {0} json file from the blob storage at: [{1}]", version, Instant.now()); + logger.info(msg); + String jsonFile = STANDARD_JSON_NAME; + if(version.equalsIgnoreCase("topicflag")) + jsonFile = TOPIC_JSON_NAME; + return getBlobContainerClientOutput() + .getBlobClient(jsonFile) + .downloadContent() + .toString(); + } private static byte[] getTaxonomyCsv(Logger logger) { try { msg=MessageFormat.format("Retrieving the csv file from the blob storage at: [{0}]", Instant.now()); @@ -227,26 +237,4 @@ private static byte[] getTaxonomyCsv(Logger logger) { } } - private static String generatePayload(Logger logger, String version, TaxonomyJson taxonomyJson) { - String payload = null; - if (version.equalsIgnoreCase(VersionEnum.STANDARD.toString())) { - msg = MessageFormat.format("Versioning json id = [{0}] to the {1} version", taxonomyJson.getUuid(), VersionEnum.STANDARD); - logger.info(msg); - List taxonomyList = getObjectMapper().convertValue(taxonomyJson.getTaxonomyList(), new TypeReference<>() { - }); - payload = AppUtil.getPayload(getObjectMapper(), taxonomyList); - msg = MessageFormat.format("{0} taxonomy retrieved successfully", VersionEnum.STANDARD); - logger.info(msg); - } else if (version.equalsIgnoreCase(VersionEnum.TOPICFLAG.toString())) { - msg = MessageFormat.format("Versioning json id = [{0}] to the {1} version", taxonomyJson.getUuid(), VersionEnum.TOPICFLAG); - logger.info(msg); - - List taxonomyList = getObjectMapper().convertValue(taxonomyJson.getTaxonomyList(), new TypeReference<>() { - }); - payload = AppUtil.getPayload(getObjectMapper(), taxonomyList); - msg = MessageFormat.format("{0} taxonomy retrieved successfully", VersionEnum.TOPICFLAG); - logger.info(msg); - } - return payload; - } } diff --git a/src/main/java/it/gov/pagopa/taxonomy/UpdateTaxonomy.java b/src/main/java/it/gov/pagopa/taxonomy/UpdateTaxonomy.java index abefe84..cfa8143 100644 --- a/src/main/java/it/gov/pagopa/taxonomy/UpdateTaxonomy.java +++ b/src/main/java/it/gov/pagopa/taxonomy/UpdateTaxonomy.java @@ -11,7 +11,8 @@ import it.gov.pagopa.taxonomy.exception.AppErrorCodeMessageEnum; import it.gov.pagopa.taxonomy.exception.AppException; import it.gov.pagopa.taxonomy.model.csv.TaxonomyCsv; -import it.gov.pagopa.taxonomy.model.json.TaxonomyJson; +import it.gov.pagopa.taxonomy.model.json.TaxonomyMetadata; +import it.gov.pagopa.taxonomy.model.json.TaxonomyStandard; import it.gov.pagopa.taxonomy.model.json.TaxonomyTopicFlag; import org.modelmapper.ModelMapper; @@ -78,11 +79,13 @@ private static ModelMapper getModelMapper() { public static void updateTaxonomy(Logger logger) { try { + final String STANDARD_JSON_NAME = JSON_NAME.split("\\.")[0]+"_standard.json"; + final String TOPIC_JSON_NAME = JSON_NAME.split("\\.")[0]+"_topic.json"; msg = MessageFormat.format("Download csv file [{0}] from blob at [{1}]", CSV_NAME, Instant.now()); logger.info(msg); InputStreamReader inputStreamReader = new InputStreamReader(getBlobContainerClientInput().getBlobClient(CSV_NAME).downloadContent().toStream(), StandardCharsets.UTF_8); - msg = MessageFormat.format("Converting [{0}] into [{1}]", CSV_NAME, JSON_NAME); + msg = MessageFormat.format("Converting [{0}] into JSON", CSV_NAME); logger.info(msg); List taxonomyCsvList = new CsvToBeanBuilder(inputStreamReader) .withSeparator(';') @@ -94,19 +97,31 @@ public static void updateTaxonomy(Logger logger) { Instant now = Instant.now(); String id = UUID.randomUUID().toString(); - TaxonomyJson taxonomyJson = TaxonomyJson.builder() + TaxonomyMetadata taxonomyMetadata = TaxonomyMetadata.builder() .uuid(id) .created(now) - .taxonomyList(taxonomyCsvList.stream().map(taxonomyCsv -> - getModelMapper().map(taxonomyCsv, TaxonomyTopicFlag.class) - ).collect(Collectors.toList())) .build(); - byte[] jsonBytes = getObjectMapper().writeValueAsBytes(taxonomyJson); + msg = MessageFormat.format("Uploading metadata json id = [{0}] created at: [{1}]", id, now); + logger.info(msg); + byte[] jsonBytesMetadata = getObjectMapper().writeValueAsBytes(taxonomyMetadata); + getBlobContainerClientOutput().getBlobClient("taxonomy_metadata.json").upload(BinaryData.fromBytes(jsonBytesMetadata), true); + + msg = MessageFormat.format("Uploading standard json id = [{0}] created at: [{1}]", id, now); + List taxonomyStandardJson = taxonomyCsvList + .stream().map(taxonomyCsv -> getModelMapper().map(taxonomyCsv, TaxonomyStandard.class) + ).collect(Collectors.toList()); + byte[] jsonBytesStandard = getObjectMapper().writeValueAsBytes(taxonomyStandardJson); + logger.info(msg); + getBlobContainerClientOutput().getBlobClient(STANDARD_JSON_NAME).upload(BinaryData.fromBytes(jsonBytesStandard), true); - msg = MessageFormat.format("Uploading json id = [{0}] created at: [{1}]", id, now); + msg = MessageFormat.format("Uploading topic json id = [{0}] created at: [{1}]", id, now); + List taxonomyTopicFlagJson = taxonomyCsvList + .stream().map(taxonomyCsv -> getModelMapper().map(taxonomyCsv, TaxonomyTopicFlag.class) + ).collect(Collectors.toList()); + byte[] jsonBytes = getObjectMapper().writeValueAsBytes(taxonomyTopicFlagJson); logger.info(msg); - getBlobContainerClientOutput().getBlobClient(JSON_NAME).upload(BinaryData.fromBytes(jsonBytes), true); + getBlobContainerClientOutput().getBlobClient(TOPIC_JSON_NAME).upload(BinaryData.fromBytes(jsonBytes), true); } catch (JsonProcessingException | IllegalStateException parsingException) { logger.info("An AppException has occurred"); diff --git a/src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyJson.java b/src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyMetadata.java similarity index 83% rename from src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyJson.java rename to src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyMetadata.java index bcc69d3..7165b72 100644 --- a/src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyJson.java +++ b/src/main/java/it/gov/pagopa/taxonomy/model/json/TaxonomyMetadata.java @@ -5,7 +5,6 @@ import lombok.*; import java.time.Instant; -import java.util.List; @Builder @Getter @@ -13,11 +12,9 @@ @NoArgsConstructor @AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) -public class TaxonomyJson { +public class TaxonomyMetadata { private String uuid; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; - - private List taxonomyList; }