diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/PaymentRequestActivationRequest.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/PaymentRequestActivationRequest.java new file mode 100644 index 00000000..20462e7f --- /dev/null +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/PaymentRequestActivationRequest.java @@ -0,0 +1,22 @@ +package com.ibanity.apis.client.products.ponto_connect.models; + +import com.ibanity.apis.client.models.IbanityModel; +import lombok.*; + +import java.util.UUID; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PaymentRequestActivationRequest implements IbanityModel { + + public static final String RESOURCE_TYPE = "paymentRequestActivationRequest"; + public static final String API_URL_TAG_ID = "{" + RESOURCE_TYPE + URL_PARAMETER_ID_POSTFIX + "}"; + + private UUID id; + private String selfLink; + private String requestId; + + private String redirectLink; +} diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/create/PaymentRequestActivationRequestCreateQuery.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/create/PaymentRequestActivationRequestCreateQuery.java new file mode 100644 index 00000000..c7944f8b --- /dev/null +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/models/create/PaymentRequestActivationRequestCreateQuery.java @@ -0,0 +1,23 @@ +package com.ibanity.apis.client.products.ponto_connect.models.create; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +import java.util.Map; + +import static java.util.Collections.emptyMap; + +@Getter +@Builder +@ToString +@EqualsAndHashCode +public class PaymentRequestActivationRequestCreateQuery { + + private String accessToken; + private String redirectUri; + + @Builder.Default + private Map additionalHeaders = emptyMap(); +} diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PaymentRequestActivationRequestService.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PaymentRequestActivationRequestService.java new file mode 100644 index 00000000..ec91565e --- /dev/null +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PaymentRequestActivationRequestService.java @@ -0,0 +1,8 @@ +package com.ibanity.apis.client.products.ponto_connect.services; + +import com.ibanity.apis.client.products.ponto_connect.models.create.PaymentRequestActivationRequestCreateQuery; + +public interface PaymentRequestActivationRequestService { + + com.ibanity.apis.client.products.ponto_connect.models.PaymentRequestActivationRequest create(PaymentRequestActivationRequestCreateQuery paymentRequestActivationRequestCreateQuery); +} diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PontoConnectService.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PontoConnectService.java index 1be29661..39085cf2 100644 --- a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PontoConnectService.java +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/PontoConnectService.java @@ -34,6 +34,8 @@ public interface PontoConnectService { PaymentActivationRequestService paymentActivationRequestService(); + PaymentRequestActivationRequestService paymentRequestActivationRequestService(); + IntegrationAccountService integrationAccountService(); PaymentRequestService paymentRequestService(); diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImpl.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImpl.java new file mode 100644 index 00000000..e7c0bca3 --- /dev/null +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImpl.java @@ -0,0 +1,70 @@ +package com.ibanity.apis.client.products.ponto_connect.services.impl; + +import com.ibanity.apis.client.http.IbanityHttpClient; +import com.ibanity.apis.client.jsonapi.DataApiModel; +import com.ibanity.apis.client.jsonapi.RequestApiModel; +import com.ibanity.apis.client.products.ponto_connect.models.create.PaymentRequestActivationRequestCreateQuery; +import com.ibanity.apis.client.products.ponto_connect.services.PaymentRequestActivationRequestService; +import com.ibanity.apis.client.services.ApiUrlProvider; +import lombok.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpResponse; + +import java.net.URI; +import java.util.function.Function; + +import static com.ibanity.apis.client.mappers.IbanityModelMapper.mapResource; +import static com.ibanity.apis.client.mappers.IbanityModelMapper.toIbanityModel; +import static com.ibanity.apis.client.mappers.ModelMapperHelper.buildRequest; +import static com.ibanity.apis.client.models.IbanityProduct.PontoConnect; +import static com.ibanity.apis.client.utils.URIHelper.buildUri; + +public class PaymentRequestActivationRequestServiceImpl implements PaymentRequestActivationRequestService { + + private final ApiUrlProvider apiUrlProvider; + private final IbanityHttpClient ibanityHttpClient; + + public PaymentRequestActivationRequestServiceImpl(ApiUrlProvider apiUrlProvider, IbanityHttpClient ibanityHttpClient) { + this.apiUrlProvider = apiUrlProvider; + this.ibanityHttpClient = ibanityHttpClient; + } + + @Override + public com.ibanity.apis.client.products.ponto_connect.models.PaymentRequestActivationRequest create(PaymentRequestActivationRequestCreateQuery paymentRequestActivationRequestCreateQuery) { + URI uri = buildUri(getUrl()); + + RequestApiModel requestApiModel = buildRequest(PaymentRequestActivationRequest.RESOURCE_TYPE, toRequest(paymentRequestActivationRequestCreateQuery)); + HttpResponse response = ibanityHttpClient.post(uri, requestApiModel, paymentRequestActivationRequestCreateQuery.getAdditionalHeaders(), paymentRequestActivationRequestCreateQuery.getAccessToken()); + + return mapResource(response, customMapping()); + } + + private PaymentRequestActivationRequest toRequest(PaymentRequestActivationRequestCreateQuery paymentRequestActivationRequestCreateQuery) { + return PaymentRequestActivationRequest.builder() + .redirectUri(paymentRequestActivationRequestCreateQuery.getRedirectUri()) + .build(); + } + + private Function customMapping() { + return dataApiModel -> { + com.ibanity.apis.client.products.ponto_connect.models.PaymentRequestActivationRequest paymentRequestActivationRequest = toIbanityModel(dataApiModel, com.ibanity.apis.client.products.ponto_connect.models.PaymentRequestActivationRequest.class); + paymentRequestActivationRequest.setRedirectLink(dataApiModel.getLinks().getRedirect()); + + return paymentRequestActivationRequest; + }; + } + + private String getUrl() { + return StringUtils.removeEnd(apiUrlProvider.find(PontoConnect, "paymentRequestActivationRequests"), "/"); + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor(access = AccessLevel.PRIVATE) + private static class PaymentRequestActivationRequest { + public static final String RESOURCE_TYPE = "paymentRequestActivationRequest"; + + private String redirectUri; + } +} diff --git a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PontoConnectServiceImpl.java b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PontoConnectServiceImpl.java index 3ffc1274..15177408 100644 --- a/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PontoConnectServiceImpl.java +++ b/src/main/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PontoConnectServiceImpl.java @@ -24,6 +24,7 @@ public class PontoConnectServiceImpl implements PontoConnectService { private final BulkPaymentService bulkPaymentService; private final ReauthorizationRequestService reauthorizationRequestService; private final PaymentActivationRequestService paymentActivationRequestService; + private final PaymentRequestActivationRequestService paymentRequestActivationRequestService; private final IntegrationAccountService integrationAccountService; private final PaymentRequestService paymentRequestService; @@ -43,6 +44,7 @@ public PontoConnectServiceImpl(ApiUrlProvider apiUrlProvider, IbanityHttpClient bulkPaymentService = new BulkPaymentServiceImpl(apiUrlProvider, ibanityHttpClient); reauthorizationRequestService = new ReauthorizationRequestServiceImpl(apiUrlProvider, ibanityHttpClient); paymentActivationRequestService = new PaymentActivationRequestServiceImpl(apiUrlProvider, ibanityHttpClient); + paymentRequestActivationRequestService = new PaymentRequestActivationRequestServiceImpl(apiUrlProvider, ibanityHttpClient); integrationAccountService = new IntegrationAccountServiceImpl(apiUrlProvider, ibanityHttpClient); paymentRequestService = new PaymentRequestServiceImpl(apiUrlProvider, ibanityHttpClient); } @@ -120,6 +122,9 @@ public ReauthorizationRequestService reauthorizationRequestService() { @Override public PaymentActivationRequestService paymentActivationRequestService() { return paymentActivationRequestService;} + @Override + public PaymentRequestActivationRequestService paymentRequestActivationRequestService() { return paymentRequestActivationRequestService;} + @Override public IntegrationAccountService integrationAccountService() { return integrationAccountService; diff --git a/src/test/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImplTest.java b/src/test/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImplTest.java new file mode 100644 index 00000000..ef821bca --- /dev/null +++ b/src/test/java/com/ibanity/apis/client/products/ponto_connect/services/impl/PaymentRequestActivationRequestServiceImplTest.java @@ -0,0 +1,71 @@ +package com.ibanity.apis.client.products.ponto_connect.services.impl; + +import com.ibanity.apis.client.http.IbanityHttpClient; +import com.ibanity.apis.client.models.IbanityProduct; +import com.ibanity.apis.client.products.ponto_connect.models.PaymentRequestActivationRequest; +import com.ibanity.apis.client.products.ponto_connect.models.create.PaymentRequestActivationRequestCreateQuery; +import com.ibanity.apis.client.services.ApiUrlProvider; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.util.UUID; + +import static com.ibanity.apis.client.helpers.IbanityTestHelper.loadHttpResponse; +import static com.ibanity.apis.client.utils.URIHelper.buildUri; +import static java.util.Collections.emptyMap; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class PaymentRequestActivationRequestServiceImplTest { + + private static final String PAYMENT_ACTIVATION_REQUEST_ENDPOINT = "https://api.ibanity.localhost/ponto-connect/payment-request-activation-request"; + private static final UUID PAYMENT_ACTIVATION_REQUEST_ID = UUID.fromString("7e7fca4c-cc8e-4e23-9a5f-cfa4dc175a88"); + private static final String ACCESS_TOKEN = "anAccessToken"; + + @InjectMocks + private PaymentRequestActivationRequestServiceImpl paymentRequestActivationRequestService; + + @Mock + private ApiUrlProvider apiUrlProvider; + + @Mock + private IbanityHttpClient ibanityHttpClient; + + @BeforeEach + void setUp() { + when(apiUrlProvider.find(IbanityProduct.PontoConnect, "paymentRequestActivationRequests")) + .thenReturn(PAYMENT_ACTIVATION_REQUEST_ENDPOINT); + } + + @Test + void create() throws IOException { + PaymentRequestActivationRequestCreateQuery paymentRequestActivationRequestCreateQuery = + PaymentRequestActivationRequestCreateQuery.builder() + .accessToken(ACCESS_TOKEN) + .redirectUri("https://example.localhost") + .build(); + + when(ibanityHttpClient.post(eq(buildUri(PAYMENT_ACTIVATION_REQUEST_ENDPOINT)), any(),eq(emptyMap()), eq(ACCESS_TOKEN))) + .thenReturn(loadHttpResponse("json/ponto-connect/create_payment_request_activation_request.json")); + + + PaymentRequestActivationRequest actual = paymentRequestActivationRequestService.create(paymentRequestActivationRequestCreateQuery); + + Assertions.assertThat(actual).isEqualToComparingFieldByFieldRecursively(createExpected()); + } + + private Object createExpected() { + return PaymentRequestActivationRequest.builder() + .id(PAYMENT_ACTIVATION_REQUEST_ID) + .redirectLink("https://authorize.development.myponto.net/organizations/6680437c-8ed8-425b-84b7-2c31e5ca625d/sandbox/integrations/1f5caef0-7dcd-41d0-9318-24bf40ba9d16/payment-request-activation-requests/7e7fca4c-cc8e-4e23-9a5f-cfa4dc175a88") + .build(); + } +} diff --git a/src/test/resources/json/ponto-connect/create_payment_request_activation_request.json b/src/test/resources/json/ponto-connect/create_payment_request_activation_request.json new file mode 100644 index 00000000..f03f82af --- /dev/null +++ b/src/test/resources/json/ponto-connect/create_payment_request_activation_request.json @@ -0,0 +1,9 @@ +{ + "data": { + "type": "paymentRequestActivationRequest", + "links": { + "redirect": "https://authorize.development.myponto.net/organizations/6680437c-8ed8-425b-84b7-2c31e5ca625d/sandbox/integrations/1f5caef0-7dcd-41d0-9318-24bf40ba9d16/payment-request-activation-requests/7e7fca4c-cc8e-4e23-9a5f-cfa4dc175a88" + }, + "id": "7e7fca4c-cc8e-4e23-9a5f-cfa4dc175a88" + } +}