From 0f2e6659c4979add3408d812f8659d6389814bcc Mon Sep 17 00:00:00 2001 From: Andrea Morabito <78792023+and-mora@users.noreply.github.com> Date: Thu, 23 Jan 2025 18:12:35 +0100 Subject: [PATCH] feat: [SRTP-132] forward send to epc mock (#58) --- build.gradle | 1 + .../activator/RtpActivatorApplication.java | 7 +- .../configuration/ApplicationConfig.java | 8 + .../configuration/ServiceProviderConfig.java | 24 +- .../service/rtp/SendRTPServiceImpl.java | 49 ++- .../service/rtp/SepaRequestToPayMapper.java | 281 +++++++++--------- src/main/resources/application.yaml | 6 + .../env/cstar-d-weu-rtp/terraform.tfvars | 4 + .../env/cstar-p-weu-rtp/terraform.tfvars | 4 + .../env/cstar-u-weu-rtp/terraform.tfvars | 4 + .../service/rtp/SendRTPServiceTest.java | 73 ++++- .../rtp/SepaRequestToPayMapperTest.java | 5 +- src/test/resources/application.yaml | 12 +- 13 files changed, 298 insertions(+), 180 deletions(-) diff --git a/build.gradle b/build.gradle index 0043b6f..330d468 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,7 @@ tasks.compileJava { dependsOn("generateOpenAPISend") dependsOn("generateOpenAPIEPC") dependsOn("generateOpenAPIActivateClient") + dependsOn("generateOpenAPIEPCClient") } sourceSets { diff --git a/src/main/java/it/gov/pagopa/rtp/activator/RtpActivatorApplication.java b/src/main/java/it/gov/pagopa/rtp/activator/RtpActivatorApplication.java index 15de606..ddc4520 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/RtpActivatorApplication.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/RtpActivatorApplication.java @@ -1,13 +1,14 @@ package it.gov.pagopa.rtp.activator; +import it.gov.pagopa.rtp.activator.configuration.ActivationPropertiesConfig; +import it.gov.pagopa.rtp.activator.configuration.ServiceProviderConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; - +import org.springframework.boot.context.properties.EnableConfigurationProperties; import reactor.core.publisher.Hooks; @SpringBootApplication -@ConfigurationPropertiesScan() +@EnableConfigurationProperties({ActivationPropertiesConfig.class, ServiceProviderConfig.class}) public class RtpActivatorApplication { public static void main(String[] args) { diff --git a/src/main/java/it/gov/pagopa/rtp/activator/configuration/ApplicationConfig.java b/src/main/java/it/gov/pagopa/rtp/activator/configuration/ApplicationConfig.java index a631dd4..d084eb2 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/configuration/ApplicationConfig.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/configuration/ApplicationConfig.java @@ -2,6 +2,7 @@ import it.gov.pagopa.rtp.activator.activateClient.api.ReadApi; import it.gov.pagopa.rtp.activator.activateClient.invoker.ApiClient; +import it.gov.pagopa.rtp.activator.epcClient.api.DefaultApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @@ -23,4 +24,11 @@ public ApiClient apiClient(WebClient webClient) { public ReadApi readApi(ApiClient apiClient) { return new ReadApi(apiClient); } + + @Bean + public DefaultApi defaultApi(ServiceProviderConfig serviceProviderConfig) { + var httpClient = new DefaultApi(); + httpClient.getApiClient().setBasePath(serviceProviderConfig.send().epcMockUrl()); + return httpClient; + } } diff --git a/src/main/java/it/gov/pagopa/rtp/activator/configuration/ServiceProviderConfig.java b/src/main/java/it/gov/pagopa/rtp/activator/configuration/ServiceProviderConfig.java index eb49f71..dae799d 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/configuration/ServiceProviderConfig.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/configuration/ServiceProviderConfig.java @@ -3,6 +3,26 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "service-provider") -public record ServiceProviderConfig(String apiVersion) { +public record ServiceProviderConfig( + Activation activation, + Send send +) { -} + public record Activation(String apiVersion) { + + } + + public record Send( + String epcMockUrl, + Retry retry + ) { + + public record Retry( + long maxAttempts, + long backoffMinDuration, + double backoffJitter + ) { + + } + } +} \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java index 1fd26b9..aa85154 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java @@ -13,6 +13,7 @@ import it.gov.pagopa.rtp.activator.domain.errors.PayerNotActivatedException; import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; import it.gov.pagopa.rtp.activator.domain.rtp.RtpRepository; +import it.gov.pagopa.rtp.activator.epcClient.api.DefaultApi; import it.gov.pagopa.rtp.activator.model.generated.epc.ActiveOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalPersonIdentification1CodeEPC25922V30DS02WrapperDto; @@ -23,12 +24,15 @@ import it.gov.pagopa.rtp.activator.model.generated.epc.OrganisationIdentification29EPC25922V30DS022WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.PersonIdentification13EPC25922V30DS02WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.SepaRequestToPayRequestResourceDto; +import java.time.Duration; import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.aot.hint.annotation.RegisterReflectionForBinding; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; @Service @Slf4j @@ -49,13 +53,16 @@ public class SendRTPServiceImpl implements SendRTPService { private final ObjectMapper objectMapper; private final ServiceProviderConfig serviceProviderConfig; private final RtpRepository rtpRepository; + private final DefaultApi sendApi; public SendRTPServiceImpl(SepaRequestToPayMapper sepaRequestToPayMapper, ReadApi activationApi, - ServiceProviderConfig serviceProviderConfig, RtpRepository rtpRepository) { + ServiceProviderConfig serviceProviderConfig, RtpRepository rtpRepository, + DefaultApi sendApi) { this.sepaRequestToPayMapper = sepaRequestToPayMapper; this.activationApi = activationApi; this.serviceProviderConfig = serviceProviderConfig; this.rtpRepository = rtpRepository; + this.sendApi = sendApi; this.objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); } @@ -63,19 +70,36 @@ public SendRTPServiceImpl(SepaRequestToPayMapper sepaRequestToPayMapper, ReadApi public Mono send(Rtp rtp) { return activationApi.findActivationByPayerId(UUID.randomUUID(), rtp.payerId(), - serviceProviderConfig.apiVersion()) + serviceProviderConfig.activation().apiVersion()) + .onErrorMap(WebClientResponseException.class, this::mapActivationResponseToException) .map(act -> act.getPayer().getRtpSpId()) .map(rtp::toRtpWithActivationInfo) .flatMap(rtpRepository::save) - // replace log with http request to external service .flatMap(this::logRtpAsJson) + .flatMap(rtpToSend -> + // response is ignored atm + sendApi.postRequestToPayRequests(UUID.randomUUID(), UUID.randomUUID().toString(), + sepaRequestToPayMapper.toEpcRequestToPay(rtpToSend)) + .retryWhen(sendRetryPolicy()) + .onErrorMap(Throwable::getCause) + .map(response -> rtpToSend) + .defaultIfEmpty(rtpToSend) + ) .map(rtp::toRtpSent) .flatMap(rtpRepository::save) .doOnSuccess(rtpSaved -> log.info("RTP saved with id: {}", rtpSaved.resourceID().getId())) - .onErrorMap(WebClientResponseException.class, this::mapResponseToException) + .onErrorMap(WebClientResponseException.class, this::mapExternalSendResponseToException) .switchIfEmpty(Mono.error(new PayerNotActivatedException())); } + private Throwable mapActivationResponseToException(WebClientResponseException exception) { + return switch (exception.getStatusCode()) { + case NOT_FOUND -> new PayerNotActivatedException(); + case BAD_REQUEST -> new MessageBadFormed(exception.getResponseBodyAsString()); + default -> new RuntimeException("Internal Server Error"); + }; + } + private Mono logRtpAsJson(Rtp rtp) { log.info(rtpToJson(rtp)); return Mono.just(rtp); @@ -84,19 +108,22 @@ private Mono logRtpAsJson(Rtp rtp) { private String rtpToJson(Rtp rtpToLog) { try { return objectMapper.writeValueAsString( - sepaRequestToPayMapper.toRequestToPay(rtpToLog)); + sepaRequestToPayMapper.toEpcRequestToPay(rtpToLog)); } catch (JsonProcessingException e) { log.error("Problem while serializing SepaRequestToPayRequestResourceDto object", e); return ""; } } - private Throwable mapResponseToException(WebClientResponseException exception) { - return switch (exception.getStatusCode()) { - case NOT_FOUND -> new PayerNotActivatedException(); - case BAD_REQUEST -> new MessageBadFormed(exception.getResponseBodyAsString()); - default -> new RuntimeException("Internal Server Error"); - }; + private RetryBackoffSpec sendRetryPolicy() { + return Retry.backoff(serviceProviderConfig.send().retry().maxAttempts(), + Duration.ofMillis(serviceProviderConfig.send().retry().backoffMinDuration())) + .jitter(serviceProviderConfig.send().retry().backoffJitter()) + .doAfterRetry(signal -> log.info("Retry number {}", signal.totalRetries())); + } + + private Throwable mapExternalSendResponseToException(WebClientResponseException exception) { + return new UnsupportedOperationException("Unsupported exception handling for epc response"); } } \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapper.java b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapper.java index f2d9d20..c3e2c0e 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapper.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapper.java @@ -1,167 +1,155 @@ package it.gov.pagopa.rtp.activator.service.rtp; +import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; +import it.gov.pagopa.rtp.activator.epcClient.model.AccountIdentification4ChoiceDto; +import it.gov.pagopa.rtp.activator.epcClient.model.AmountType4ChoiceEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.CashAccount40EPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.ChargeBearerType1CodeDto; +import it.gov.pagopa.rtp.activator.epcClient.model.CreditTransferTransaction57EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.CreditorPaymentActivationRequestV10EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.DateAndDateTime2ChoiceEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.DocumentEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.ExternalOrganisationIdentification1CodeEPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.ExternalPersonIdentification1CodeEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.ExternalServiceLevel1CodeDto; +import it.gov.pagopa.rtp.activator.epcClient.model.FinancialIdentificationSchemeName1ChoiceDto; +import it.gov.pagopa.rtp.activator.epcClient.model.FinancialInstitutionIdentification18EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.GenericFinancialIdentification1Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.GenericOrganisationIdentification1EPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.GenericPersonIdentification1EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.GroupHeader105EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.InstructionForCreditorAgent3EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.LocalInstrument2ChoiceDto; +import it.gov.pagopa.rtp.activator.epcClient.model.OrganisationIdentification29EPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.OrganisationIdentificationSchemeName1ChoiceEPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.Party38ChoiceEPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.Party38ChoiceEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PartyIdentification135EPC25922V30DS022Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PartyIdentification135EPC25922V30DS023Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PartyIdentification135EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PaymentIdentification6EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PaymentInstruction42EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PaymentMethod7CodeDto; +import it.gov.pagopa.rtp.activator.epcClient.model.PaymentTypeInformation26EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PersonIdentification13EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.PersonIdentificationSchemeName1ChoiceEPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.RemittanceInformation21EPC25922V30DS02Dto; +import it.gov.pagopa.rtp.activator.epcClient.model.SepaRequestToPayRequestResourceDto; +import it.gov.pagopa.rtp.activator.epcClient.model.ServiceLevel8ChoiceDto; import java.net.URI; import java.util.ArrayList; import java.util.List; - import org.springframework.stereotype.Component; -import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; -import it.gov.pagopa.rtp.activator.model.generated.epc.ActiveOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.CashAccount40EPC25922V30DS022Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ChargeBearerType1CodeDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.CreditTransferTransaction57EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.CreditorPaymentActivationRequestV10EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.DocumentEPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalOrganisationIdentification1CodeEPC25922V30DS022Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalPersonIdentification1CodeEPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalPersonIdentification1CodeEPC25922V30DS02WrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalServiceLevel1CodeDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalServiceLevel1CodeWrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.FinancialInstitutionIdentification18EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.GenericFinancialIdentification1Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.GenericOrganisationIdentification1EPC25922V30DS022Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.GenericPersonIdentification1EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.GroupHeader105EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.IBAN2007IdentifierWrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.ISODateWrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.InstructionForCreditorAgent3EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.Max35TextWrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.OrganisationIdentification29EPC25922V30DS022Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.OrganisationIdentification29EPC25922V30DS022WrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PartyIdentification135EPC25922V30DS022Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PartyIdentification135EPC25922V30DS023Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PartyIdentification135EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PaymentIdentification6EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PaymentInstruction42EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PaymentMethod7CodeDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PaymentTypeInformation26EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PersonIdentification13EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.PersonIdentification13EPC25922V30DS02WrapperDto; -import it.gov.pagopa.rtp.activator.model.generated.epc.RemittanceInformation21EPC25922V30DS02Dto; -import it.gov.pagopa.rtp.activator.model.generated.epc.SepaRequestToPayRequestResourceDto; - @Component public class SepaRequestToPayMapper { - public SepaRequestToPayRequestResourceDto toRequestToPay(Rtp rtp) { + public SepaRequestToPayRequestResourceDto toEpcRequestToPay(Rtp rtp) { - SepaRequestToPayRequestResourceDto sepaRequestToPayRequestResourceDto = new SepaRequestToPayRequestResourceDto(); + var sepaRequestToPayRequestResourceDto = new SepaRequestToPayRequestResourceDto(); - PartyIdentification135EPC25922V30DS02Dto partyIdentification135EPC25922V30DS02Dto = new PartyIdentification135EPC25922V30DS02Dto(); + var partyIdentification135EPC25922V30DS02Dto = new PartyIdentification135EPC25922V30DS02Dto(); partyIdentification135EPC25922V30DS02Dto.setNm("PagoPA");// FIXED - GroupHeader105EPC25922V30DS02Dto groupHeader105EPC25922V30DS02Dto = new GroupHeader105EPC25922V30DS02Dto(); - groupHeader105EPC25922V30DS02Dto.setMsgId(rtp.resourceID().getId().toString()); + var groupHeader105EPC25922V30DS02Dto = new GroupHeader105EPC25922V30DS02Dto() + .msgId(rtp.resourceID().getId().toString()) + .creDtTm(rtp.savingDateTime().toString()) + .nbOfTxs("1")// FIXED + .initgPty(partyIdentification135EPC25922V30DS02Dto); - groupHeader105EPC25922V30DS02Dto.setCreDtTm(rtp.savingDateTime().toString()); - groupHeader105EPC25922V30DS02Dto.setNbOfTxs("1");// FIXED - groupHeader105EPC25922V30DS02Dto.setInitgPty(partyIdentification135EPC25922V30DS02Dto); + var dateAndDateTime2ChoiceEPC25922V30DS02Dto = new DateAndDateTime2ChoiceEPC25922V30DS02Dto() + .dt(rtp.expiryDate().toString()); - ISODateWrapperDto isoDateWrapperDto = new ISODateWrapperDto(); - isoDateWrapperDto.setDt(rtp.expiryDate().toString()); + var personIdentificationSchemeName1ChoiceEPC25922V30DS02Dto = new PersonIdentificationSchemeName1ChoiceEPC25922V30DS02Dto() + .cd(ExternalPersonIdentification1CodeEPC25922V30DS02Dto.POID); - ExternalPersonIdentification1CodeEPC25922V30DS02WrapperDto externalPersonIdentification1CodeEPC25922V30DS02WrapperDto = new ExternalPersonIdentification1CodeEPC25922V30DS02WrapperDto(); - externalPersonIdentification1CodeEPC25922V30DS02WrapperDto - .cd(ExternalPersonIdentification1CodeEPC25922V30DS02Dto.POID); + var genericPersonIdentification1EPC25922V30DS02Dto = new GenericPersonIdentification1EPC25922V30DS02Dto() + .id(rtp.payerId()) + .schmeNm(personIdentificationSchemeName1ChoiceEPC25922V30DS02Dto); - GenericPersonIdentification1EPC25922V30DS02Dto genericPersonIdentification1EPC25922V30DS02Dto = new GenericPersonIdentification1EPC25922V30DS02Dto( - rtp.payerId()); - genericPersonIdentification1EPC25922V30DS02Dto - .setSchmeNm(externalPersonIdentification1CodeEPC25922V30DS02WrapperDto); - - List lGenericPersonIdentification1EPC25922V30DS02Dtos = new ArrayList<>(); + var lGenericPersonIdentification1EPC25922V30DS02Dtos = new ArrayList(); lGenericPersonIdentification1EPC25922V30DS02Dtos.add(genericPersonIdentification1EPC25922V30DS02Dto); - PersonIdentification13EPC25922V30DS02Dto personIdentification13EPC25922V30DS02Dto = new PersonIdentification13EPC25922V30DS02Dto(); - personIdentification13EPC25922V30DS02Dto.setOthr(lGenericPersonIdentification1EPC25922V30DS02Dtos); + var personIdentification13EPC25922V30DS02Dto = new PersonIdentification13EPC25922V30DS02Dto() + .othr(lGenericPersonIdentification1EPC25922V30DS02Dtos); - PersonIdentification13EPC25922V30DS02WrapperDto personIdentification13EPC25922V30DS02WrapperDto = new PersonIdentification13EPC25922V30DS02WrapperDto(); - personIdentification13EPC25922V30DS02WrapperDto.setPrvtId(personIdentification13EPC25922V30DS02Dto); + var party38ChoiceEPC25922V30DS02Dto = new Party38ChoiceEPC25922V30DS02Dto() + .prvtId(personIdentification13EPC25922V30DS02Dto); - PartyIdentification135EPC25922V30DS022Dto partyIdentification135EPC25922V30DS022Dto = new PartyIdentification135EPC25922V30DS022Dto(); - partyIdentification135EPC25922V30DS022Dto.setNm(rtp.payerName()); - partyIdentification135EPC25922V30DS022Dto - .setId(personIdentification13EPC25922V30DS02WrapperDto); + var partyIdentification135EPC25922V30DS022Dto = new PartyIdentification135EPC25922V30DS022Dto() + .nm(rtp.payerName()) + .id(party38ChoiceEPC25922V30DS02Dto); - FinancialInstitutionIdentification18EPC25922V30DS02Dto dbtFinancialInstitutionIdentification18EPC25922V30DS02Dto = new FinancialInstitutionIdentification18EPC25922V30DS02Dto(); + var dbtFinancialInstitutionIdentification18EPC25922V30DS02Dto = new FinancialInstitutionIdentification18EPC25922V30DS02Dto(); dbtFinancialInstitutionIdentification18EPC25922V30DS02Dto.setBICFI(rtp.rtpSpId()); - BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto dbtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto = new BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto(); - dbtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto - .setFinInstnId(dbtFinancialInstitutionIdentification18EPC25922V30DS02Dto); + var dbtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto = new BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto() + .finInstnId(dbtFinancialInstitutionIdentification18EPC25922V30DS02Dto); - PaymentIdentification6EPC25922V30DS02Dto paymentIdentification6EPC25922V30DS02Dto = new PaymentIdentification6EPC25922V30DS02Dto( - rtp.resourceID().getId().toString(), rtp.noticeNumber()); + var paymentIdentification6EPC25922V30DS02Dto = new PaymentIdentification6EPC25922V30DS02Dto() + .instrId(rtp.resourceID().getId().toString()) + .endToEndId(rtp.noticeNumber()); - ExternalServiceLevel1CodeWrapperDto externalServiceLevel1CodeWrapperDto = new ExternalServiceLevel1CodeWrapperDto(); - externalServiceLevel1CodeWrapperDto.setCd(ExternalServiceLevel1CodeDto.SRTP);// FIXED + var serviceLevel8ChoiceDto = new ServiceLevel8ChoiceDto() + .cd(ExternalServiceLevel1CodeDto.SRTP); // FIXED - Max35TextWrapperDto max35TextWrapperDto = new Max35TextWrapperDto(); - max35TextWrapperDto.setPrtry("PAGOPA"); // FIXED + var localInstrument2ChoiceDto = new LocalInstrument2ChoiceDto() + .prtry("PAGOPA");// FIXED - PaymentTypeInformation26EPC25922V30DS02Dto paymentTypeInformation26EPC25922V30DS02Dto = new PaymentTypeInformation26EPC25922V30DS02Dto( - externalServiceLevel1CodeWrapperDto, max35TextWrapperDto); + var paymentTypeInformation26EPC25922V30DS02Dto = new PaymentTypeInformation26EPC25922V30DS02Dto() + .svcLvl(serviceLevel8ChoiceDto) + .lclInstrm(localInstrument2ChoiceDto); - ActiveOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto activeOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto = new ActiveOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto(); - activeOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto - .setInstdAmt(rtp.amount().movePointLeft(2)); + var amountType4ChoiceEPC25922V30DS02Dto = new AmountType4ChoiceEPC25922V30DS02Dto() + .instdAmt(rtp.amount().movePointLeft(2)); - Max35TextWrapperDto cdtMax35TextWrapperDto = new Max35TextWrapperDto(); - cdtMax35TextWrapperDto.setPrtry("LEI");// FIXED + var financialIdentificationSchemeName1ChoiceDto = new FinancialIdentificationSchemeName1ChoiceDto() + .prtry("LEI"); // FIXED - GenericFinancialIdentification1Dto genericFinancialIdentification1Dto = new GenericFinancialIdentification1Dto(); - genericFinancialIdentification1Dto.setId("15376371009");// FIXED PAGOPA FC - genericFinancialIdentification1Dto.setSchmeNm(cdtMax35TextWrapperDto); + var genericFinancialIdentification1Dto = new GenericFinancialIdentification1Dto() + .id("15376371009") // FIXED PAGOPA FC + .schmeNm(financialIdentificationSchemeName1ChoiceDto); - FinancialInstitutionIdentification18EPC25922V30DS02Dto financialInstitutionIdentification18EPC25922V30DS02Dto = new FinancialInstitutionIdentification18EPC25922V30DS02Dto(); - financialInstitutionIdentification18EPC25922V30DS02Dto.setOthr(genericFinancialIdentification1Dto); + var financialInstitutionIdentification18EPC25922V30DS02Dto = new FinancialInstitutionIdentification18EPC25922V30DS02Dto() + .othr(genericFinancialIdentification1Dto); - BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto cdtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto = new BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto(); - cdtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto - .setFinInstnId(financialInstitutionIdentification18EPC25922V30DS02Dto); + var cdtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto = new BranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto() + .finInstnId(financialInstitutionIdentification18EPC25922V30DS02Dto); - ExternalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto externalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto = new ExternalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto(); - externalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto - .setCd(ExternalOrganisationIdentification1CodeEPC25922V30DS022Dto.BOID); + var organisationIdentificationSchemeName1ChoiceEPC25922V30DS022Dto = new OrganisationIdentificationSchemeName1ChoiceEPC25922V30DS022Dto() + .cd(ExternalOrganisationIdentification1CodeEPC25922V30DS022Dto.BOID); - GenericOrganisationIdentification1EPC25922V30DS022Dto genericOrganisationIdentification1EPC25922V30DS022Dto = new GenericOrganisationIdentification1EPC25922V30DS022Dto(); - genericOrganisationIdentification1EPC25922V30DS022Dto.setId(rtp.payeeId()); - genericOrganisationIdentification1EPC25922V30DS022Dto - .setSchmeNm(externalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto); + var genericOrganisationIdentification1EPC25922V30DS022Dto = new GenericOrganisationIdentification1EPC25922V30DS022Dto() + .id(rtp.payeeId()) + .schmeNm(organisationIdentificationSchemeName1ChoiceEPC25922V30DS022Dto); - List lGenericOrganisationIdentification1EPC25922V30DS022Dtos = new ArrayList<>(); + var lGenericOrganisationIdentification1EPC25922V30DS022Dtos = new ArrayList(); lGenericOrganisationIdentification1EPC25922V30DS022Dtos .add(genericOrganisationIdentification1EPC25922V30DS022Dto); - OrganisationIdentification29EPC25922V30DS022Dto organisationIdentification29EPC25922V30DS022Dto = new OrganisationIdentification29EPC25922V30DS022Dto(); - - organisationIdentification29EPC25922V30DS022Dto - .setOthr(lGenericOrganisationIdentification1EPC25922V30DS022Dtos); + var organisationIdentification29EPC25922V30DS022Dto = new OrganisationIdentification29EPC25922V30DS022Dto() + .othr(lGenericOrganisationIdentification1EPC25922V30DS022Dtos); - OrganisationIdentification29EPC25922V30DS022WrapperDto organisationIdentification29EPC25922V30DS022WrapperDto = new OrganisationIdentification29EPC25922V30DS022WrapperDto(); - organisationIdentification29EPC25922V30DS022WrapperDto - .setOrgId(organisationIdentification29EPC25922V30DS022Dto); + var party38ChoiceEPC25922V30DS022Dto = new Party38ChoiceEPC25922V30DS022Dto() + .orgId(organisationIdentification29EPC25922V30DS022Dto); - PartyIdentification135EPC25922V30DS023Dto partyIdentification135EPC25922V30DS023Dto = new PartyIdentification135EPC25922V30DS023Dto(); - partyIdentification135EPC25922V30DS023Dto.setNm(rtp.payeeName()); - partyIdentification135EPC25922V30DS023Dto - .setId(organisationIdentification29EPC25922V30DS022WrapperDto); + var partyIdentification135EPC25922V30DS023Dto = new PartyIdentification135EPC25922V30DS023Dto() + .nm(rtp.payeeName()) + .id(party38ChoiceEPC25922V30DS022Dto); - IBAN2007IdentifierWrapperDto iban2007IdentifierWrapperDto = new IBAN2007IdentifierWrapperDto(); - iban2007IdentifierWrapperDto.setIBAN(rtp.iban()); + var accountIdentification4ChoiceDto = new AccountIdentification4ChoiceDto(); + accountIdentification4ChoiceDto.setIBAN(rtp.iban()); - CashAccount40EPC25922V30DS022Dto cashAccount40EPC25922V30DS022Dto = new CashAccount40EPC25922V30DS022Dto(); - cashAccount40EPC25922V30DS022Dto.setId(iban2007IdentifierWrapperDto); + var cashAccount40EPC25922V30DS022Dto = new CashAccount40EPC25922V30DS022Dto(); + cashAccount40EPC25922V30DS022Dto.setId(accountIdentification4ChoiceDto); - InstructionForCreditorAgent3EPC25922V30DS02Dto payTrxRefinstructionForCreditorAgent3EPC25922V30DS02Dto = new InstructionForCreditorAgent3EPC25922V30DS02Dto( - "ATR113/"+rtp.payTrxRef()); - InstructionForCreditorAgent3EPC25922V30DS02Dto flgConfRefinstructionForCreditorAgent3EPC25922V30DS02Dto = new InstructionForCreditorAgent3EPC25922V30DS02Dto( - rtp.flgConf()); + var payTrxRefinstructionForCreditorAgent3EPC25922V30DS02Dto = new InstructionForCreditorAgent3EPC25922V30DS02Dto() + .instrInf("ATR113/" + rtp.payTrxRef()); + var flgConfRefinstructionForCreditorAgent3EPC25922V30DS02Dto = new InstructionForCreditorAgent3EPC25922V30DS02Dto() + .instrInf(rtp.flgConf()); - List lInstructionForCreditorAgent3EPC25922V30DS02Dtos = new ArrayList<>(); + var lInstructionForCreditorAgent3EPC25922V30DS02Dtos = new ArrayList(); lInstructionForCreditorAgent3EPC25922V30DS02Dtos .add(payTrxRefinstructionForCreditorAgent3EPC25922V30DS02Dto); lInstructionForCreditorAgent3EPC25922V30DS02Dtos @@ -171,46 +159,42 @@ public SepaRequestToPayRequestResourceDto toRequestToPay(Rtp rtp) { lUstrd.add(rtp.subject() + "/" + rtp.noticeNumber() + " -"); lUstrd.add("ATS001/" + rtp.description()); - RemittanceInformation21EPC25922V30DS02Dto remittanceInformation21EPC25922V30DS02Dto = new RemittanceInformation21EPC25922V30DS02Dto(); - remittanceInformation21EPC25922V30DS02Dto.setUstrd(lUstrd); - - CreditTransferTransaction57EPC25922V30DS02Dto creditTransferTransaction57EPC25922V30DS02Dto = new CreditTransferTransaction57EPC25922V30DS02Dto(); - creditTransferTransaction57EPC25922V30DS02Dto.setPmtId(paymentIdentification6EPC25922V30DS02Dto); - creditTransferTransaction57EPC25922V30DS02Dto.setPmtTpInf(paymentTypeInformation26EPC25922V30DS02Dto); - creditTransferTransaction57EPC25922V30DS02Dto - .setAmt(activeOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto); - creditTransferTransaction57EPC25922V30DS02Dto.setChrgBr(ChargeBearerType1CodeDto.SLEV);// FIXED - creditTransferTransaction57EPC25922V30DS02Dto - .setCdtrAgt(cdtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto); - creditTransferTransaction57EPC25922V30DS02Dto.setCdtr(partyIdentification135EPC25922V30DS023Dto); - creditTransferTransaction57EPC25922V30DS02Dto.setCdtrAcct(cashAccount40EPC25922V30DS022Dto); - creditTransferTransaction57EPC25922V30DS02Dto - .instrForCdtrAgt(lInstructionForCreditorAgent3EPC25922V30DS02Dtos); - creditTransferTransaction57EPC25922V30DS02Dto.setRmtInf(remittanceInformation21EPC25922V30DS02Dto); - - List lCreditTransferTransaction57EPC25922V30DS02Dtos = new ArrayList<>(); + var remittanceInformation21EPC25922V30DS02Dto = new RemittanceInformation21EPC25922V30DS02Dto() + .ustrd(lUstrd); + + var creditTransferTransaction57EPC25922V30DS02Dto = new CreditTransferTransaction57EPC25922V30DS02Dto() + .pmtId(paymentIdentification6EPC25922V30DS02Dto) + .pmtTpInf(paymentTypeInformation26EPC25922V30DS02Dto) + .amt(amountType4ChoiceEPC25922V30DS02Dto) + .chrgBr(ChargeBearerType1CodeDto.SLEV) // FIXED + .cdtrAgt(cdtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto) + .cdtr(partyIdentification135EPC25922V30DS023Dto) + .cdtrAcct(cashAccount40EPC25922V30DS022Dto) + .instrForCdtrAgt(lInstructionForCreditorAgent3EPC25922V30DS02Dtos) + .rmtInf(remittanceInformation21EPC25922V30DS02Dto); + + var lCreditTransferTransaction57EPC25922V30DS02Dtos = new ArrayList(); lCreditTransferTransaction57EPC25922V30DS02Dtos.add(creditTransferTransaction57EPC25922V30DS02Dto); - PaymentInstruction42EPC25922V30DS02Dto paymentInstruction42EPC25922V30DS02Dto = new PaymentInstruction42EPC25922V30DS02Dto(); - paymentInstruction42EPC25922V30DS02Dto.setPmtInfId(rtp.noticeNumber()); - paymentInstruction42EPC25922V30DS02Dto.setPmtMtd(PaymentMethod7CodeDto.TRF);// FIXED - paymentInstruction42EPC25922V30DS02Dto.setReqdExctnDt(isoDateWrapperDto); - paymentInstruction42EPC25922V30DS02Dto.setXpryDt(isoDateWrapperDto); - paymentInstruction42EPC25922V30DS02Dto.setDbtr(partyIdentification135EPC25922V30DS022Dto); - paymentInstruction42EPC25922V30DS02Dto - .setDbtrAgt(dbtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto); - paymentInstruction42EPC25922V30DS02Dto.setCdtTrfTx(lCreditTransferTransaction57EPC25922V30DS02Dtos); + var paymentInstruction42EPC25922V30DS02Dto = new PaymentInstruction42EPC25922V30DS02Dto() + .pmtInfId(rtp.noticeNumber()) + .pmtMtd(PaymentMethod7CodeDto.TRF) // FIXED + .reqdExctnDt(dateAndDateTime2ChoiceEPC25922V30DS02Dto) + .xpryDt(dateAndDateTime2ChoiceEPC25922V30DS02Dto) + .dbtr(partyIdentification135EPC25922V30DS022Dto) + .dbtrAgt(dbtBranchAndFinancialInstitutionIdentification6EPC25922V30DS02Dto) + .cdtTrfTx(lCreditTransferTransaction57EPC25922V30DS02Dtos); List listPaymentInstruction42EPC25922V30DS02Dto = new ArrayList<>(); listPaymentInstruction42EPC25922V30DS02Dto.add(paymentInstruction42EPC25922V30DS02Dto); - CreditorPaymentActivationRequestV10EPC25922V30DS02Dto creditorPaymentActivationRequestV10EPC25922V30DS02Dto = new CreditorPaymentActivationRequestV10EPC25922V30DS02Dto(); + var creditorPaymentActivationRequestV10EPC25922V30DS02Dto = new CreditorPaymentActivationRequestV10EPC25922V30DS02Dto(); creditorPaymentActivationRequestV10EPC25922V30DS02Dto.setGrpHdr(groupHeader105EPC25922V30DS02Dto); creditorPaymentActivationRequestV10EPC25922V30DS02Dto .setPmtInf(listPaymentInstruction42EPC25922V30DS02Dto); - DocumentEPC25922V30DS02Dto documentEPC25922V30DS02Dto = new DocumentEPC25922V30DS02Dto(); - documentEPC25922V30DS02Dto.setCdtrPmtActvtnReq(creditorPaymentActivationRequestV10EPC25922V30DS02Dto); + var documentEPC25922V30DS02Dto = new DocumentEPC25922V30DS02Dto() + .cdtrPmtActvtnReq(creditorPaymentActivationRequestV10EPC25922V30DS02Dto); sepaRequestToPayRequestResourceDto.setCallbackUrl(URI.create("http://spsrtp.api.cstar.pagopa.it"));// FIXED sepaRequestToPayRequestResourceDto.setResourceId(rtp.resourceID().getId().toString()); @@ -218,4 +202,5 @@ public SepaRequestToPayRequestResourceDto toRequestToPay(Rtp rtp) { return sepaRequestToPayRequestResourceDto; } + } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4fa1a69..bf8fbef 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -22,3 +22,9 @@ activation.base-url: ${BASE_URL:http://localhost} service-provider: activation: api-version: v1 + send: + epc-mock-url: ${EPC_MOCK_URL:https://api-rtp.dev.cstar.pagopa.it/rtp/mock} + retry: + max-attempts: ${EPC_SEND_RETRY_MAX_ATTEMPTS:3} + backoff-min-duration: ${EPC_SEND_RETRY_BACKOFF_MIN_DURATION_MS:1000} + backoff-jitter: ${EPC_SEND_RETRY_BACKOFF_JITTER:0.75} diff --git a/src/main/terraform/env/cstar-d-weu-rtp/terraform.tfvars b/src/main/terraform/env/cstar-d-weu-rtp/terraform.tfvars index 574c463..1505b4c 100644 --- a/src/main/terraform/env/cstar-d-weu-rtp/terraform.tfvars +++ b/src/main/terraform/env/cstar-d-weu-rtp/terraform.tfvars @@ -52,4 +52,8 @@ rtp_environment_configs = { DB_NAME : "rtp" BASE_URL : "https://api-rtp.dev.cstar.pagopa.it/rtp/activation/activations/" OTEL_TRACES_SAMPLER : "always_on" + EPC_MOCK_URL : "https://api-rtp.dev.cstar.pagopa.it/rtp/mock" + EPC_SEND_RETRY_MAX_ATTEMPTS: 1 + EPC_SEND_RETRY_BACKOFF_MIN_DURATION_MS: 1000 + EPC_SEND_RETRY_BACKOFF_JITTER: 0.75 } diff --git a/src/main/terraform/env/cstar-p-weu-rtp/terraform.tfvars b/src/main/terraform/env/cstar-p-weu-rtp/terraform.tfvars index c13ef19..879fa74 100644 --- a/src/main/terraform/env/cstar-p-weu-rtp/terraform.tfvars +++ b/src/main/terraform/env/cstar-p-weu-rtp/terraform.tfvars @@ -50,4 +50,8 @@ rtp_environment_configs = { DB_NAME : "rtp" BASE_URL : "https://api-rtp.cstar.pagopa.it/rtp/activation/activations/" OTEL_TRACES_SAMPLER : "always_on" + EPC_MOCK_URL : "https://api-rtp.cstar.pagopa.it/rtp/mock" + EPC_SEND_RETRY_MAX_ATTEMPTS: 1 + EPC_SEND_RETRY_BACKOFF_MIN_DURATION_MS: 1000 + EPC_SEND_RETRY_BACKOFF_JITTER: 0.75 } diff --git a/src/main/terraform/env/cstar-u-weu-rtp/terraform.tfvars b/src/main/terraform/env/cstar-u-weu-rtp/terraform.tfvars index 1bb8ae3..fb18aa2 100644 --- a/src/main/terraform/env/cstar-u-weu-rtp/terraform.tfvars +++ b/src/main/terraform/env/cstar-u-weu-rtp/terraform.tfvars @@ -52,4 +52,8 @@ rtp_environment_configs = { DB_NAME : "rtp" BASE_URL : "https://api-rtp.uat.cstar.pagopa.it/rtp/activation/activations/" OTEL_TRACES_SAMPLER : "always_on" + EPC_MOCK_URL : "https://api-rtp.uat.cstar.pagopa.it/rtp/mock" + EPC_SEND_RETRY_MAX_ATTEMPTS: 1 + EPC_SEND_RETRY_BACKOFF_MIN_DURATION_MS: 1000 + EPC_SEND_RETRY_BACKOFF_JITTER: 0.75 } diff --git a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java index 117db6c..7ff84f2 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java @@ -9,13 +9,18 @@ import it.gov.pagopa.rtp.activator.activateClient.model.ActivationDto; import it.gov.pagopa.rtp.activator.activateClient.model.PayerDto; import it.gov.pagopa.rtp.activator.configuration.ServiceProviderConfig; +import it.gov.pagopa.rtp.activator.configuration.ServiceProviderConfig.Activation; +import it.gov.pagopa.rtp.activator.configuration.ServiceProviderConfig.Send; +import it.gov.pagopa.rtp.activator.configuration.ServiceProviderConfig.Send.Retry; import it.gov.pagopa.rtp.activator.domain.errors.MessageBadFormed; import it.gov.pagopa.rtp.activator.domain.errors.PayerNotActivatedException; import it.gov.pagopa.rtp.activator.domain.rtp.ResourceID; import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; import it.gov.pagopa.rtp.activator.domain.rtp.RtpRepository; import it.gov.pagopa.rtp.activator.domain.rtp.RtpStatus; -import it.gov.pagopa.rtp.activator.model.generated.epc.SepaRequestToPayRequestResourceDto; +import it.gov.pagopa.rtp.activator.epcClient.api.DefaultApi; +import it.gov.pagopa.rtp.activator.epcClient.model.SepaRequestToPayRequestResourceDto; +import it.gov.pagopa.rtp.activator.epcClient.model.SynchronousSepaRequestToPayCreationResponseDto; import java.math.BigDecimal; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -38,9 +43,13 @@ class SendRTPServiceTest { private SepaRequestToPayMapper sepaRequestToPayMapper; @Mock private ReadApi readApi; - private final ServiceProviderConfig serviceProviderConfig = new ServiceProviderConfig("v1"); + private final ServiceProviderConfig serviceProviderConfig = new ServiceProviderConfig( + new Activation("http://localhost:8080"), + new Send("v1", new Retry(0, 0, 0))); @Mock private RtpRepository rtpRepository; + @Mock + private DefaultApi defaultApi; private SendRTPServiceImpl sendRTPService; @@ -55,20 +64,22 @@ class SendRTPServiceTest { final String iban = "IT60X0542811101000000123456"; final String payTrxRef = "ABC/124"; final String flgConf = "flgConf"; + final String subject = "subject"; Rtp inputRtp; @BeforeEach void setUp() { sendRTPService = new SendRTPServiceImpl(sepaRequestToPayMapper, readApi, - serviceProviderConfig, rtpRepository); + serviceProviderConfig, rtpRepository, defaultApi); inputRtp = Rtp.builder().noticeNumber(noticeNumber).amount(amount).description(description) .expiryDate(expiryDate) .payerId(payerId).payeeName(payeeName).payeeId(payeeId) .resourceID(ResourceID.createNew()) .savingDateTime(LocalDateTime.now()).rtpSpId(rtpSpId) .iban(iban).payTrxRef(payTrxRef) - .flgConf(flgConf).build(); + .flgConf(flgConf) + .subject(subject).build(); } @Test @@ -93,16 +104,19 @@ void testSend() { .iban(iban).payTrxRef(payTrxRef) .status(RtpStatus.CREATED) .flgConf(flgConf) + .subject(subject) .build(); - SepaRequestToPayRequestResourceDto mockSepaRequestToPayRequestResource = new SepaRequestToPayRequestResourceDto( - URI.create("http://callback.url")); + SepaRequestToPayRequestResourceDto mockSepaRequestToPayRequestResource = new SepaRequestToPayRequestResourceDto() + .callbackUrl(URI.create("http://callback.url")); - when(sepaRequestToPayMapper.toRequestToPay(any(Rtp.class))) + when(sepaRequestToPayMapper.toEpcRequestToPay(any(Rtp.class))) .thenReturn(mockSepaRequestToPayRequestResource); when(readApi.findActivationByPayerId(any(), any(), any())) .thenReturn(Mono.just(fakeActivationDto)); when(rtpRepository.save(any())) .thenReturn(Mono.just(expectedRtp)); + when(defaultApi.postRequestToPayRequests(any(), any(), any())) + .thenReturn(Mono.just(new SynchronousSepaRequestToPayCreationResponseDto())); Mono result = sendRTPService.send(inputRtp); StepVerifier.create(result) @@ -117,10 +131,13 @@ void testSend() { && rtp.iban().equals(expectedRtp.iban()) && rtp.payTrxRef().equals(expectedRtp.payTrxRef()) && rtp.flgConf().equals(expectedRtp.flgConf()) - && rtp.status().equals(expectedRtp.status())) + && rtp.status().equals(expectedRtp.status()) + && rtp.subject().equals(expectedRtp.subject())) .verifyComplete(); - verify(sepaRequestToPayMapper, times(1)).toRequestToPay(any(Rtp.class)); + verify(sepaRequestToPayMapper, times(2)).toEpcRequestToPay(any(Rtp.class)); verify(readApi, times(1)).findActivationByPayerId(any(), any(), any()); + verify(defaultApi, times(1)).postRequestToPayRequests(any(), any(), any()); + verify(rtpRepository, times(2)).save(any()); } @Test @@ -134,7 +151,7 @@ void givenPayerIdNotActivatedWhenSendThenMonoError() { .expectError(PayerNotActivatedException.class) .verify(); - verify(sepaRequestToPayMapper, times(0)).toRequestToPay(any(Rtp.class)); + verify(sepaRequestToPayMapper, times(0)).toEpcRequestToPay(any(Rtp.class)); verify(readApi, times(1)).findActivationByPayerId(any(), any(), any()); } @@ -150,7 +167,7 @@ void givenPayerIdBadFormedWhenSendThenMonoError() { .expectError(MessageBadFormed.class) .verify(); - verify(sepaRequestToPayMapper, times(0)).toRequestToPay(any(Rtp.class)); + verify(sepaRequestToPayMapper, times(0)).toEpcRequestToPay(any(Rtp.class)); verify(readApi, times(1)).findActivationByPayerId(any(), any(), any()); } @@ -165,7 +182,39 @@ void givenInternalErrorWhenSendThenMonoError() { .expectError(RuntimeException.class) .verify(); - verify(sepaRequestToPayMapper, times(0)).toRequestToPay(any(Rtp.class)); + verify(sepaRequestToPayMapper, times(0)).toEpcRequestToPay(any(Rtp.class)); + verify(readApi, times(1)).findActivationByPayerId(any(), any(), any()); + } + + @Test + void givenInternalErrorOnExternalSendWhenSendThenPropagateMonoError() { + var activationRtpSpId = "activationRtpSpId"; + var activationFiscalCode = "activationFiscalCode"; + var fakeActivationDto = new ActivationDto(); + fakeActivationDto.setId(UUID.randomUUID()); + fakeActivationDto.setEffectiveActivationDate(LocalDateTime.now()); + var payerDto = new PayerDto(); + payerDto.setRtpSpId(activationRtpSpId); + payerDto.setFiscalCode(activationFiscalCode); + fakeActivationDto.setPayer(payerDto); + var expectedRtp = Rtp.builder().resourceID(ResourceID.createNew()).build(); + + when(readApi.findActivationByPayerId(any(), any(), any())) + .thenReturn(Mono.just(fakeActivationDto)); + when(defaultApi.postRequestToPayRequests(any(), any(), any())) + .thenReturn(Mono.error(new WebClientResponseException(500, "Internal Server Error", null, null, null))); + when(rtpRepository.save(any())) + .thenReturn(Mono.just(expectedRtp)); + + Mono result = sendRTPService.send(inputRtp); + + StepVerifier.create(result) + .expectError(UnsupportedOperationException.class) + .verify(); + + verify(sepaRequestToPayMapper, times(2)).toEpcRequestToPay(any(Rtp.class)); verify(readApi, times(1)).findActivationByPayerId(any(), any(), any()); + verify(defaultApi, times(1)).postRequestToPayRequests(any(), any(), any()); + verify(rtpRepository, times(1)).save(any()); } } diff --git a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java index d42a611..1f78c79 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java @@ -8,7 +8,6 @@ import it.gov.pagopa.rtp.activator.domain.rtp.ResourceID; import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; -import it.gov.pagopa.rtp.activator.model.generated.epc.SepaRequestToPayRequestResourceDto; import java.math.BigDecimal; import java.time.LocalDate; @@ -26,7 +25,7 @@ void setUp() { @Test - void testToRequestToPay() { + void testToEpcRequestToPay() { ResourceID resourceId = ResourceID.createNew(); String payerId = "payerId123"; String payeeId = "payeeId123"; @@ -48,7 +47,7 @@ void testToRequestToPay() { .savingDateTime(savingDateTime).expiryDate(expiryDate).description(description).subject(subject) .noticeNumber(noticeNumber).payTrxRef(payTrxRef).flgConf(flgConf).build(); - SepaRequestToPayRequestResourceDto result = sepaRequestToPayMapper.toRequestToPay(nRtp); + var result = sepaRequestToPayMapper.toEpcRequestToPay(nRtp); assertNotNull(result); assertEquals(resourceId.getId().toString(), result.getResourceId()); diff --git a/src/test/resources/application.yaml b/src/test/resources/application.yaml index 882a438..b33f409 100644 --- a/src/test/resources/application.yaml +++ b/src/test/resources/application.yaml @@ -4,4 +4,14 @@ activation.baseUrl: http://localhost:8080/ azure.cosmos: uri: https://example.com/db/endpoint key: your-primary-key - database: rtp \ No newline at end of file + database: rtp + +service-provider: + activation: + api-version: v1 + send: + epc-mock-url: ${EPC_MOCK_URL:http://localhost:8080/rtp/mock} + retry: + max-attempts: ${EPC_SEND_RETRY_MAX_ATTEMPTS:3} + backoff-min-duration: ${EPC_SEND_RETRY_BACKOFF_MIN_DURATION_MS:1000} + backoff-jitter: ${EPC_SEND_RETRY_BACKOFF_JITTER:0.75}