From 2d137e0fa96ec87b96b9eb3cb3564bc2fe5499a6 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 12:27:10 +0200 Subject: [PATCH 01/15] feat(npg-apm): api keys configuration for APM --- README.md | 6 ++++++ helm/values-dev.yaml | 8 +++++++- helm/values-prod.yaml | 6 ++++++ helm/values-uat.yaml | 8 +++++++- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 478088df7..86233c7f0 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,12 @@ These are all environment variables needed by the application: | NODE_FORWARDER_CONNECTION_TIMEOUT | | Node forwarder request connection timeout | number | | | TRANSACTIONS_AUTHORIZATION_REQUESTED_QUEUE_NAME | | Name of the queue for transaction payment gateway polling for authorization requested transactions | string | | | NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS | | Timeout for npg authorization state query | number | | +| NPG_PAYPAL_PSP_KEYS | | Secret structure that holds psp - api keys association for authorization request used for APM PAYPAL payment method | string | | +| NPG_PAYPAL_PSP_LIST | | List of all psp ids that are expected to be found into the NPG_PAYPAL_PSP_KEYS configuration (used for configuration cross validation) | string | | +| NPG_BANCOMATPAY_PSP_KEYS | | Secret structure that holds psp - api keys association for authorization request used for APM Bancomat pay payment method | string | | +| NPG_BANCOMATPAY_PSP_LIST | | List of all psp ids that are expected to be found into the NPG_BANCOMATPAY_PSP_KEYS configuration (used for configuration cross validation) | string | | +| NPG_MYBANK_PSP_KEYS | | Secret structure that holds psp - api keys association for authorization request used for APM My bank payment method | string | | +| NPG_MYBANK_PSP_LIST | | List of all psp ids that are expected to be found into the NPG_MYBANK_PSP_LIST configuration (used for configuration cross validation) | string | | An example configuration of these environment variables is in the `.env.example` file. diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 809acf3e5..bcbf0400a 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -130,7 +130,10 @@ microservice-chart: NPG_URI: "https://stg-ta.nexigroup.com/api/phoenix-0.0" NPG_READ_TIMEOUT: "10000" NPG_CONNECTION_TIMEOUT: "10000" - NPG_CARDS_PSP_LIST: "BCITITMM,CIPBITMM,BIC36019,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX" + NPG_CARDS_PSP_LIST: "BCITITMM,CIPBITMM,BIC36019,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX,BNLIITRR" + NPG_PAYPAL_PSP_LIST: "BCITITMM" + NPG_MYBANK_PSP_LIST: "BCITITMM" + NPG_BANCOMATPAY_PSP_LIST: "BCITITMM" NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS: "60" TRANSACTION_DOCUMENT_TTL: "600" CHECKOUT_BASE_PATH: "https://dev.checkout.pagopa.it" @@ -162,6 +165,9 @@ microservice-chart: JWT_NPG_NOTIFICATION_SECRET: npg-notification-signing-key NODE_FORWARDER_API_KEY: node-forwarder-api-key REDIRECT_URL_MAPPING: redirect-url-mapping + NPG_PAYPAL_PSP_KEYS: npg-paypal-psp-keys + NPG_BANCOMATPAY_PSP_KEYS: npg-bancomatpay-psp-keys + NPG_MYBANK_PSP_KEYS: npg-mybank-psp-keys keyvault: name: "pagopa-d-ecommerce-kv" tenantId: "7788edaf-0346-4068-9d79-c868aed15b3d" diff --git a/helm/values-prod.yaml b/helm/values-prod.yaml index 3ed56b6c0..9dbdaaf32 100644 --- a/helm/values-prod.yaml +++ b/helm/values-prod.yaml @@ -155,6 +155,9 @@ microservice-chart: NPG_READ_TIMEOUT: "10000" NPG_CONNECTION_TIMEOUT: "10000" NPG_CARDS_PSP_LIST: "BCITITMM,CIPBITMM,BIC36019,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX" + NPG_PAYPAL_PSP_LIST: "BCITITMM" + NPG_MYBANK_PSP_LIST: "BCITITMM" + NPG_BANCOMATPAY_PSP_LIST: "BCITITMM" NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS: "60" TRANSACTION_DOCUMENT_TTL: "600" CHECKOUT_BASE_PATH: "https://checkout.pagopa.it" @@ -186,6 +189,9 @@ microservice-chart: JWT_NPG_NOTIFICATION_SECRET: npg-notification-signing-key NODE_FORWARDER_API_KEY: node-forwarder-api-key REDIRECT_URL_MAPPING: redirect-url-mapping + NPG_PAYPAL_PSP_KEYS: npg-paypal-psp-keys + NPG_BANCOMATPAY_PSP_KEYS: npg-bancomatpay-psp-keys + NPG_MYBANK_PSP_KEYS: npg-mybank-psp-keys keyvault: name: "pagopa-p-ecommerce-kv" tenantId: "7788edaf-0346-4068-9d79-c868aed15b3d" diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index e5bec235a..0b4574230 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -148,7 +148,10 @@ microservice-chart: NPG_URI: "https://stg-ta.nexigroup.com/api/phoenix-0.0" NPG_READ_TIMEOUT: "10000" NPG_CONNECTION_TIMEOUT: "10000" - NPG_CARDS_PSP_LIST: "" #TODO to be filled with psp id list that are expected to be present into psp api keys configuration + NPG_CARDS_PSP_LIST: "BCITITMM,CIPBITMM,BIC36019,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX,BNLIITRR" + NPG_PAYPAL_PSP_LIST: "BCITITMM" + NPG_MYBANK_PSP_LIST: "BCITITMM" + NPG_BANCOMATPAY_PSP_LIST: "BCITITMM" NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS: "60" TRANSACTION_DOCUMENT_TTL: "600" CHECKOUT_BASE_PATH: "https://uat.checkout.pagopa.it" @@ -180,6 +183,9 @@ microservice-chart: JWT_NPG_NOTIFICATION_SECRET: npg-notification-signing-key NODE_FORWARDER_API_KEY: node-forwarder-api-key REDIRECT_URL_MAPPING: redirect-url-mapping + NPG_PAYPAL_PSP_KEYS: npg-paypal-psp-keys + NPG_BANCOMATPAY_PSP_KEYS: npg-bancomatpay-psp-keys + NPG_MYBANK_PSP_KEYS: npg-mybank-psp-keys keyvault: name: "pagopa-u-ecommerce-kv" tenantId: "7788edaf-0346-4068-9d79-c868aed15b3d" From c4eae7bedd255bdf4036e76b0b2d6bb7153da823 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 12:32:14 +0200 Subject: [PATCH 02/15] feat: add env properties + env example --- .env.example | 6 ++++++ src/main/resources/application.properties | 6 ++++++ src/test/resources/application-tests.properties | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/.env.example b/.env.example index 4f8e30038..958134e9c 100644 --- a/.env.example +++ b/.env.example @@ -78,6 +78,12 @@ NPG_CONNECTION_TIMEOUT=10000 NPG_API_KEY="npg-api-key" NPG_CARDS_PSP_LIST=CIPBITMM,BNLIITRR,BCITITMM,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX NPG_CARDS_PSP_KEYS={"CIPBITMM":"CIPBITMM-api-key","BNLIITRR":"BNLIITRR-api-key","BCITITMM":"BCITITMM-api-key","UNCRITMM":"UNCRITMM-api-key","BPPIITRRXXX":"BPPIITRRXXX-api-key","PPAYITR1XXX":"PPAYITR1XXX-api-key"} +NPG_PAYPAL_PSP_LIST=BCITITMM +NPG_PAYPAL_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} +NPG_BANCOMATPAY_PSP_LIST=BCITITMM +NPG_BANCOMATPAY_PSP_KEYS=={"BCITITMM":"BCITITMM-api-key"} +NPG_MYBANK_PSP_LIST=BCITITMM +NPG_MYBANK_PSP_KEYS=={"BCITITMM":"BCITITMM-api-key"} TRANSACTION_DOCUMENT_TTL=600 ECOMMERCE_EVENT_VERSION=V2 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0f0cd009f..8d542a3d4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -80,6 +80,12 @@ npg.connectionTimeout=${NPG_CONNECTION_TIMEOUT} npg.client.apiKey=${NPG_API_KEY} npg.authorization.cards.keys=${NPG_CARDS_PSP_KEYS} npg.authorization.cards.pspList=${NPG_CARDS_PSP_LIST} +npg.authorization.paypal.keys=${NPG_PAYPAL_PSP_KEYS} +npg.authorization.paypal.pspList=${NPG_PAYPAL_PSP_LIST} +npg.authorization.bancomatpay.keys=${NPG_BANCOMATPAY_PSP_KEYS} +npg.authorization.bancomatpay.pspList=${NPG_BANCOMATPAY_PSP_LIST} +npg.authorization.mybank.keys=${NPG_MYBANK_PSP_KEYS} +npg.authorization.mybank.pspList=${NPG_MYBANK_PSP_LIST} npg.authorization.request.timeout.seconds=${NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS} ecommerce.event.version=${ECOMMERCE_EVENT_VERSION} diff --git a/src/test/resources/application-tests.properties b/src/test/resources/application-tests.properties index f1297f677..10d452293 100644 --- a/src/test/resources/application-tests.properties +++ b/src/test/resources/application-tests.properties @@ -69,6 +69,12 @@ npg.connectionTimeout=10000 npg.client.apiKey=npg_key npg.authorization.cards.keys={"psp1":"key1","psp2":"key2"} npg.authorization.cards.pspList=psp1,psp2 +npg.authorization.paypal.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.paypal.pspList=psp1,psp2 +npg.authorization.bancomatpay.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.bancomatpay.pspList=psp1,psp2 +npg.authorization.mybank.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.mybank.pspList=psp1,psp2 npg.authorization.request.timeout.seconds=600 ecommerce.event.version=V2 transactionDocument.ttl=1000 From 7e4f0859fed053f95e292070bc732d99d7806bc9 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 15:18:44 +0200 Subject: [PATCH 03/15] feat: add configuration logic + tests --- pom.xml | 4 +- .../client/PaymentGatewayClient.java | 25 ++-- .../NpgPspApiKeysConfigBuilder.java | 109 ++++++++++++++++- .../client/PaymentGatewayClientTest.java | 40 ++++++- .../NpgPspApiKeysConfigTest.java | 110 +++++++++++++++++- .../resources/application-tests.properties | 8 +- 6 files changed, 269 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 2ad22bc53..4d1e71363 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 17 4.0.0 0.8.8 - 1.10.2 + 1.10.4 2.28.0 1.5.0 4.11.0 @@ -510,6 +510,8 @@ scm:git:https://github.com/pagopa/pagopa-ecommerce-commons.git tag ${pagopa-ecommerce-commons.version} + branch + CHK-2684-npg-apm-api-keys install -DskipTests diff --git a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java index e100d6f29..ceb1d7072 100644 --- a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java +++ b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java @@ -15,7 +15,7 @@ import it.pagopa.ecommerce.commons.generated.npg.v1.dto.StateResponseDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.WorkflowStateDto; import it.pagopa.ecommerce.commons.utils.JwtTokenUtils; -import it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; import it.pagopa.ecommerce.commons.utils.UniqueIdUtils; import it.pagopa.generated.ecommerce.gateway.v1.api.VposInternalApi; import it.pagopa.generated.ecommerce.gateway.v1.api.XPayInternalApi; @@ -74,9 +74,7 @@ public class PaymentGatewayClient { private final NpgSessionUrlConfig npgSessionUrlConfig; - private final NpgPspApiKeysConfig npgPspApiKeysConfig; private final UniqueIdUtils uniqueIdUtils; - private final String npgDefaultApiKey; private final SecretKey npgNotificationSigningKey; private final int npgJwtKeyValidityTime; private final SecretKey ecommerceSigningKey; @@ -96,6 +94,7 @@ public class PaymentGatewayClient { RedirectPaymentMethodId.RBPS, "SCRIGNO Internet Banking" ); + private final NpgApiKeyHandler npgApiKeyHandler; public enum RedirectPaymentMethodId { RBPR, @@ -127,16 +126,15 @@ public PaymentGatewayClient( UUIDUtils uuidUtils, ConfidentialMailUtils confidentialMailUtils, NpgClient npgClient, - NpgPspApiKeysConfig npgPspApiKeysConfig, NpgSessionUrlConfig npgSessionUrlConfig, UniqueIdUtils uniqueIdUtils, - @Value("${npg.client.apiKey}") String npgDefaultApiKey, SecretKey npgNotificationSigningKey, @Value("${npg.notification.jwt.validity.time}") int npgJwtKeyValidityTime, SecretKey ecommerceSigningKey, @Value("${payment.token.validity}") int jwtEcommerceValidityTimeInSeconds, NodeForwarderClient nodeForwarderRedirectApiClient, - Map redirectBeApiCallUriMap + Map redirectBeApiCallUriMap, + NpgApiKeyHandler npgApiKeyHandler ) { this.paymentTransactionGatewayXPayWebClient = paymentTransactionGatewayXPayWebClient; this.creditCardInternalApiClient = creditCardInternalApiClient; @@ -144,16 +142,15 @@ public PaymentGatewayClient( this.uuidUtils = uuidUtils; this.confidentialMailUtils = confidentialMailUtils; this.npgClient = npgClient; - this.npgPspApiKeysConfig = npgPspApiKeysConfig; this.npgSessionUrlConfig = npgSessionUrlConfig; this.uniqueIdUtils = uniqueIdUtils; - this.npgDefaultApiKey = npgDefaultApiKey; this.npgNotificationSigningKey = npgNotificationSigningKey; this.npgJwtKeyValidityTime = npgJwtKeyValidityTime; this.nodeForwarderRedirectApiClient = nodeForwarderRedirectApiClient; this.redirectBeApiCallUriMap = redirectBeApiCallUriMap; this.ecommerceSigningKey = ecommerceSigningKey; this.jwtEcommerceValidityTimeInSeconds = jwtEcommerceValidityTimeInSeconds; + this.npgApiKeyHandler = npgApiKeyHandler; } public Mono requestXPayAuthorization(AuthorizationRequestData authorizationData) { @@ -342,9 +339,12 @@ private Mono> requestNpgBuildSession( * been differentiated for each payment methods. This issue is tracked with Jira * task CHK-2265 */ - Either buildApiKey = isApmPayment - ? npgPspApiKeysConfig.get(authorizationData.pspId()) - : Either.right(npgDefaultApiKey); + Either buildApiKey = isApmPayment + ? npgApiKeyHandler.getApiKeyForPaymentMethod( + NpgClient.PaymentMethod.CARDS, + authorizationData.pspId() + ) + : Either.right(npgApiKeyHandler.getDefaultApiKey()); return buildApiKey.fold( Mono::error, apiKey -> { @@ -488,7 +488,8 @@ public Mono requestNpgCardsAuthorization( ) ); } - final var pspNpgApiKey = npgPspApiKeysConfig.get(authorizationData.pspId()); + final var pspNpgApiKey = npgApiKeyHandler + .getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, authorizationData.pspId()); return pspNpgApiKey.fold( Mono::error, apiKey -> npgClient.confirmPayment( diff --git a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java index b1760f818..bce42758d 100644 --- a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java +++ b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java @@ -2,8 +2,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import it.pagopa.ecommerce.commons.client.NpgClient; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; +import it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -29,7 +30,6 @@ public class NpgPspApiKeysConfigBuilder { * @param apiKeys - the secret api keys configuration json * @return the parsed map */ - @Qualifier("npgCardsApiKeys") @Bean public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgCardsApiKeys( @Value( @@ -38,11 +38,114 @@ public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgCardsApiKeys( @Value( "${npg.authorization.cards.pspList}" ) Set pspToHandle + ) { + return parseApiKeysMap( + apiKeys, + pspToHandle, + NpgClient.PaymentMethod.CARDS + ); + } + + /** + * Return a map where valued with each psp id - api keys entries + * + * @param apiKeys - the secret api keys configuration json + * @return the parsed map + */ + @Bean + public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgPaypalApiKeys( + @Value( + "${npg.authorization.paypal.keys}" + ) String apiKeys, + @Value( + "${npg.authorization.paypal.pspList}" + ) Set pspToHandle + ) { + return parseApiKeysMap( + apiKeys, + pspToHandle, + NpgClient.PaymentMethod.PAYPAL + ); + } + + /** + * Return a map where valued with each psp id - api keys entries + * + * @param apiKeys - the secret api keys configuration json + * @return the parsed map + */ + @Bean + public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgMyBankApiKeys( + @Value( + "${npg.authorization.mybank.keys}" + ) String apiKeys, + @Value( + "${npg.authorization.mybank.pspList}" + ) Set pspToHandle + ) { + return parseApiKeysMap( + apiKeys, + pspToHandle, + NpgClient.PaymentMethod.MYBANK + ); + } + + /** + * Return a map where valued with each psp id - api keys entries + * + * @param apiKeys - the secret api keys configuration json + * @return the parsed map + */ + @Bean + public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgBancomatpayApiKeys( + @Value( + "${npg.authorization.bancomatpay.keys}" + ) String apiKeys, + @Value( + "${npg.authorization.bancomatpay.pspList}" + ) Set pspToHandle + ) { + return parseApiKeysMap( + apiKeys, + pspToHandle, + NpgClient.PaymentMethod.BANCOMATPAY + ); + } + + @Bean + public NpgApiKeyHandler npgApiKeyHandler( + NpgPspApiKeysConfig npgCardsApiKeys, + NpgPspApiKeysConfig npgBancomatpayApiKeys, + NpgPspApiKeysConfig npgMyBankApiKeys, + NpgPspApiKeysConfig npgPaypalApiKeys, + @Value("${npg.client.apiKey}") String defaultApiKey + ) { + return new NpgApiKeyHandler.NpgApiKeyHandlerBuilder() + .setDefaultApiKey(defaultApiKey) + .addMethodPspMapping(NpgClient.PaymentMethod.CARDS, npgCardsApiKeys) + .addMethodPspMapping(NpgClient.PaymentMethod.BANCOMATPAY, npgBancomatpayApiKeys) + .addMethodPspMapping(NpgClient.PaymentMethod.MYBANK, npgMyBankApiKeys) + .addMethodPspMapping(NpgClient.PaymentMethod.PAYPAL, npgPaypalApiKeys) + .build(); + } + + /** + * Return a map where valued with each psp id - api keys entries + * + * @param apiKeys - the secret api keys configuration json + * @return the parsed map + */ + private it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig parseApiKeysMap( + + String apiKeys, + Set pspToHandle, + NpgClient.PaymentMethod paymentMethod + ) { return it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig.parseApiKeyConfiguration( apiKeys, pspToHandle, - NpgClient.PaymentMethod.CARDS, + paymentMethod, objectMapper ) .fold(exception -> { diff --git a/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java b/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java index 411b16e06..28f3675fc 100644 --- a/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java +++ b/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.vavr.control.Either; import it.pagopa.ecommerce.commons.client.NodeForwarderClient; import it.pagopa.ecommerce.commons.client.NpgClient; import it.pagopa.ecommerce.commons.documents.v1.Transaction; @@ -14,6 +15,7 @@ import it.pagopa.ecommerce.commons.generated.npg.v1.dto.FieldsDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.StateResponseDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.WorkflowStateDto; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; import it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig; import it.pagopa.ecommerce.commons.utils.UniqueIdUtils; import it.pagopa.ecommerce.commons.v1.TransactionTestUtils; @@ -135,6 +137,8 @@ class PaymentGatewayClientTest { Collectors.toMap("pspId-%s"::formatted, p -> URI.create("http://redirect/%s".formatted(p))) ); + private final NpgApiKeyHandler npgApiKeyHandler = Mockito.mock(NpgApiKeyHandler.class); + @BeforeEach private void init() { client = new PaymentGatewayClient( @@ -144,16 +148,16 @@ private void init() { mockUuidUtils, confidentialMailUtils, npgClient, - npgPspApiKeysConfig, sessionUrlConfig, uniqueIdUtils, - npgDefaultApiKey, jwtSecretKey, TOKEN_VALIDITY_TIME_SECONDS, jwtSecretKey, TOKEN_VALIDITY_TIME_SECONDS, nodeForwarderClient, - redirectBeApiCallUriMap + redirectBeApiCallUriMap, + npgApiKeyHandler + ); Hooks.onOperatorDebug(); @@ -463,6 +467,7 @@ void shouldReturnAuthorizationResponseForCardsWithNpg() throws Exception { /* preconditions */ Mockito.when(npgClient.confirmPayment(any(), any(), any(), any())).thenReturn(Mono.just(ngpStateResponse)); + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); /* test */ StepVerifier.create(client.requestNpgCardsAuthorization(authorizationData, UUID.randomUUID().toString())) .expectNext(ngpStateResponse) @@ -478,6 +483,7 @@ void shouldReturnAuthorizationResponseForCardsWithNpg() throws Exception { ); verify(npgClient, times(1)) .confirmPayment(any(), eq(expectedSessionId), eq(expectedGranTotalAmount), eq(expectedApiKey)); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } @Test @@ -546,6 +552,8 @@ void shouldThrowAlreadyProcessedOn401ForCardsWithNpg() throws Exception { ) ) ); + + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); /* test */ StepVerifier.create(client.requestNpgCardsAuthorization(authorizationData, UUID.randomUUID().toString())) @@ -555,6 +563,7 @@ void shouldThrowAlreadyProcessedOn401ForCardsWithNpg() throws Exception { .equals(transaction.getTransactionId()) ) .verify(); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } @Test @@ -623,12 +632,15 @@ void shouldThrowGatewayTimeoutExceptionForCardsWithNpg() throws Exception { ) ) ); + + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); /* test */ StepVerifier.create(client.requestNpgCardsAuthorization(authorizationData, UUID.randomUUID().toString())) .expectErrorMatches( error -> error instanceof BadGatewayException ) .verify(); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } @Test @@ -697,12 +709,15 @@ void shouldThrowInternalServerErrorExceptionForCardsWithNpg() throws Exception { ) ) ); + + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); /* test */ StepVerifier.create(client.requestNpgCardsAuthorization(authorizationData, UUID.randomUUID().toString())) .expectErrorMatches( error -> error instanceof BadGatewayException ) .verify(); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } @Test @@ -1392,6 +1407,8 @@ void shouldReturnBuildSessionResponseForWalletWithNpgWithCards() { ) ).thenReturn(Mono.just(npgBuildSessionResponse)); + Mockito.when(npgApiKeyHandler.getDefaultApiKey()).thenReturn(npgDefaultApiKey); + Tuple2 responseRequestNpgBuildSession = Tuples.of(orderId, npgBuildSessionResponse); /* test */ StepVerifier.create(client.requestNpgBuildSession(authorizationData, correlationId, true)) @@ -1459,6 +1476,7 @@ void shouldReturnBuildSessionResponseForWalletWithNpgWithCards() { ); verify(npgClient, times(0)) .buildFormForPayment(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any()); + verify(npgApiKeyHandler, times(1)).getDefaultApiKey(); } @Test @@ -1805,6 +1823,8 @@ void shouldReturnBadGatewayExceptionFromBuildSessionForWalletWithNpg(FieldsDto n ) ).thenReturn(Mono.just(npgBuildSessionResponse)); + Mockito.when(npgApiKeyHandler.getDefaultApiKey()).thenReturn(npgDefaultApiKey); + StepVerifier.create(client.requestNpgBuildSession(authorizationData, correlationId, true)) .expectErrorMatches(error -> error instanceof BadGatewayException) .verify(); @@ -1870,6 +1890,7 @@ void shouldReturnBadGatewayExceptionFromBuildSessionForWalletWithNpg(FieldsDto n ); verify(npgClient, times(0)) .buildFormForPayment(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any()); + verify(npgApiKeyHandler, times(1)).getDefaultApiKey(); } private static Stream buildSessionInvalidBodyResponse() { @@ -1970,6 +1991,8 @@ void shouldReturnBuildSessionResponseForWalletWithNpgForWalletApmMethod() { ) ).thenReturn(Mono.just(npgBuildSessionResponse)); + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); + Tuple2 responseRequestNpgBuildSession = Tuples.of(orderId, npgBuildSessionResponse); /* test */ StepVerifier.create(client.requestNpgBuildApmPayment(authorizationData, correlationId, true)) @@ -2038,6 +2061,7 @@ void shouldReturnBuildSessionResponseForWalletWithNpgForWalletApmMethod() { ); verify(npgClient, times(0)) .buildForm(any(), any(), any(), any(), any(), any(), any(), any(), any(), any()); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } @Test @@ -2161,6 +2185,8 @@ void shouldThrowErrorForWalletWithNpgForGenericApmMethodAndMissingKey() { ) ).thenReturn(Mono.just(npgBuildSessionResponse)); + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())) + .thenReturn(Either.left(new NpgApiKeyMissingPspRequestedException("pspId2", Set.of()))); /* test */ StepVerifier.create(client.requestNpgBuildApmPayment(authorizationData, correlationId, true)) .expectError(NpgApiKeyMissingPspRequestedException.class) @@ -2170,6 +2196,7 @@ void shouldThrowErrorForWalletWithNpgForGenericApmMethodAndMissingKey() { .buildFormForPayment(any(), any(), any(), any(), any(), eq(orderId), any(), any(), any(), any(), any()); verify(npgClient, times(0)) .buildForm(any(), any(), any(), any(), any(), any(), any(), any(), any(), any()); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId2"); } @Test @@ -2245,6 +2272,7 @@ void shouldReturnBuildSessionResponseForWalletWithNpgForApmMethod() { eq(totalAmount) ) ).thenReturn(Mono.just(npgBuildSessionResponse)); + Mockito.when(npgApiKeyHandler.getApiKeyForPaymentMethod(any(), any())).thenReturn(Either.right("pspKey1")); Tuple2 responseRequestNpgBuildSession = Tuples.of(orderId, npgBuildSessionResponse); /* test */ @@ -2311,6 +2339,7 @@ void shouldReturnBuildSessionResponseForWalletWithNpgForApmMethod() { ); verify(npgClient, times(0)) .buildForm(any(), any(), any(), any(), any(), any(), any(), any(), any(), any()); + verify(npgApiKeyHandler, times(1)).getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, "pspId1"); } private static Stream redirectRetrieveUrlPaymentMethodsTestMethodSource() { @@ -2683,16 +2712,15 @@ void shouldReturnErrorDuringRedirectPaymentTransactionForInvalidPspURL() { mockUuidUtils, confidentialMailUtils, npgClient, - npgPspApiKeysConfig, sessionUrlConfig, uniqueIdUtils, - npgDefaultApiKey, jwtSecretKey, TOKEN_VALIDITY_TIME_SECONDS, jwtSecretKey, TOKEN_VALIDITY_TIME_SECONDS, nodeForwarderClient, - redirectUrlMapping + redirectUrlMapping, + npgApiKeyHandler ); /* test */ StepVerifier.create( diff --git a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java index ba1b3f84e..f60d29cd5 100644 --- a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java +++ b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java @@ -1,12 +1,18 @@ package it.pagopa.transactions.configurations; +import io.vavr.control.Either; +import it.pagopa.ecommerce.commons.client.NpgClient; import it.pagopa.ecommerce.commons.exceptions.NpgApiKeyConfigurationException; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import java.util.HashSet; import java.util.Set; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; @@ -47,7 +53,7 @@ void shouldThrowErrorWhenRetrievingUnknownPspApiKey() { var apiKey = pspConfiguration.get("unknown"); assertTrue(apiKey.isLeft()); assertEquals( - "Requested API key for PSP unknown. Available PSPs: [psp1, psp2, psp3]", + "Requested API key for PSP: [unknown]. Available PSPs: [psp1, psp2, psp3]", apiKey.getLeft().getMessage() ); } @@ -78,4 +84,106 @@ void shouldThrowExceptionForMissingPspId() { exception.getMessage() ); } + + private static Stream npgApiKeyHandlerTestMethodSource() { + return Stream.of( + Arguments.of(NpgClient.PaymentMethod.CARDS, "psp1"), + Arguments.of(NpgClient.PaymentMethod.CARDS, "psp2"), + Arguments.of(NpgClient.PaymentMethod.CARDS, "psp3"), + Arguments.of(NpgClient.PaymentMethod.PAYPAL, "psp1"), + Arguments.of(NpgClient.PaymentMethod.PAYPAL, "psp2"), + Arguments.of(NpgClient.PaymentMethod.PAYPAL, "psp3"), + Arguments.of(NpgClient.PaymentMethod.MYBANK, "psp1"), + Arguments.of(NpgClient.PaymentMethod.PAYPAL, "psp2"), + Arguments.of(NpgClient.PaymentMethod.PAYPAL, "psp3"), + Arguments.of(NpgClient.PaymentMethod.BANCOMATPAY, "psp1"), + Arguments.of(NpgClient.PaymentMethod.BANCOMATPAY, "psp2"), + Arguments.of(NpgClient.PaymentMethod.BANCOMATPAY, "psp3") + ); + } + + @ParameterizedTest + @MethodSource("npgApiKeyHandlerTestMethodSource") + void shouldBuildNpgApiKeyHandlerSuccessfully( + NpgClient.PaymentMethod paymentMethod, + String pspId + ) { + // pre-requisites + String pspConfigurationJson = """ + { + "psp1" : "%1$s-key-psp1", + "psp2" : "%1$s-key-psp2", + "psp3" : "%1$s-key-psp3" + } + """; + String expectedDefaultApiKey = "defaultApiKey"; + String expectedPspApiKey = "%s-key-%s".formatted(paymentMethod, pspId); + NpgApiKeyHandler npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.BANCOMATPAY), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.MYBANK), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.PAYPAL), + pspToHandle + ), + expectedDefaultApiKey + ); + Either apiKey = npgApiKeyHandler + .getApiKeyForPaymentMethod(paymentMethod, pspId); + String defaultNpgApiKey = npgApiKeyHandler.getDefaultApiKey(); + + assertEquals(expectedDefaultApiKey, defaultNpgApiKey); + + assertEquals(expectedPspApiKey, apiKey.get()); + + } + + @ParameterizedTest + @MethodSource("npgApiKeyHandlerTestMethodSource") + void shouldReturnErrorForMissingPspApiKey(NpgClient.PaymentMethod paymentMethod) { + // pre-requisites + String pspConfigurationJson = """ + { + "psp1" : "%1$s-key-psp1", + "psp2" : "%1$s-key-psp2", + "psp3" : "%1$s-key-psp3" + } + """; + NpgApiKeyHandler npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.BANCOMATPAY), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.MYBANK), + pspToHandle + ), + npgPspApiKeysConfig.npgCardsApiKeys( + pspConfigurationJson.formatted(NpgClient.PaymentMethod.PAYPAL), + pspToHandle + ), + "defaultApiKey" + ); + Either apiKey = npgApiKeyHandler + .getApiKeyForPaymentMethod(paymentMethod, "missingPspId"); + assertEquals( + "Cannot retrieve api key for payment method: [%s]. Cause: Requested API key for PSP: [missingPspId]. Available PSPs: [psp1, psp2, psp3]" + .formatted(paymentMethod), + apiKey.getLeft().getMessage() + ); + + } } diff --git a/src/test/resources/application-tests.properties b/src/test/resources/application-tests.properties index 10d452293..ba3666ce4 100644 --- a/src/test/resources/application-tests.properties +++ b/src/test/resources/application-tests.properties @@ -67,13 +67,13 @@ npg.uri=http://localhost/npg npg.readTimeout=10000 npg.connectionTimeout=10000 npg.client.apiKey=npg_key -npg.authorization.cards.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.cards.keys={"psp1":"cards-key1","psp2":"cards-key2"} npg.authorization.cards.pspList=psp1,psp2 -npg.authorization.paypal.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.paypal.keys={"psp1":"paypal-key1","psp2":"paypal-key2"} npg.authorization.paypal.pspList=psp1,psp2 -npg.authorization.bancomatpay.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.bancomatpay.keys={"psp1":"bancomatpay-key1","psp2":"bancomatpay-key2"} npg.authorization.bancomatpay.pspList=psp1,psp2 -npg.authorization.mybank.keys={"psp1":"key1","psp2":"key2"} +npg.authorization.mybank.keys={"psp1":"mybank-key1","psp2":"mybank-key2"} npg.authorization.mybank.pspList=psp1,psp2 npg.authorization.request.timeout.seconds=600 ecommerce.event.version=V2 From 832235b84c83679f8bdb705098f91c520fd7c258 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 15:19:56 +0200 Subject: [PATCH 04/15] fix: make prod env values optional --- helm/values-prod.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helm/values-prod.yaml b/helm/values-prod.yaml index 9dbdaaf32..ce64d1995 100644 --- a/helm/values-prod.yaml +++ b/helm/values-prod.yaml @@ -155,9 +155,9 @@ microservice-chart: NPG_READ_TIMEOUT: "10000" NPG_CONNECTION_TIMEOUT: "10000" NPG_CARDS_PSP_LIST: "BCITITMM,CIPBITMM,BIC36019,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX" - NPG_PAYPAL_PSP_LIST: "BCITITMM" - NPG_MYBANK_PSP_LIST: "BCITITMM" - NPG_BANCOMATPAY_PSP_LIST: "BCITITMM" + NPG_PAYPAL_PSP_LIST: "" + NPG_MYBANK_PSP_LIST: "" + NPG_BANCOMATPAY_PSP_LIST: "" NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS: "60" TRANSACTION_DOCUMENT_TTL: "600" CHECKOUT_BASE_PATH: "https://checkout.pagopa.it" From 5ae556cd7214eb5c975d7b9dc149a696230dc1ca Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 15:30:00 +0200 Subject: [PATCH 05/15] fix: update jira task ref --- .../it/pagopa/transactions/client/PaymentGatewayClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java index ceb1d7072..73ce72ff0 100644 --- a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java +++ b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java @@ -337,7 +337,7 @@ private Mono> requestNpgBuildSession( /* * FIXME: here we are using the same api key used for CARDS but they have to * been differentiated for each payment methods. This issue is tracked with Jira - * task CHK-2265 + * task CHK-2265 and will be fixed in CHK-2686 implementation */ Either buildApiKey = isApmPayment ? npgApiKeyHandler.getApiKeyForPaymentMethod( From 1d5e05969fc3502273fbc2685039f30d20cd770c Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 15:44:10 +0200 Subject: [PATCH 06/15] fix: change eCommerce local branch ref for test purpose --- .devops/code-review-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devops/code-review-pipelines.yml b/.devops/code-review-pipelines.yml index 05464669b..415ce5983 100644 --- a/.devops/code-review-pipelines.yml +++ b/.devops/code-review-pipelines.yml @@ -12,7 +12,7 @@ resources: - repository: pagopaEcommerceLocal type: github name: pagopa/pagopa-ecommerce-local - ref: main + ref: CHK-2684-apm-api-keys endpoint: 'io-azure-devops-github-ro' stages: From 9d16a189b088e6b680cedcc56e62045cda14c300 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 15:53:02 +0200 Subject: [PATCH 07/15] trigger CR pipeline From d8cc435a86e8bb9293a596479da690861059bc53 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 16:36:01 +0200 Subject: [PATCH 08/15] fix: env example --- .env.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 958134e9c..16a07bb37 100644 --- a/.env.example +++ b/.env.example @@ -81,9 +81,9 @@ NPG_CARDS_PSP_KEYS={"CIPBITMM":"CIPBITMM-api-key","BNLIITRR":"BNLIITRR-api-key", NPG_PAYPAL_PSP_LIST=BCITITMM NPG_PAYPAL_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} NPG_BANCOMATPAY_PSP_LIST=BCITITMM -NPG_BANCOMATPAY_PSP_KEYS=={"BCITITMM":"BCITITMM-api-key"} +NPG_BANCOMATPAY_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} NPG_MYBANK_PSP_LIST=BCITITMM -NPG_MYBANK_PSP_KEYS=={"BCITITMM":"BCITITMM-api-key"} +NPG_MYBANK_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} TRANSACTION_DOCUMENT_TTL=600 ECOMMERCE_EVENT_VERSION=V2 From 4dcf0ee31f485f9c963e951aeae2016412c6b2a9 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 16:37:04 +0200 Subject: [PATCH 09/15] trigger CR pipeline From 514f1527aabb4df197dfefa63b3557ef63d28b0b Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 17:18:04 +0200 Subject: [PATCH 10/15] fix: refactoring after commons pr update --- .env.example | 2 +- .../client/PaymentGatewayClient.java | 14 +++++------ .../NpgPspApiKeysConfigBuilder.java | 24 +++++++++---------- .../client/PaymentGatewayClientTest.java | 4 ++-- .../NpgPspApiKeysConfigTest.java | 6 ++--- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.env.example b/.env.example index 16a07bb37..c70b0f3a9 100644 --- a/.env.example +++ b/.env.example @@ -68,7 +68,7 @@ CLOSURE_RETRY_INTERVAL=30 JWT_ECOMMERCE_SECRET=ODMzNUZBNTZENDg3NTYyREUyNDhGNDdCRUZDNzI3NDMzMzQwNTFEREZGQ0MyQzA5Mjc1RjY2NTQ1NDk5MDMxNzU5NDc0NUVFMTdDMDhGNzk4Q0Q3RENFMEJBODE1NURDREExNEY2Mzk4QzFEMTU0NTExNjUyMEExMzMwMTdDMDk PERSONAL_DATA_VAULT_API_KEY=personal-data-vault-api-key -PERSONAL_DATA_VAULT_API_BASE_PATH="http://pagopa-pdv-mock:8092" +PERSONAL_DATA_VAULT_API_BASE_PATH="http://pagopa-pdv-mock:8092/tokenizer/v1/transaction/" CHECKOUT_BASE_PATH=http://test.pagopa.it/ diff --git a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java index 73ce72ff0..79415ac13 100644 --- a/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java +++ b/src/main/java/it/pagopa/transactions/client/PaymentGatewayClient.java @@ -15,7 +15,7 @@ import it.pagopa.ecommerce.commons.generated.npg.v1.dto.StateResponseDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.WorkflowStateDto; import it.pagopa.ecommerce.commons.utils.JwtTokenUtils; -import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyConfiguration; import it.pagopa.ecommerce.commons.utils.UniqueIdUtils; import it.pagopa.generated.ecommerce.gateway.v1.api.VposInternalApi; import it.pagopa.generated.ecommerce.gateway.v1.api.XPayInternalApi; @@ -94,7 +94,7 @@ public class PaymentGatewayClient { RedirectPaymentMethodId.RBPS, "SCRIGNO Internet Banking" ); - private final NpgApiKeyHandler npgApiKeyHandler; + private final NpgApiKeyConfiguration npgApiKeyConfiguration; public enum RedirectPaymentMethodId { RBPR, @@ -134,7 +134,7 @@ public PaymentGatewayClient( @Value("${payment.token.validity}") int jwtEcommerceValidityTimeInSeconds, NodeForwarderClient nodeForwarderRedirectApiClient, Map redirectBeApiCallUriMap, - NpgApiKeyHandler npgApiKeyHandler + NpgApiKeyConfiguration npgApiKeyConfiguration ) { this.paymentTransactionGatewayXPayWebClient = paymentTransactionGatewayXPayWebClient; this.creditCardInternalApiClient = creditCardInternalApiClient; @@ -150,7 +150,7 @@ public PaymentGatewayClient( this.redirectBeApiCallUriMap = redirectBeApiCallUriMap; this.ecommerceSigningKey = ecommerceSigningKey; this.jwtEcommerceValidityTimeInSeconds = jwtEcommerceValidityTimeInSeconds; - this.npgApiKeyHandler = npgApiKeyHandler; + this.npgApiKeyConfiguration = npgApiKeyConfiguration; } public Mono requestXPayAuthorization(AuthorizationRequestData authorizationData) { @@ -340,11 +340,11 @@ private Mono> requestNpgBuildSession( * task CHK-2265 and will be fixed in CHK-2686 implementation */ Either buildApiKey = isApmPayment - ? npgApiKeyHandler.getApiKeyForPaymentMethod( + ? npgApiKeyConfiguration.getApiKeyForPaymentMethod( NpgClient.PaymentMethod.CARDS, authorizationData.pspId() ) - : Either.right(npgApiKeyHandler.getDefaultApiKey()); + : Either.right(npgApiKeyConfiguration.getDefaultApiKey()); return buildApiKey.fold( Mono::error, apiKey -> { @@ -488,7 +488,7 @@ public Mono requestNpgCardsAuthorization( ) ); } - final var pspNpgApiKey = npgApiKeyHandler + final var pspNpgApiKey = npgApiKeyConfiguration .getApiKeyForPaymentMethod(NpgClient.PaymentMethod.CARDS, authorizationData.pspId()); return pspNpgApiKey.fold( Mono::error, diff --git a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java index bce42758d..599abad8a 100644 --- a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java +++ b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import it.pagopa.ecommerce.commons.client.NpgClient; -import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyConfiguration; import it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -113,19 +113,19 @@ public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgBancomatpayApiKe } @Bean - public NpgApiKeyHandler npgApiKeyHandler( - NpgPspApiKeysConfig npgCardsApiKeys, - NpgPspApiKeysConfig npgBancomatpayApiKeys, - NpgPspApiKeysConfig npgMyBankApiKeys, - NpgPspApiKeysConfig npgPaypalApiKeys, - @Value("${npg.client.apiKey}") String defaultApiKey + public NpgApiKeyConfiguration npgApiKeyHandler( + NpgPspApiKeysConfig npgCardsApiKeys, + NpgPspApiKeysConfig npgBancomatpayApiKeys, + NpgPspApiKeysConfig npgMyBankApiKeys, + NpgPspApiKeysConfig npgPaypalApiKeys, + @Value("${npg.client.apiKey}") String defaultApiKey ) { - return new NpgApiKeyHandler.NpgApiKeyHandlerBuilder() + return new NpgApiKeyConfiguration.Builder() .setDefaultApiKey(defaultApiKey) - .addMethodPspMapping(NpgClient.PaymentMethod.CARDS, npgCardsApiKeys) - .addMethodPspMapping(NpgClient.PaymentMethod.BANCOMATPAY, npgBancomatpayApiKeys) - .addMethodPspMapping(NpgClient.PaymentMethod.MYBANK, npgMyBankApiKeys) - .addMethodPspMapping(NpgClient.PaymentMethod.PAYPAL, npgPaypalApiKeys) + .withMethodPspMapping(NpgClient.PaymentMethod.CARDS, npgCardsApiKeys) + .withMethodPspMapping(NpgClient.PaymentMethod.BANCOMATPAY, npgBancomatpayApiKeys) + .withMethodPspMapping(NpgClient.PaymentMethod.MYBANK, npgMyBankApiKeys) + .withMethodPspMapping(NpgClient.PaymentMethod.PAYPAL, npgPaypalApiKeys) .build(); } diff --git a/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java b/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java index 28f3675fc..e9aadb68f 100644 --- a/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java +++ b/src/test/java/it/pagopa/transactions/client/PaymentGatewayClientTest.java @@ -15,7 +15,7 @@ import it.pagopa.ecommerce.commons.generated.npg.v1.dto.FieldsDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.StateResponseDto; import it.pagopa.ecommerce.commons.generated.npg.v1.dto.WorkflowStateDto; -import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyConfiguration; import it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig; import it.pagopa.ecommerce.commons.utils.UniqueIdUtils; import it.pagopa.ecommerce.commons.v1.TransactionTestUtils; @@ -137,7 +137,7 @@ class PaymentGatewayClientTest { Collectors.toMap("pspId-%s"::formatted, p -> URI.create("http://redirect/%s".formatted(p))) ); - private final NpgApiKeyHandler npgApiKeyHandler = Mockito.mock(NpgApiKeyHandler.class); + private final NpgApiKeyConfiguration npgApiKeyHandler = Mockito.mock(NpgApiKeyConfiguration.class); @BeforeEach private void init() { diff --git a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java index f60d29cd5..a4959f5a4 100644 --- a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java +++ b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java @@ -3,7 +3,7 @@ import io.vavr.control.Either; import it.pagopa.ecommerce.commons.client.NpgClient; import it.pagopa.ecommerce.commons.exceptions.NpgApiKeyConfigurationException; -import it.pagopa.ecommerce.commons.utils.NpgApiKeyHandler; +import it.pagopa.ecommerce.commons.utils.NpgApiKeyConfiguration; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -118,7 +118,7 @@ void shouldBuildNpgApiKeyHandlerSuccessfully( """; String expectedDefaultApiKey = "defaultApiKey"; String expectedPspApiKey = "%s-key-%s".formatted(paymentMethod, pspId); - NpgApiKeyHandler npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( npgPspApiKeysConfig.npgCardsApiKeys( pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), pspToHandle @@ -158,7 +158,7 @@ void shouldReturnErrorForMissingPspApiKey(NpgClient.PaymentMethod paymentMethod) "psp3" : "%1$s-key-psp3" } """; - NpgApiKeyHandler npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( npgPspApiKeysConfig.npgCardsApiKeys( pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), pspToHandle From 1137068f97a17e6a541405329b545074393ba3f6 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Wed, 3 Apr 2024 18:23:07 +0200 Subject: [PATCH 11/15] fix: update commons version --- pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4d1e71363..a573ba3d5 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 17 4.0.0 0.8.8 - 1.10.4 + 1.11.0 2.28.0 1.5.0 4.11.0 @@ -510,8 +510,6 @@ scm:git:https://github.com/pagopa/pagopa-ecommerce-commons.git tag ${pagopa-ecommerce-commons.version} - branch - CHK-2684-npg-apm-api-keys install -DskipTests From 047ed8a8238abdaa17cd753340d0e1896e085002 Mon Sep 17 00:00:00 2001 From: Pietro Tota <115724836+pietro-tota@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:23:09 +0200 Subject: [PATCH 12/15] Update .devops/code-review-pipelines.yml --- .devops/code-review-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devops/code-review-pipelines.yml b/.devops/code-review-pipelines.yml index 415ce5983..05464669b 100644 --- a/.devops/code-review-pipelines.yml +++ b/.devops/code-review-pipelines.yml @@ -12,7 +12,7 @@ resources: - repository: pagopaEcommerceLocal type: github name: pagopa/pagopa-ecommerce-local - ref: CHK-2684-apm-api-keys + ref: main endpoint: 'io-azure-devops-github-ro' stages: From 00ef5f6eb9707df8bf2234c1445436559e23b985 Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Thu, 4 Apr 2024 14:43:26 +0200 Subject: [PATCH 13/15] fix: refactoring --- .../configurations/NpgPspApiKeysConfigBuilder.java | 12 ++++++------ .../configurations/NpgPspApiKeysConfigTest.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java index 599abad8a..7c8f5562b 100644 --- a/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java +++ b/src/main/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigBuilder.java @@ -113,12 +113,12 @@ public it.pagopa.ecommerce.commons.utils.NpgPspApiKeysConfig npgBancomatpayApiKe } @Bean - public NpgApiKeyConfiguration npgApiKeyHandler( - NpgPspApiKeysConfig npgCardsApiKeys, - NpgPspApiKeysConfig npgBancomatpayApiKeys, - NpgPspApiKeysConfig npgMyBankApiKeys, - NpgPspApiKeysConfig npgPaypalApiKeys, - @Value("${npg.client.apiKey}") String defaultApiKey + public NpgApiKeyConfiguration npgApiKeyConfiguration( + NpgPspApiKeysConfig npgCardsApiKeys, + NpgPspApiKeysConfig npgBancomatpayApiKeys, + NpgPspApiKeysConfig npgMyBankApiKeys, + NpgPspApiKeysConfig npgPaypalApiKeys, + @Value("${npg.client.apiKey}") String defaultApiKey ) { return new NpgApiKeyConfiguration.Builder() .setDefaultApiKey(defaultApiKey) diff --git a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java index a4959f5a4..5a72f6ed2 100644 --- a/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java +++ b/src/test/java/it/pagopa/transactions/configurations/NpgPspApiKeysConfigTest.java @@ -118,7 +118,7 @@ void shouldBuildNpgApiKeyHandlerSuccessfully( """; String expectedDefaultApiKey = "defaultApiKey"; String expectedPspApiKey = "%s-key-%s".formatted(paymentMethod, pspId); - NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyConfiguration( npgPspApiKeysConfig.npgCardsApiKeys( pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), pspToHandle @@ -158,7 +158,7 @@ void shouldReturnErrorForMissingPspApiKey(NpgClient.PaymentMethod paymentMethod) "psp3" : "%1$s-key-psp3" } """; - NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyHandler( + NpgApiKeyConfiguration npgApiKeyHandler = npgPspApiKeysConfig.npgApiKeyConfiguration( npgPspApiKeysConfig.npgCardsApiKeys( pspConfigurationJson.formatted(NpgClient.PaymentMethod.CARDS), pspToHandle From 7617922b8ce29fd42df7d406b5fbaedd7c64d7bc Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Thu, 4 Apr 2024 15:26:26 +0200 Subject: [PATCH 14/15] fix: update env local adding missing env variable --- .env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.example b/.env.example index c70b0f3a9..325d278f8 100644 --- a/.env.example +++ b/.env.example @@ -103,3 +103,4 @@ NODE_FORWARDER_URL=http://localhost:8096 REDIRECT_URL_MAPPING={'REDIRECT-RBPR':'http://localhost:8096/redirections'} NODE_FORWARDER_READ_TIMEOUT=10000 NODE_FORWARDER_CONNECTION_TIMEOUT=10000 +NPG_AUTHORIZATION_REQUEST_TIMEOUT_SECONDS=600 \ No newline at end of file From 4922d9f42d052be42b157a7d6a0d646c742ece9d Mon Sep 17 00:00:00 2001 From: Pietro Tota Date: Thu, 4 Apr 2024 15:27:56 +0200 Subject: [PATCH 15/15] fix: update env local adding missing env variable --- .env.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 325d278f8..d4aeff63f 100644 --- a/.env.example +++ b/.env.example @@ -79,11 +79,11 @@ NPG_API_KEY="npg-api-key" NPG_CARDS_PSP_LIST=CIPBITMM,BNLIITRR,BCITITMM,UNCRITMM,BPPIITRRXXX,PPAYITR1XXX NPG_CARDS_PSP_KEYS={"CIPBITMM":"CIPBITMM-api-key","BNLIITRR":"BNLIITRR-api-key","BCITITMM":"BCITITMM-api-key","UNCRITMM":"UNCRITMM-api-key","BPPIITRRXXX":"BPPIITRRXXX-api-key","PPAYITR1XXX":"PPAYITR1XXX-api-key"} NPG_PAYPAL_PSP_LIST=BCITITMM -NPG_PAYPAL_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} +NPG_PAYPAL_PSP_KEYS={"BCITITMM":"BCITITMM-api-key-paypal"} NPG_BANCOMATPAY_PSP_LIST=BCITITMM -NPG_BANCOMATPAY_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} +NPG_BANCOMATPAY_PSP_KEYS={"BCITITMM":"BCITITMM-api-key-bancomatpay"} NPG_MYBANK_PSP_LIST=BCITITMM -NPG_MYBANK_PSP_KEYS={"BCITITMM":"BCITITMM-api-key"} +NPG_MYBANK_PSP_KEYS={"BCITITMM":"BCITITMM-api-key-mybank"} TRANSACTION_DOCUMENT_TTL=600 ECOMMERCE_EVENT_VERSION=V2