From a18c3e5f669b888ee9ef0ef01937aa05f209e3a6 Mon Sep 17 00:00:00 2001 From: Francesco Cesareo Date: Thu, 10 Oct 2024 10:25:40 +0200 Subject: [PATCH] chore: Recovery by partition (#142) --- .../controller/RecoveryController.java | 22 ++++++++++++++++++- .../RecoveryReceiptByPartitionRequest.java | 21 ++++++++++++++++++ .../service/RecoveryService.java | 17 ++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/it/gov/pagopa/wispconverter/controller/model/RecoveryReceiptByPartitionRequest.java diff --git a/src/main/java/it/gov/pagopa/wispconverter/controller/RecoveryController.java b/src/main/java/it/gov/pagopa/wispconverter/controller/RecoveryController.java index 38b8e59f..03b19059 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/controller/RecoveryController.java +++ b/src/main/java/it/gov/pagopa/wispconverter/controller/RecoveryController.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import it.gov.pagopa.wispconverter.controller.model.RecoveryReceiptByPartitionRequest; import it.gov.pagopa.wispconverter.controller.model.RecoveryReceiptReportResponse; import it.gov.pagopa.wispconverter.controller.model.RecoveryReceiptRequest; import it.gov.pagopa.wispconverter.controller.model.RecoveryReceiptResponse; @@ -92,7 +93,7 @@ public ResponseEntity recoverReceiptKOForCreditorInstit @Operation(summary = "Execute reconciliation for passed receipts.", description = "Execute reconciliation of all receipts in the request, searching by passed identifier", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Recovery"}) @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "Reconciliation completed") + @ApiResponse(responseCode = "200", description = "Reconciliation scheduled") }) @PostMapping(value = "/receipts") public ResponseEntity recoverReceiptToBeReSent(@RequestBody RecoveryReceiptRequest request) { @@ -108,4 +109,23 @@ public ResponseEntity recoverReceiptToBeReSent(@R throw ex; } } + + @Operation(summary = "Execute reconciliation for passed receipts by partition.", description = "Execute reconciliation of all receipts contained in the partitions of the request", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Recovery"}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Reconciliation scheduled") + }) + @PostMapping(value = "/partitions") + public ResponseEntity recoverReceiptToBeReSentByPartition(@RequestBody RecoveryReceiptByPartitionRequest request) { + try { + log.info("Invoking API operation recoverReceiptToBeReSentByPartition - args: {}", request); + return ResponseEntity.ok(recoveryService.recoverReceiptToBeReSentByPartition(request)); + } catch (Exception ex) { + String operationId = MDC.get(Constants.MDC_OPERATION_ID); + log.error(String.format("GenericException: operation-id=[%s]", operationId != null ? operationId : "n/a"), ex); + AppException appException = new AppException(ex, AppErrorCodeMessageEnum.ERROR, ex.getMessage()); + ErrorResponse errorResponse = errorUtil.forAppException(appException); + log.error("Failed API operation recoverReceiptToBeReSentByPartition - error: {}", errorResponse); + throw ex; + } + } } diff --git a/src/main/java/it/gov/pagopa/wispconverter/controller/model/RecoveryReceiptByPartitionRequest.java b/src/main/java/it/gov/pagopa/wispconverter/controller/model/RecoveryReceiptByPartitionRequest.java new file mode 100644 index 00000000..b07deca8 --- /dev/null +++ b/src/main/java/it/gov/pagopa/wispconverter/controller/model/RecoveryReceiptByPartitionRequest.java @@ -0,0 +1,21 @@ +package it.gov.pagopa.wispconverter.controller.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.util.List; + +@Data +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +@ToString +@JsonIgnoreProperties(ignoreUnknown = true) +public class RecoveryReceiptByPartitionRequest { + + private List partitionKeys; +} diff --git a/src/main/java/it/gov/pagopa/wispconverter/service/RecoveryService.java b/src/main/java/it/gov/pagopa/wispconverter/service/RecoveryService.java index 679381bf..95f22299 100644 --- a/src/main/java/it/gov/pagopa/wispconverter/service/RecoveryService.java +++ b/src/main/java/it/gov/pagopa/wispconverter/service/RecoveryService.java @@ -44,6 +44,8 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; @Service @Slf4j @@ -243,6 +245,21 @@ private void generateRE(String primitive, String operationStatus, InternalStepSt reService.addRe(reEvent); } + public RecoveryReceiptReportResponse recoverReceiptToBeReSentByPartition(RecoveryReceiptByPartitionRequest request) { + + List receiptsIds = request.getPartitionKeys().stream() + .map(PartitionKey::new) + .flatMap(partitionKey -> StreamSupport.stream(rtRetryRepository.findAll(partitionKey).spliterator(), false)) + .map(RTRequestEntity::getId) + .toList(); + + RecoveryReceiptRequest req = RecoveryReceiptRequest.builder() + .receiptIds(receiptsIds) + .build(); + + return recoverReceiptToBeReSent(req); + } + public RecoveryReceiptReportResponse recoverReceiptToBeReSent(RecoveryReceiptRequest request) { RecoveryReceiptReportResponse response = RecoveryReceiptReportResponse.builder()