From 85735b72c18b68eda5c0d2955058139fad72a110 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Fri, 4 Sep 2020 14:44:11 -0400 Subject: [PATCH 1/5] Add link/token/get for plaid-java --- .../com/plaid/client/PlaidApiService.java | 65 ++++++++-------- .../request/LinkTokenCreateRequest.java | 13 +++- .../client/request/LinkTokenGetRequest.java | 18 +++++ .../client/response/LinkTokenGetResponse.java | 62 ++++++++++++++++ .../client/integration/LinkTokenGetTest.java | 74 +++++++++++++++++++ 5 files changed, 201 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/plaid/client/request/LinkTokenGetRequest.java create mode 100644 src/main/java/com/plaid/client/response/LinkTokenGetResponse.java create mode 100644 src/test/java/com/plaid/client/integration/LinkTokenGetTest.java diff --git a/src/main/java/com/plaid/client/PlaidApiService.java b/src/main/java/com/plaid/client/PlaidApiService.java index 8fbee9384f..e50f3cf967 100644 --- a/src/main/java/com/plaid/client/PlaidApiService.java +++ b/src/main/java/com/plaid/client/PlaidApiService.java @@ -1,12 +1,5 @@ package com.plaid.client; -import com.plaid.client.request.LinkTokenCreateRequest; -import com.plaid.client.response.LinkTokenCreateResponse; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.POST; - import com.plaid.client.request.AccountsBalanceGetRequest; import com.plaid.client.request.AccountsGetRequest; import com.plaid.client.request.AssetReportAuditCopyCreateRequest; @@ -21,9 +14,6 @@ import com.plaid.client.request.AuthGetRequest; import com.plaid.client.request.CategoriesGetRequest; import com.plaid.client.request.CreditDetailsGetRequest; -import com.plaid.client.request.depositswitch.DepositSwitchCreateRequest; -import com.plaid.client.request.depositswitch.DepositSwitchGetRequest; -import com.plaid.client.request.depositswitch.DepositSwitchTokenCreateRequest; import com.plaid.client.request.IdentityGetRequest; import com.plaid.client.request.IncomeGetRequest; import com.plaid.client.request.InstitutionsGetByIdRequest; @@ -32,24 +22,19 @@ import com.plaid.client.request.InvestmentsHoldingsGetRequest; import com.plaid.client.request.InvestmentsTransactionsGetRequest; import com.plaid.client.request.ItemAccessTokenInvalidateRequest; +import com.plaid.client.request.ItemAddTokenCreateRequest; import com.plaid.client.request.ItemApexProcessorTokenCreateRequest; import com.plaid.client.request.ItemDwollaProcessorTokenCreateRequest; import com.plaid.client.request.ItemGetRequest; import com.plaid.client.request.ItemImportRequest; -import com.plaid.client.request.ItemAddTokenCreateRequest; import com.plaid.client.request.ItemPublicTokenCreateRequest; import com.plaid.client.request.ItemPublicTokenExchangeRequest; import com.plaid.client.request.ItemRemoveRequest; import com.plaid.client.request.ItemStripeTokenCreateRequest; import com.plaid.client.request.ItemWebhookUpdateRequest; import com.plaid.client.request.LiabilitiesGetRequest; -import com.plaid.client.request.paymentinitiation.PaymentCreateRequest; -import com.plaid.client.request.paymentinitiation.PaymentGetRequest; -import com.plaid.client.request.paymentinitiation.PaymentListRequest; -import com.plaid.client.request.paymentinitiation.PaymentTokenCreateRequest; -import com.plaid.client.request.paymentinitiation.RecipientCreateRequest; -import com.plaid.client.request.paymentinitiation.RecipientGetRequest; -import com.plaid.client.request.paymentinitiation.RecipientListRequest; +import com.plaid.client.request.LinkTokenCreateRequest; +import com.plaid.client.request.LinkTokenGetRequest; import com.plaid.client.request.SandboxItemFireWebhookRequest; import com.plaid.client.request.SandboxItemResetLoginRequest; import com.plaid.client.request.SandboxItemSetVerificationStatusRequest; @@ -57,7 +42,6 @@ import com.plaid.client.request.TransactionsGetRequest; import com.plaid.client.request.TransactionsRefreshRequest; import com.plaid.client.request.WebhookVerificationKeyGetRequest; - import com.plaid.client.response.AccountsBalanceGetResponse; import com.plaid.client.response.AccountsGetResponse; import com.plaid.client.response.AssetReportAuditCopyCreateResponse; @@ -68,9 +52,6 @@ import com.plaid.client.response.AuthGetResponse; import com.plaid.client.response.CategoriesGetResponse; import com.plaid.client.response.CreditDetailsGetResponse; -import com.plaid.client.response.depositswitch.DepositSwitchCreateResponse; -import com.plaid.client.response.depositswitch.DepositSwitchGetResponse; -import com.plaid.client.response.depositswitch.DepositSwitchTokenCreateResponse; import com.plaid.client.response.IdentityGetResponse; import com.plaid.client.response.IncomeGetResponse; import com.plaid.client.response.InstitutionsGetByIdResponse; @@ -79,24 +60,19 @@ import com.plaid.client.response.InvestmentsHoldingsGetResponse; import com.plaid.client.response.InvestmentsTransactionsGetResponse; import com.plaid.client.response.ItemAccessTokenInvalidateResponse; +import com.plaid.client.response.ItemAddTokenCreateResponse; import com.plaid.client.response.ItemApexProcessorTokenCreateResponse; import com.plaid.client.response.ItemDwollaProcessorTokenCreateResponse; import com.plaid.client.response.ItemGetResponse; import com.plaid.client.response.ItemImportResponse; -import com.plaid.client.response.ItemAddTokenCreateResponse; import com.plaid.client.response.ItemPublicTokenCreateResponse; import com.plaid.client.response.ItemPublicTokenExchangeResponse; import com.plaid.client.response.ItemRemoveResponse; import com.plaid.client.response.ItemStripeTokenCreateResponse; import com.plaid.client.response.ItemWebhookUpdateResponse; import com.plaid.client.response.LiabilitiesGetResponse; -import com.plaid.client.response.paymentinitiation.PaymentCreateResponse; -import com.plaid.client.response.paymentinitiation.PaymentGetResponse; -import com.plaid.client.response.paymentinitiation.PaymentListResponse; -import com.plaid.client.response.paymentinitiation.PaymentTokenCreateResponse; -import com.plaid.client.response.paymentinitiation.RecipientCreateResponse; -import com.plaid.client.response.paymentinitiation.RecipientGetResponse; -import com.plaid.client.response.paymentinitiation.RecipientListResponse; +import com.plaid.client.response.LinkTokenCreateResponse; +import com.plaid.client.response.LinkTokenGetResponse; import com.plaid.client.response.SandboxItemFireWebhookResponse; import com.plaid.client.response.SandboxItemResetLoginResponse; import com.plaid.client.response.SandboxItemSetVerificationStatusResponse; @@ -104,6 +80,32 @@ import com.plaid.client.response.TransactionsGetResponse; import com.plaid.client.response.TransactionsRefreshResponse; import com.plaid.client.response.WebhookVerificationKeyGetResponse; +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; + +import com.plaid.client.request.depositswitch.DepositSwitchCreateRequest; +import com.plaid.client.request.depositswitch.DepositSwitchGetRequest; +import com.plaid.client.request.depositswitch.DepositSwitchTokenCreateRequest; +import com.plaid.client.request.paymentinitiation.PaymentCreateRequest; +import com.plaid.client.request.paymentinitiation.PaymentGetRequest; +import com.plaid.client.request.paymentinitiation.PaymentListRequest; +import com.plaid.client.request.paymentinitiation.PaymentTokenCreateRequest; +import com.plaid.client.request.paymentinitiation.RecipientCreateRequest; +import com.plaid.client.request.paymentinitiation.RecipientGetRequest; +import com.plaid.client.request.paymentinitiation.RecipientListRequest; + +import com.plaid.client.response.depositswitch.DepositSwitchCreateResponse; +import com.plaid.client.response.depositswitch.DepositSwitchGetResponse; +import com.plaid.client.response.depositswitch.DepositSwitchTokenCreateResponse; +import com.plaid.client.response.paymentinitiation.PaymentCreateResponse; +import com.plaid.client.response.paymentinitiation.PaymentGetResponse; +import com.plaid.client.response.paymentinitiation.PaymentListResponse; +import com.plaid.client.response.paymentinitiation.PaymentTokenCreateResponse; +import com.plaid.client.response.paymentinitiation.RecipientCreateResponse; +import com.plaid.client.response.paymentinitiation.RecipientGetResponse; +import com.plaid.client.response.paymentinitiation.RecipientListResponse; public interface PlaidApiService { @@ -119,6 +121,9 @@ public interface PlaidApiService { @POST("/link/token/create") Call linkTokenCreate(@Body LinkTokenCreateRequest request); + @POST("/link/token/get") + Call linkTokenGet(@Body LinkTokenGetRequest request); + @POST("/item/public_token/exchange") Call itemPublicTokenExchange( @Body ItemPublicTokenExchangeRequest request); diff --git a/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java b/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java index 96fb33cf3b..d0a4cf2291 100644 --- a/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java +++ b/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java @@ -7,6 +7,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; public class LinkTokenCreateRequest extends BaseClientRequest { private User user; @@ -39,11 +40,21 @@ public LinkTokenCreateRequest( public static class SubtypeFilters { private List accountSubtypes; - private List subtypes; public SubtypeFilters(List accountSubtypes) { this.accountSubtypes = accountSubtypes; } + + @Override public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SubtypeFilters that = (SubtypeFilters) o; + return Objects.equals(accountSubtypes, that.accountSubtypes); + } + + @Override public int hashCode() { + return Objects.hash(accountSubtypes); + } } public static class User { diff --git a/src/main/java/com/plaid/client/request/LinkTokenGetRequest.java b/src/main/java/com/plaid/client/request/LinkTokenGetRequest.java new file mode 100644 index 0000000000..f4c31810e8 --- /dev/null +++ b/src/main/java/com/plaid/client/request/LinkTokenGetRequest.java @@ -0,0 +1,18 @@ +package com.plaid.client.request; + +import com.google.gson.annotations.JsonAdapter; +import com.plaid.client.internal.gson.Optional; +import com.plaid.client.internal.gson.OptionalDateTypeAdapterFactory; +import com.plaid.client.request.common.BaseClientRequest; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class LinkTokenGetRequest extends BaseClientRequest { + private String linkToken; + + public LinkTokenGetRequest(String linkToken) { + this.linkToken = linkToken; + } +} diff --git a/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java b/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java new file mode 100644 index 0000000000..f72b883ae6 --- /dev/null +++ b/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java @@ -0,0 +1,62 @@ +package com.plaid.client.response; + +import com.plaid.client.request.LinkTokenCreateRequest; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class LinkTokenGetResponse extends BaseResponse { + private String linkToken; + private Date expiration; + private LinkTokenMetadata metadata; + + public String getLinkToken() { + return linkToken; + } + + public Date getExpiration() { + return expiration; + } + + public LinkTokenMetadata getMetadata() { + return metadata; + } + + public static class LinkTokenMetadata { + private List initialProducts; + private String webhook; + private List countryCodes; + private String language; + private Map accountFilters; + private String redirectUri; + private String clientName; + + public List getInitialProducts() { + return initialProducts; + } + + public String getWebhook() { + return webhook; + } + + public List getCountryCodes() { + return countryCodes; + } + + public String getLanguage() { + return language; + } + + public Map getAccountFilters() { + return accountFilters; + } + + public String getRedirectUri() { + return redirectUri; + } + + public String getClientName() { + return clientName; + } + } +} diff --git a/src/test/java/com/plaid/client/integration/LinkTokenGetTest.java b/src/test/java/com/plaid/client/integration/LinkTokenGetTest.java new file mode 100644 index 0000000000..4eed710195 --- /dev/null +++ b/src/test/java/com/plaid/client/integration/LinkTokenGetTest.java @@ -0,0 +1,74 @@ +package com.plaid.client.integration; + +import com.plaid.client.request.LinkTokenCreateRequest; +import com.plaid.client.request.LinkTokenGetRequest; +import com.plaid.client.request.common.Product; +import com.plaid.client.response.ErrorResponse; +import com.plaid.client.response.LinkTokenCreateResponse; +import com.plaid.client.response.LinkTokenGetResponse; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Test; +import retrofit2.Response; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class LinkTokenGetTest extends AbstractItemIntegrationTest { + @Override + protected List setupItemProducts() { + return Collections.singletonList(Product.AUTH); + } + + @Override + protected String setupItemInstitutionId() { + return TARTAN_BANK_INSTITUTION_ID; + } + + @Test + public void testInvalidToken() throws Exception { + Response response = + client().service().linkTokenGet( + new LinkTokenGetRequest("bad token")).execute(); + + assertErrorResponse(response, ErrorResponse.ErrorType.INVALID_REQUEST, "INVALID_FIELD"); + } + + @Test + public void testSuccess() throws Exception { + String clientUserId = Long.toString((new Date()).getTime()); + LinkTokenCreateRequest.User user = new LinkTokenCreateRequest.User(clientUserId); + String clientName = "very nice client name"; + Map accountFilters = + new HashMap<>(); + accountFilters.put("depository", + new LinkTokenCreateRequest.SubtypeFilters(Arrays.asList("savings"))); + + LinkTokenCreateRequest request = new LinkTokenCreateRequest( + user, + clientName, + Collections.singletonList("auth"), + Collections.singletonList("US"), + "en").withAccountFilters(accountFilters); + Response createResponse = + client().service().linkTokenCreate( + request).execute(); + + assertSuccessResponse(createResponse); + String linkToken = createResponse.body().getLinkToken(); + assertNotNull(linkToken); + Response getResponse = + client().service().linkTokenGet( + new LinkTokenGetRequest(linkToken)).execute(); + + assertSuccessResponse(getResponse); + assertEquals(clientName, getResponse.body().getMetadata().getClientName()); + assertEquals(Arrays.asList("auth"), getResponse.body().getMetadata().getInitialProducts()); + assertEquals(Arrays.asList("US"), getResponse.body().getMetadata().getCountryCodes()); + assertEquals(accountFilters, getResponse.body().getMetadata().getAccountFilters()); + } +} From 0ad74f1cab58388a57caa3892fca617ec660d8e6 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 8 Sep 2020 11:20:27 -0400 Subject: [PATCH 2/5] add created --- .../java/com/plaid/client/response/LinkTokenGetResponse.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java b/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java index f72b883ae6..d82e12d203 100644 --- a/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java +++ b/src/main/java/com/plaid/client/response/LinkTokenGetResponse.java @@ -8,6 +8,7 @@ public class LinkTokenGetResponse extends BaseResponse { private String linkToken; private Date expiration; + private Date createdAt; private LinkTokenMetadata metadata; public String getLinkToken() { @@ -22,6 +23,10 @@ public LinkTokenMetadata getMetadata() { return metadata; } + public Date getCreatedAt() { + return createdAt; + } + public static class LinkTokenMetadata { private List initialProducts; private String webhook; From 2db91c169a06f128c87ab63db0e48440789290bd Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 8 Sep 2020 18:30:27 -0400 Subject: [PATCH 3/5] lint --- .../plaid/client/request/LinkTokenCreateRequest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java b/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java index d0a4cf2291..c5cfc223c0 100644 --- a/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java +++ b/src/main/java/com/plaid/client/request/LinkTokenCreateRequest.java @@ -45,10 +45,14 @@ public SubtypeFilters(List accountSubtypes) { this.accountSubtypes = accountSubtypes; } - @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - SubtypeFilters that = (SubtypeFilters) o; + @Override public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + SubtypeFilters that = (SubtypeFilters) other; return Objects.equals(accountSubtypes, that.accountSubtypes); } From f865a91f07b59ac88225efeda93c5fe6e33715e2 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 8 Sep 2020 19:02:41 -0400 Subject: [PATCH 4/5] fix test --- .../com/plaid/client/integration/RecipientCreateTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/plaid/client/integration/RecipientCreateTest.java b/src/test/java/com/plaid/client/integration/RecipientCreateTest.java index 042be50ee5..e7d35daca3 100644 --- a/src/test/java/com/plaid/client/integration/RecipientCreateTest.java +++ b/src/test/java/com/plaid/client/integration/RecipientCreateTest.java @@ -5,12 +5,10 @@ import com.plaid.client.model.paymentinitiation.Bacs; import com.plaid.client.request.paymentinitiation.RecipientCreateRequest; import com.plaid.client.response.paymentinitiation.RecipientCreateResponse; -import com.plaid.client.response.paymentinitiation.RecipientGetResponse; +import java.util.Arrays; import org.junit.Test; import retrofit2.Response; -import java.util.Arrays; - import static org.junit.Assert.assertNotNull; public class RecipientCreateTest extends AbstractIntegrationTest { @@ -40,7 +38,7 @@ public static Response createRecipientWithBacs(PlaidCli Address address = new Address(Arrays.asList("Street Name 999"), "City", "99999", "GB"); RecipientCreateRequest recipientCreateRequest = - new RecipientCreateRequest("John Doe").withAddress(address).withBacs(new Bacs("12345678", "01-02-03")); + new RecipientCreateRequest("John Doe").withAddress(address).withBacs(new Bacs("123456", "01-02-03")); Response response = @@ -53,7 +51,7 @@ public static Response createRecipientWithBacsAndIban(P Address address = new Address(Arrays.asList("Street Name 999"), "City", "99999", "GB"); RecipientCreateRequest recipientCreateRequest = - new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555").withAddress(address).withBacs(new Bacs("12345678", "01-02-03")); + new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555").withAddress(address).withBacs(new Bacs("123456", "01-02-03")); Response response = client.service().recipientCreate(recipientCreateRequest).execute(); From 4f84e8f1cc5ff830b02564c45e7b0da84177c872 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 8 Sep 2020 19:17:56 -0400 Subject: [PATCH 5/5] fix sort code --- .../integration/RecipientCreateTest.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/plaid/client/integration/RecipientCreateTest.java b/src/test/java/com/plaid/client/integration/RecipientCreateTest.java index e7d35daca3..cfe8de2bc3 100644 --- a/src/test/java/com/plaid/client/integration/RecipientCreateTest.java +++ b/src/test/java/com/plaid/client/integration/RecipientCreateTest.java @@ -14,15 +14,16 @@ public class RecipientCreateTest extends AbstractIntegrationTest { /** - * Utility method that creates a payment recipient with an iban. - * Used by other integration tests to set up. + * Utility method that creates a payment recipient with an iban. Used by other integration tests + * to set up. */ - public static Response createRecipientWithIban(PlaidClient client) throws Exception { + public static Response createRecipientWithIban(PlaidClient client) + throws Exception { Address address = new Address(Arrays.asList("Street Name 999"), "City", "99999", "GB"); RecipientCreateRequest recipientCreateRequest = - new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555").withAddress(address); - + new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555") + .withAddress(address); Response response = client.service().recipientCreate(recipientCreateRequest).execute(); @@ -31,30 +32,34 @@ public static Response createRecipientWithIban(PlaidCli } /** - * Utility method that creates a payment recipient with bacs. - * Used by other integration tests to set up. + * Utility method that creates a payment recipient with bacs. Used by other integration tests to + * set up. */ - public static Response createRecipientWithBacs(PlaidClient client) throws Exception { + public static Response createRecipientWithBacs(PlaidClient client) + throws Exception { Address address = new Address(Arrays.asList("Street Name 999"), "City", "99999", "GB"); RecipientCreateRequest recipientCreateRequest = - new RecipientCreateRequest("John Doe").withAddress(address).withBacs(new Bacs("123456", "01-02-03")); - + new RecipientCreateRequest("John Doe").withAddress(address) + .withBacs(new Bacs("123456", "010203")); Response response = - client.service().recipientCreate(recipientCreateRequest).execute(); + client.service().recipientCreate(recipientCreateRequest).execute(); return response; } - public static Response createRecipientWithBacsAndIban(PlaidClient client) throws Exception { + public static Response createRecipientWithBacsAndIban(PlaidClient client) + throws Exception { Address address = new Address(Arrays.asList("Street Name 999"), "City", "99999", "GB"); RecipientCreateRequest recipientCreateRequest = - new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555").withAddress(address).withBacs(new Bacs("123456", "01-02-03")); + new RecipientCreateRequest("John Doe").withIban("GB33BUKB20201555555555") + .withAddress(address) + .withBacs(new Bacs("12345678", "010203")); Response response = - client.service().recipientCreate(recipientCreateRequest).execute(); + client.service().recipientCreate(recipientCreateRequest).execute(); return response; }