diff --git a/src/main/java/com/trustly/api/client/TrustlyApiClient.java b/src/main/java/com/trustly/api/client/TrustlyApiClient.java index f49a34c..37a9853 100644 --- a/src/main/java/com/trustly/api/client/TrustlyApiClient.java +++ b/src/main/java/com/trustly/api/client/TrustlyApiClient.java @@ -79,6 +79,11 @@ import java.util.Map; import lombok.Value; import lombok.extern.slf4j.Slf4j; +import com.trustly.api.domain.methods.verifyaccount.VerifyAccountRequestData; +import com.trustly.api.domain.methods.verifyaccount.VerifyAccountResponseData; + +import com.trustly.api.domain.methods.getaccounttransactions.GetAccountTransactionsRequestData; +import com.trustly.api.domain.methods.getaccounttransactions.GetAccountTransactionsResponseData; @Slf4j public class TrustlyApiClient implements Closeable { @@ -441,6 +446,14 @@ public WithdrawResponseData withdraw(WithdrawRequestData request) throws Trustly return this.sendRequest(request, WithdrawResponseData.class, "Withdraw", null); } + public VerifyAccountResponseData verifyAccount(VerifyAccountRequestData request) throws TrustlyRequestException { + return this.sendRequest(request, VerifyAccountResponseData.class, "VerifyAccount", null); + } + + public GetAccountTransactionsResponseData getAccountTransactions(GetAccountTransactionsRequestData request) throws TrustlyRequestException { + return this.sendRequest(request, GetAccountTransactionsResponseData.class, "GetAccountTransactions", null); + } + // Notifications /** diff --git a/src/main/java/com/trustly/api/domain/common/GetAccountTransactionsValidationGroup.java b/src/main/java/com/trustly/api/domain/common/GetAccountTransactionsValidationGroup.java new file mode 100644 index 0000000..9264201 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/common/GetAccountTransactionsValidationGroup.java @@ -0,0 +1,5 @@ +package com.trustly.api.domain.common; + +public interface GetAccountTransactionsValidationGroup { + +} diff --git a/src/main/java/com/trustly/api/domain/common/VerifyAccountValidationGroup.java b/src/main/java/com/trustly/api/domain/common/VerifyAccountValidationGroup.java new file mode 100644 index 0000000..a1041f0 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/common/VerifyAccountValidationGroup.java @@ -0,0 +1,5 @@ +package com.trustly.api.domain.common; + +public interface VerifyAccountValidationGroup { + +} diff --git a/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestData.java b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestData.java new file mode 100644 index 0000000..831f9e8 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestData.java @@ -0,0 +1,69 @@ +package com.trustly.api.domain.methods.getaccounttransactions; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractToTrustlyRequestData; +import com.trustly.api.domain.common.GetAccountTransactionsValidationGroup; +import com.trustly.api.domain.common.VerifyAccountValidationGroup; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.groups.ConvertGroup; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; +import org.hibernate.validator.constraints.URL; + +@Data +@SuperBuilder(toBuilder = true) +@EqualsAndHashCode(callSuper = true) +@RequiredArgsConstructor +@AllArgsConstructor +@Jacksonized +@JsonInclude(Include.NON_NULL) +public class GetAccountTransactionsRequestData extends AbstractToTrustlyRequestData { + + @JsonProperty("NotificationURL") + @NotBlank + @URL + private String notificationUrl; + + @JsonProperty("EndUserID") + @NotBlank + private String endUserId; + + @JsonProperty("MessageID") + @NotBlank + private String messageId; + + @JsonProperty(value = "SuccessURL", required = true) + @NotBlank + @URL + private String successUrl; + + @JsonProperty(value = "FailURL", required = true) + @NotBlank + @URL + private String failUrl; + + @JsonProperty(value = "Country", required = true) + @NotBlank + private String country; + + @JsonProperty(value = "Locale", required = true) + @NotBlank + private String locale; + + + @JsonProperty(value = "Attributes", required = true) + @JsonInclude(Include.NON_NULL) + @Valid + @ConvertGroup(to = GetAccountTransactionsValidationGroup.class) + @Override + public GetAccountTransactionsRequestDataAttributes getAttributes() { + return super.getAttributes(); + } +} diff --git a/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestDataAttributes.java b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestDataAttributes.java new file mode 100644 index 0000000..7242c8b --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsRequestDataAttributes.java @@ -0,0 +1,45 @@ +package com.trustly.api.domain.methods.getaccounttransactions; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractRequestParamsDataAttributes; +import jakarta.validation.constraints.Email; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Data +@SuperBuilder(toBuilder = true) +@EqualsAndHashCode(callSuper = true) +@RequiredArgsConstructor +@AllArgsConstructor +@Jacksonized +@JsonInclude(Include.NON_NULL) +public class GetAccountTransactionsRequestDataAttributes extends AbstractRequestParamsDataAttributes { + + @JsonProperty(value = "Firstname") + private String firstname; + + @JsonProperty(value = "Lastname") + private String lastname; + + @JsonProperty(value = "Email") + @Email + private String email; + + @JsonProperty(value = "MobilePhone") + private String mobilePhone; + + @JsonProperty(value = "NationalIdentificationNumber") + private String nationalIdentificationNumber; + + @JsonProperty(value = "IP") + private String ip; + + @JsonProperty(value = "DateOfBirth") + private String dateOfBirth; +} diff --git a/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsResponseData.java b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsResponseData.java new file mode 100644 index 0000000..a576044 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/getaccounttransactions/GetAccountTransactionsResponseData.java @@ -0,0 +1,29 @@ +package com.trustly.api.domain.methods.getaccounttransactions; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractResponseResultData; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Value +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Jacksonized +public class GetAccountTransactionsResponseData extends AbstractResponseResultData { + + /** + * The OrderID specified when calling the method. + */ + @JsonProperty("orderid") + String orderId; + + /** + * The URL that should be loaded so that the end-user can complete the deposit. + */ + @JsonProperty("url") + String url; +} diff --git a/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestData.java b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestData.java new file mode 100644 index 0000000..2647189 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestData.java @@ -0,0 +1,50 @@ +package com.trustly.api.domain.methods.verifyaccount; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractToTrustlyRequestData; +import com.trustly.api.domain.common.DepositValidationGroup; +import com.trustly.api.domain.common.VerifyAccountValidationGroup; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.groups.ConvertGroup; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; +import org.hibernate.validator.constraints.URL; + +@Data +@SuperBuilder(toBuilder = true) +@EqualsAndHashCode(callSuper = true) +@RequiredArgsConstructor +@AllArgsConstructor +@Jacksonized +@JsonInclude(Include.NON_NULL) +public class VerifyAccountRequestData extends AbstractToTrustlyRequestData { + + @JsonProperty("NotificationURL") + @NotBlank + @URL + private String notificationUrl; + + @JsonProperty("EndUserID") + @NotBlank + private String endUserId; + + @JsonProperty("MessageID") + @NotBlank + private String messageId; + + @JsonProperty(value = "Attributes", required = true) + @JsonInclude(Include.NON_NULL) + @Valid + @ConvertGroup(to = VerifyAccountValidationGroup.class) + @Override + public VerifyAccountRequestDataAttributes getAttributes() { + return super.getAttributes(); + } +} diff --git a/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestDataAttributes.java b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestDataAttributes.java new file mode 100644 index 0000000..ff5a8e3 --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountRequestDataAttributes.java @@ -0,0 +1,65 @@ +package com.trustly.api.domain.methods.verifyaccount; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractRequestParamsDataAttributes; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; +import org.hibernate.validator.constraints.URL; + +@Data +@SuperBuilder(toBuilder = true) +@EqualsAndHashCode(callSuper = true) +@RequiredArgsConstructor +@AllArgsConstructor +@Jacksonized +@JsonInclude(Include.NON_NULL) +public class VerifyAccountRequestDataAttributes extends AbstractRequestParamsDataAttributes { + + @JsonProperty(value = "Locale", required = true) + @NotBlank + private String locale; + + @JsonProperty(value = "Firstname") + private String firstname; + + @JsonProperty(value = "Lastname") + private String lastname; + + @JsonProperty(value = "Email") + @Email + private String email; + + @JsonProperty(value = "MobilePhone") + private String mobilePhone; + + @JsonProperty(value = "NationalIdentificationNumber") + private String nationalIdentificationNumber; + + @JsonProperty(value = "SuccessURL", required = true) + @NotBlank + @URL + private String successUrl; + + @JsonProperty(value = "FailURL", required = true) + @NotBlank + @URL + private String failUrl; + + @JsonProperty(value = "Country", required = true) + @NotBlank + private String country; + + @JsonProperty(value = "IP") + private String ip; + + @JsonProperty(value = "UnchangeableNationalIdentificationNumber") + private Integer unchangeableNationalIdentificationNumber; +} diff --git a/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountResponseData.java b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountResponseData.java new file mode 100644 index 0000000..ba5629f --- /dev/null +++ b/src/main/java/com/trustly/api/domain/methods/verifyaccount/VerifyAccountResponseData.java @@ -0,0 +1,29 @@ +package com.trustly.api.domain.methods.verifyaccount; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.trustly.api.domain.base.AbstractResponseResultData; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Value +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Jacksonized +public class VerifyAccountResponseData extends AbstractResponseResultData { + + /** + * The OrderID specified when calling the method. + */ + @JsonProperty("orderid") + String orderId; + + /** + * The URL that should be loaded so that the end-user can complete the deposit. + */ + @JsonProperty("url") + String url; +} diff --git a/src/test/java/com/trustly/api/RequestsTest.java b/src/test/java/com/trustly/api/RequestsTest.java index 34a4dfb..877b942 100644 --- a/src/test/java/com/trustly/api/RequestsTest.java +++ b/src/test/java/com/trustly/api/RequestsTest.java @@ -13,6 +13,9 @@ import com.trustly.api.domain.methods.deposit.DepositRequestData; import com.trustly.api.domain.methods.deposit.DepositRequestDataAttributes; import com.trustly.api.domain.methods.deposit.DepositResponseData; +import com.trustly.api.domain.methods.getaccounttransactions.GetAccountTransactionsRequestData; +import com.trustly.api.domain.methods.getaccounttransactions.GetAccountTransactionsRequestDataAttributes; +import com.trustly.api.domain.methods.getaccounttransactions.GetAccountTransactionsResponseData; import com.trustly.api.domain.methods.merchantsettlement.MerchantSettlementRequestData; import com.trustly.api.domain.methods.merchantsettlement.MerchantSettlementResponseData; import com.trustly.api.domain.methods.refund.RefundRequestData; @@ -29,7 +32,9 @@ import com.trustly.api.domain.methods.withdraw.WithdrawRequestData; import com.trustly.api.domain.methods.withdraw.WithdrawRequestDataAttributes; import com.trustly.api.domain.methods.withdraw.WithdrawResponseData; + import java.util.UUID; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -397,4 +402,65 @@ void testMerchantSettlement() { Assertions.fail("Unexpected error: " + ex, ex); } } + + @Test + void testVerifyAccount() throws Exception { + + try (TrustlyApiClient client = new TrustlyApiClient(settings)) { + + VerifyAccountRequestData request = VerifyAccountRequestData.builder() + .notificationUrl("https://fake.test.notification.trustly.com") + .endUserId("john.doe@trustly.com") + .messageId(UUID.randomUUID().toString()) + .attributes( + VerifyAccountRequestDataAttributes.builder() + .locale("sv_SE") + .firstname("John") + .lastname("Doe") + .email("john.doe@trustly.com") + .country("SE") + .successUrl("https://google.com") + .failUrl("https://google.com") + .mobilePhone("0701234567") + .build() + ) + .build(); + + VerifyAccountResponseData response = client.verifyAccount(request); + + Assertions.assertNotNull(response); + Assertions.assertNotNull(response.getUrl()); + } + } + + @Test + void testGetAccountTransactions() throws Exception { + + try (TrustlyApiClient client = new TrustlyApiClient(settings)) { + + GetAccountTransactionsRequestData request = GetAccountTransactionsRequestData.builder() + .notificationUrl("https://fake.test.notification.trustly.com") + .locale("sv_SE") + .country("SE") + .successUrl("https://google.com") + .failUrl("https://google.com") + .endUserId("john.doe@trustly.com") + .messageId(UUID.randomUUID().toString()) + .attributes( + GetAccountTransactionsRequestDataAttributes.builder() + .firstname("John") + .lastname("Doe") + .email("john.doe@trustly.com") + .mobilePhone("0701234567") + .dateOfBirth("1979-01-31") + .build() + ) + .build(); + + GetAccountTransactionsResponseData response = client.getAccountTransactions(request); + + Assertions.assertNotNull(response); + Assertions.assertNotNull(response.getUrl()); + } + } }