diff --git a/src/main/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandler.java b/src/main/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandler.java index ba431a95..b6282cc2 100644 --- a/src/main/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandler.java +++ b/src/main/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandler.java @@ -2,7 +2,7 @@ import it.pagopa.ecommerce.commons.client.QueueAsyncClient; import it.pagopa.ecommerce.commons.documents.BaseTransactionEvent; -import it.pagopa.ecommerce.commons.documents.v2.authorization.TransactionGatewayAuthorizationRequestedData; +import it.pagopa.ecommerce.commons.domain.v2.TransactionClosed; import it.pagopa.ecommerce.commons.domain.v2.pojos.BaseTransactionWithRequestedAuthorization; import it.pagopa.ecommerce.commons.generated.server.model.TransactionStatusDto; import it.pagopa.ecommerce.commons.queues.QueueEvent; @@ -107,33 +107,12 @@ public Mono> handle(TransactionAddUserReceiptCommand com ) ) .flatMap( - tx -> { - if (tx.getStatus() == TransactionStatusDto.CLOSURE_REQUESTED) { - return Mono.error( - new InvalidStatusException( - "Error processing closure update request: the transaction is in the state " - + tx.getStatus() - ) - ); - } - return Mono.error( - new AlreadyProcessedException( - tx.getTransactionId(), - tx.getTransactionAuthorizationRequestData() - .getPspId(), - tx.getTransactionAuthorizationRequestData() - .getPaymentTypeCode(), - tx.getClientId().name(), - transactionsUtils.isWalletPayment(tx).orElseThrow(), - new UpdateTransactionStatusTracerUtils.GatewayOutcomeResult( - command.getData().addUserReceiptRequest() - .getOutcome() - .getValue(), - Optional.empty() - ) - ) - ); - } + tx -> validateAndHandleTransactionClosure( + tx, + command.getData().addUserReceiptRequest() + .getOutcome() + .getValue() + ) ) ); return transaction @@ -264,6 +243,35 @@ public Mono> handle(TransactionAddUserReceiptCommand com } + private Mono validateAndHandleTransactionClosure( + BaseTransactionWithRequestedAuthorization tx, + String outcome + ) { + if (tx.getStatus() == TransactionStatusDto.CLOSURE_REQUESTED) { + return Mono.error( + new InvalidStatusException( + "Error processing closure update request: the transaction is in the state " + + tx.getStatus() + ) + ); + } + return Mono.error( + new AlreadyProcessedException( + tx.getTransactionId(), + tx.getTransactionAuthorizationRequestData() + .getPspId(), + tx.getTransactionAuthorizationRequestData() + .getPaymentTypeCode(), + tx.getClientId().name(), + transactionsUtils.isWalletPayment(tx).orElseThrow(), + new UpdateTransactionStatusTracerUtils.GatewayOutcomeResult( + outcome, + Optional.empty() + ) + ) + ); + } + private static it.pagopa.ecommerce.commons.documents.v2.TransactionUserReceiptData.Outcome requestOutcomeToReceiptOutcome( AddUserReceiptRequestDto.OutcomeEnum requestOutcome ) { diff --git a/src/test/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandlerTest.java b/src/test/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandlerTest.java index 275f2240..fde17c0c 100644 --- a/src/test/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandlerTest.java +++ b/src/test/java/it/pagopa/transactions/commands/handlers/v2/TransactionRequestUserReceiptHandlerTest.java @@ -10,7 +10,6 @@ import it.pagopa.ecommerce.commons.domain.v2.TransactionActivated; import it.pagopa.ecommerce.commons.domain.v2.TransactionEventCode; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.OperationResultDto; -import it.pagopa.ecommerce.commons.generated.server.model.AuthorizationResultDto; import it.pagopa.ecommerce.commons.queues.QueueEvent; import it.pagopa.ecommerce.commons.queues.TracingUtils; import it.pagopa.ecommerce.commons.queues.TracingUtilsTests; @@ -808,7 +807,7 @@ void shouldRejectTransactionInInvalidStateClosureRequested() { /* test */ StepVerifier.create(updateStatusHandler.handle(requestStatusCommand)) - .expectErrorMatches(error -> error instanceof InvalidStatusException) + .expectErrorMatches(InvalidStatusException.class::isInstance) .verify(); Mockito.verify(userReceiptDataEventRepository, Mockito.times(0)).save(any()); @@ -864,7 +863,7 @@ void shouldRejectTransactionInInvalidState() { /* test */ StepVerifier.create(updateStatusHandler.handle(requestStatusCommand)) - .expectErrorMatches(error -> error instanceof AlreadyProcessedException) + .expectErrorMatches(AlreadyProcessedException.class::isInstance) .verify(); Mockito.verify(userReceiptDataEventRepository, Mockito.times(0)).save(any()); @@ -978,7 +977,7 @@ void shouldRejectTransactionWithClosureOutcomeKO() { /* test */ StepVerifier.create(updateStatusHandler.handle(requestStatusCommand)) - .expectErrorMatches(error -> error instanceof AlreadyProcessedException) + .expectErrorMatches(AlreadyProcessedException.class::isInstance) .verify(); verify(updateTransactionStatusTracerUtils, times(0)).traceStatusUpdateOperation( diff --git a/src/test/java/it/pagopa/transactions/services/v1/CircuitBreakerTest.java b/src/test/java/it/pagopa/transactions/services/v1/CircuitBreakerTest.java index 93d342b4..56aee370 100644 --- a/src/test/java/it/pagopa/transactions/services/v1/CircuitBreakerTest.java +++ b/src/test/java/it/pagopa/transactions/services/v1/CircuitBreakerTest.java @@ -505,7 +505,7 @@ void shouldOpenCircuitBreakerForNotExcludedExceptionPerformingRetry() { @Test @Order(3) - void shouldOpenCircuitBreakerForInvalidStatusExceptionPerformingRetry() { + void shouldPerformRetryForInvalidStatusExceptionOnAddUserReceipt() { Retry retry = retryRegistry.retry("addUserReceipt"); long expectedFailedCallsWithoutRetryAttempt = retry.getMetrics().getNumberOfFailedCallsWithoutRetryAttempt(); long expectedFailedCallsWithRetryAttempt = retry.getMetrics().getNumberOfFailedCallsWithRetryAttempt() + 1;