Skip to content

Commit

Permalink
Merge pull request #51 from artemsnisarenko/sparkasse-pisp
Browse files Browse the repository at this point in the history
Add sparkasse PISP
  • Loading branch information
spetrychenko committed Apr 26, 2019
2 parents eb37d74 + de7fcf9 commit 93023c3
Show file tree
Hide file tree
Showing 14 changed files with 144 additions and 76 deletions.
Expand Up @@ -8,13 +8,11 @@

public class DeutscheBankPaymentInitiationService extends BasePaymentInitiationService {
private static final String DATE_HEADER = "Date";
private static final String BASE_URI = "https://simulator-xs2a.db.com/";
private static final String PIS_URI = BASE_URI + "pis/DE/SB-DB/v1/";
private static final String PAYMENTS_SEPA_CREDIT_TRANSFERS_URI = PIS_URI + "payments/sepa-credit-transfers";
private static final String PIS_URI = "https://simulator-xs2a.db.com/pis/DE/SB-DB/v1/";

@Override
protected String getSingleSepaCreditTransferUri() {
return PAYMENTS_SEPA_CREDIT_TRANSFERS_URI;
protected String getBaseUri() {
return PIS_URI;
}

@Override
Expand Down
Expand Up @@ -18,8 +18,9 @@

import de.adorsys.xs2a.gateway.adapter.BaseAccountInformationService;

import static de.adorsys.xs2a.gateway.service.provider.Sparkasse.BASE_URI;

public class SparkasseAccountInformationService extends BaseAccountInformationService {
private static final String BASE_URI = "https://xs2a-sandbox.f-i-apim.de:8444/fixs2a-env/xs2a-api/12345678/v1";

@Override
protected String getBaseUri() {
Expand Down
@@ -0,0 +1,13 @@
package de.adorsys.xs2a.gateway.service.impl;

import de.adorsys.xs2a.gateway.adapter.BasePaymentInitiationService;

import static de.adorsys.xs2a.gateway.service.provider.Sparkasse.BASE_URI;

public class SparkassePaymentInitiationService extends BasePaymentInitiationService {

@Override
protected String getBaseUri() {
return BASE_URI;
}
}
@@ -0,0 +1,11 @@
package de.adorsys.xs2a.gateway.service.provider;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public interface Sparkasse {
Set<String> BANK_CODES = Collections.unmodifiableSet(new HashSet<>(Collections.singletonList("99999999")));

String BASE_URI = "https://xs2a-sandbox.f-i-apim.de:8444/fixs2a-env/xs2a-api/12345678/v1";
}
Expand Up @@ -19,18 +19,17 @@
import de.adorsys.xs2a.gateway.service.ais.AccountInformationService;
import de.adorsys.xs2a.gateway.service.impl.SparkasseAccountInformationService;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import static de.adorsys.xs2a.gateway.service.provider.Sparkasse.BANK_CODES;

public class SparkasseAccountInformationServiceProvider implements AccountInformationServiceProvider {

private Set<String> bankCodes = Collections.unmodifiableSet(new HashSet<>(Collections.singletonList("99999999")));
private SparkasseAccountInformationService accountInformationService;

@Override
public Set<String> getBankCodes() {
return bankCodes;
return BANK_CODES;
}

@Override
Expand Down
@@ -0,0 +1,26 @@
package de.adorsys.xs2a.gateway.service.provider;

import de.adorsys.xs2a.gateway.service.PaymentInitiationService;
import de.adorsys.xs2a.gateway.service.impl.SparkassePaymentInitiationService;

import java.util.Set;

import static de.adorsys.xs2a.gateway.service.provider.Sparkasse.BANK_CODES;

public class SparkassePaymentInitiationServiceProvider implements PaymentInitiationServiceProvider {

private PaymentInitiationService paymentInitiationService;

@Override
public Set<String> getBankCodes() {
return BANK_CODES;
}

@Override
public PaymentInitiationService getPaymentInitiationService() {
if (paymentInitiationService == null) {
paymentInitiationService = new SparkassePaymentInitiationService();
}
return paymentInitiationService;
}
}
@@ -0,0 +1 @@
de.adorsys.xs2a.gateway.service.provider.SparkassePaymentInitiationServiceProvider
6 changes: 3 additions & 3 deletions postman/xs2a gateway.postman_collection.json
Expand Up @@ -807,12 +807,12 @@
},
{
"key": "PSU-ID",
"value": "648403403900",
"value": "{{psuId}}",
"type": "text"
},
{
"key": "PSU-ID-Type",
"value": "FKDN",
"value": "{{psuIdType}}",
"type": "text"
},
{
Expand All @@ -823,7 +823,7 @@
],
"body": {
"mode": "raw",
"raw": "{\n \"creditorAccount\": {\n \"iban\": \"DE58215730420403292600\",\n \"currency\": \"EUR\"\n },\n \"creditorAddress\": {\n \"street\": \"12th Avenue\",\n \"buildingNumber\": \"108\",\n \"city\": \"Sandbox1\",\n \"postalCode\": \"2AC450\",\n \"country\": \"SB\"\n },\n \"creditorAgent\": \"Agent\",\n \"creditorName\": \"Name\",\n \"debtorAccount\": {\n \"iban\": \"DE51648730420403403900\",\n \"currency\": \"EUR\"\n },\n \"instructedAmount\": {\n \"amount\": \"20.9\",\n \"currency\": \"EUR\"\n },\n \"remittanceInformationUnstructured\": \"just\",\n \"endToEndIdentification\": \"SandboxTPPTest1\"\n}"
"raw": "{\n \"creditorAccount\": {\n \"iban\": \"DE58215730420403292600\",\n \"currency\": \"EUR\"\n },\n \"creditorAddress\": {\n \"street\": \"12th Avenue\",\n \"buildingNumber\": \"108\",\n \"city\": \"Sandbox1\",\n \"postalCode\": \"2AC450\",\n \"country\": \"SB\"\n },\n \"creditorAgent\": \"Agent\",\n \"creditorName\": \"Name\",\n \"debtorAccount\": {\n \"iban\": \"DE51648730420403403900\",\n \"currency\": \"EUR\"\n },\n \"instructedAmount\": {\n \"amount\": \"20.99\",\n \"currency\": \"EUR\"\n },\n \"remittanceInformationUnstructured\": \"just\",\n \"endToEndIdentification\": \"SandboxTPPTest1\"\n}"
},
"url": {
"raw": "{{baseUri}}/v1/payments/sepa-credit-transfers",
Expand Down
Expand Up @@ -18,6 +18,7 @@

import de.adorsys.xs2a.gateway.http.HttpClient;
import de.adorsys.xs2a.gateway.http.JsonMapper;
import de.adorsys.xs2a.gateway.http.StringUri;
import de.adorsys.xs2a.gateway.service.ErrorResponse;
import de.adorsys.xs2a.gateway.service.RequestParams;
import de.adorsys.xs2a.gateway.service.ResponseHeaders;
Expand All @@ -27,15 +28,11 @@
import java.io.IOException;
import java.io.PushbackInputStream;
import java.io.UncheckedIOException;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public abstract class AbstractService {
protected static final String SLASH_SEPARATOR = "/";
protected static final String SLASH_TRANSACTIONS = "/transactions";
protected static final String SLASH_AUTHORISATIONS = "/authorisations";
protected static final String SLASH_AUTHORISATIONS_SLASH = "/authorisations/";
protected static final String AUTHORISATIONS = "authorisations";
protected static final String STATUS = "status";
protected static final String CONTENT_TYPE_HEADER = "Content-Type";
protected static final String APPLICATION_JSON = "application/json";
protected static final String ACCEPT_HEADER = "Accept";
Expand Down Expand Up @@ -101,28 +98,6 @@ protected static String buildUri(String uri, RequestParams requestParams) {

Map<String, String> requestParamsMap = requestParams.toMap();

if (requestParamsMap.isEmpty()) {
return uri;
}

String requestParamsString = requestParamsMap.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&", "?", ""));

return uri + requestParamsString;
}

static String buildUri(String... elements) {
return Arrays.stream(elements)
.map(AbstractService::trimUri)
.collect(Collectors.joining(SLASH_SEPARATOR));
}

private static String trimUri(String str) {
if (str == null || str.isEmpty()) {
return "";
}
str = str.startsWith(SLASH_SEPARATOR) ? str.substring(1) : str;
return str.endsWith(SLASH_SEPARATOR) ? str.substring(0, str.length() - 1) : str;
return StringUri.withQuery(uri, requestParamsMap);
}
}
Expand Up @@ -16,6 +16,7 @@

package de.adorsys.xs2a.gateway.adapter;

import de.adorsys.xs2a.gateway.http.StringUri;
import de.adorsys.xs2a.gateway.service.GeneralResponse;
import de.adorsys.xs2a.gateway.service.RequestHeaders;
import de.adorsys.xs2a.gateway.service.RequestParams;
Expand All @@ -37,8 +38,9 @@

public abstract class BaseAccountInformationService extends AbstractService implements AccountInformationService {

private static final String CONSENTS_URI = "/consents";
private static final String ACCOUNTS_URI = "/accounts";
private static final String CONSENTS = "consents";
private static final String ACCOUNTS = "accounts";
private static final String TRANSACTIONS = "transactions";

private final Pattern charsetPattern = Pattern.compile("charset=([^;]+)");

Expand All @@ -54,13 +56,13 @@ public GeneralResponse<ConsentCreationResponse> createConsent(Consents body, Req

@Override
public GeneralResponse<ConsentInformation> getConsentInformation(String consentId, RequestHeaders requestHeaders) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId);
Map<String, String> headersMap = populateGetHeaders(requestHeaders.toMap());
return httpClient.get(uri, headersMap, responseHandler(ConsentInformation.class));
}

protected <T> GeneralResponse<ConsentInformation> getConsentInformation(String consentId, RequestHeaders requestHeaders, Class<T> klass, Function<T, ConsentInformation> mapper) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId);
Map<String, String> headersMap = populateGetHeaders(requestHeaders.toMap());
GeneralResponse<T> response = httpClient.get(uri, headersMap, responseHandler(klass));
ConsentInformation consentInformation = mapper.apply(response.getResponseBody());
Expand All @@ -70,23 +72,23 @@ protected <T> GeneralResponse<ConsentInformation> getConsentInformation(String c

@Override
public GeneralResponse<ConsentStatusResponse> getConsentStatus(String consentId, RequestHeaders requestHeaders) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + "/status";
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, STATUS);
Map<String, String> headersMap = populateGetHeaders(requestHeaders.toMap());

return httpClient.get(uri, headersMap, responseHandler(ConsentStatusResponse.class));
}

@Override
public GeneralResponse<StartScaProcessResponse> startConsentAuthorisation(String consentId, RequestHeaders requestHeaders) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + SLASH_AUTHORISATIONS;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, AUTHORISATIONS);
Map<String, String> headersMap = populatePostHeaders(requestHeaders.toMap());

return httpClient.post(uri, headersMap, responseHandler(StartScaProcessResponse.class));
}

@Override
public GeneralResponse<StartScaProcessResponse> startConsentAuthorisation(String consentId, RequestHeaders requestHeaders, UpdatePsuAuthentication updatePsuAuthentication) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + SLASH_AUTHORISATIONS;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, AUTHORISATIONS);
Map<String, String> headersMap = populatePostHeaders(requestHeaders.toMap());
String body = jsonMapper.writeValueAsString(updatePsuAuthentication);

Expand All @@ -96,7 +98,7 @@ public GeneralResponse<StartScaProcessResponse> startConsentAuthorisation(String
@Override
public GeneralResponse<UpdatePsuAuthenticationResponse> updateConsentsPsuData(String consentId, String authorisationId, RequestHeaders requestHeaders,
UpdatePsuAuthentication updatePsuAuthentication) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + SLASH_AUTHORISATIONS_SLASH + authorisationId;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, AUTHORISATIONS, authorisationId);
Map<String, String> headersMap = populatePutHeaders(requestHeaders.toMap());
String body = jsonMapper.writeValueAsString(updatePsuAuthentication);

Expand All @@ -105,7 +107,7 @@ public GeneralResponse<UpdatePsuAuthenticationResponse> updateConsentsPsuData(St

@Override
public GeneralResponse<SelectPsuAuthenticationMethodResponse> updateConsentsPsuData(String consentId, String authorisationId, RequestHeaders requestHeaders, SelectPsuAuthenticationMethod selectPsuAuthenticationMethod) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + SLASH_AUTHORISATIONS_SLASH + authorisationId;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, AUTHORISATIONS, authorisationId);
Map<String, String> headersMap = populatePutHeaders(requestHeaders.toMap());
String body = jsonMapper.writeValueAsString(selectPsuAuthenticationMethod);

Expand All @@ -115,7 +117,7 @@ public GeneralResponse<SelectPsuAuthenticationMethodResponse> updateConsentsPsuD

@Override
public GeneralResponse<ScaStatusResponse> updateConsentsPsuData(String consentId, String authorisationId, RequestHeaders requestHeaders, TransactionAuthorisation transactionAuthorisation) {
String uri = getConsentBaseUri() + SLASH_SEPARATOR + consentId + SLASH_AUTHORISATIONS_SLASH + authorisationId;
String uri = StringUri.fromElements(getConsentBaseUri(), consentId, AUTHORISATIONS, authorisationId);
Map<String, String> headersMap = populatePutHeaders(requestHeaders.toMap());
String body = jsonMapper.writeValueAsString(transactionAuthorisation);

Expand Down Expand Up @@ -143,7 +145,7 @@ public GeneralResponse<TransactionsReport> getTransactionList(String accountId,
}

private String getTransactionListUri(String accountId, RequestParams requestParams) {
String uri = getAccountsBaseUri() + SLASH_SEPARATOR + accountId + SLASH_TRANSACTIONS;
String uri = StringUri.fromElements(getAccountsBaseUri(), accountId, TRANSACTIONS);
uri = buildUri(uri, requestParams);
return uri;
}
Expand Down Expand Up @@ -175,11 +177,11 @@ public GeneralResponse<String> getTransactionListAsString(String accountId, Requ
}

protected String getConsentBaseUri() {
return buildUri(getBaseUri(), CONSENTS_URI);
return StringUri.fromElements(getBaseUri(), CONSENTS);
}

protected String getAccountsBaseUri() {
return buildUri(getBaseUri(), ACCOUNTS_URI);
return StringUri.fromElements(getBaseUri(), ACCOUNTS);
}

protected abstract String getBaseUri();
Expand Down
Expand Up @@ -16,12 +16,16 @@

package de.adorsys.xs2a.gateway.adapter;

import de.adorsys.xs2a.gateway.http.StringUri;
import de.adorsys.xs2a.gateway.service.*;

import java.util.Map;

public abstract class BasePaymentInitiationService extends AbstractService implements PaymentInitiationService {

private static final String PAYMENTS = "payments";
private static final String SEPA_CREDIT_TRANSFERS = "sepa-credit-transfers";

@Override
public GeneralResponse<PaymentInitiationRequestResponse> initiateSinglePayment(String paymentProduct, Object body, RequestHeaders requestHeaders) {
requireSepaCreditTransfer(paymentProduct);
Expand All @@ -43,7 +47,7 @@ public GeneralResponse<SinglePaymentInitiationInformationWithStatusResponse> get
RequestHeaders requestHeaders) {
requireSepaCreditTransfer(paymentProduct);

String uri = getSingleSepaCreditTransferUri() + SLASH_SEPARATOR + paymentId;
String uri = StringUri.fromElements(getSingleSepaCreditTransferUri(), paymentId);

Map<String, String> headersMap = populateGetHeaders(requestHeaders.toMap());
return httpClient.get(uri, headersMap,
Expand All @@ -58,15 +62,15 @@ public GeneralResponse<PaymentInitiationScaStatusResponse> getPaymentInitiationS
@Override
public GeneralResponse<PaymentInitiationStatus> getSinglePaymentInitiationStatus(String paymentProduct, String paymentId, RequestHeaders requestHeaders) {
requireSepaCreditTransfer(paymentProduct);
String uri = getSingleSepaCreditTransferUri() + SLASH_SEPARATOR + paymentId + "/status";
String uri = StringUri.fromElements(getSingleSepaCreditTransferUri(), paymentId, STATUS);
Map<String, String> headersMap = populateGetHeaders(requestHeaders.toMap());

return httpClient.get(uri, headersMap, responseHandler(PaymentInitiationStatus.class));

}

private void requireSepaCreditTransfer(String paymentProduct) {
if (!paymentProduct.equalsIgnoreCase("sepa-credit-transfers")) {
if (!paymentProduct.equalsIgnoreCase(SEPA_CREDIT_TRANSFERS)) {
throw new UnsupportedOperationException(paymentProduct);
}
}
Expand All @@ -76,5 +80,9 @@ public GeneralResponse<PaymentInitiationAuthorisationResponse> getPaymentInitiat
throw new UnsupportedOperationException();
}

protected abstract String getSingleSepaCreditTransferUri();
protected String getSingleSepaCreditTransferUri() {
return StringUri.fromElements(getBaseUri(), PAYMENTS, SEPA_CREDIT_TRANSFERS);
}

protected abstract String getBaseUri();
}
@@ -0,0 +1,34 @@
package de.adorsys.xs2a.gateway.http;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public class StringUri {

public static String fromElements(String... elements) {
return Arrays.stream(elements)
.map(StringUri::trimUri)
.collect(Collectors.joining("/"));
}

private static String trimUri(String str) {
if (str == null || str.isEmpty()) {
return "";
}
str = str.startsWith("/") ? str.substring(1) : str;
return str.endsWith("/") ? str.substring(0, str.length() - 1) : str;
}

public static String withQuery(String uri, Map<String, String> requestParams) {
if (requestParams.isEmpty()) {
return uri;
}

String requestParamsString = requestParams.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&", "?", ""));

return uri + requestParamsString;
}
}

0 comments on commit 93023c3

Please sign in to comment.