/// <inheritdoc /> public async Task<PlaidResult<IList<Account>>> GetAuthAccountDataAsync(AccessToken accessToken) { Condition.Requires(accessToken).IsNotNull(); PlaidRequest dataRequest = new PlaidRequest(this.clientId, this.clientSecret, accessToken.Value); HttpResponseMessage response = await this.httpClient.PostAsJsonAsync(GetEndpoint(ApiType.Auth, "get"), dataRequest); string responseJson = await response.Content.ReadAsStringAsync(); if (response.StatusCode == HttpStatusCode.OK) { // Can re-use AddUserResponse since it has accounts, just ignore transactions AddUserResponse dataResponse = JsonConvert.DeserializeObject<AddUserResponse>(responseJson); return new PlaidResult<IList<Account>>(dataResponse?.Accounts?.Select(a => a.ToAccount()).ToList()); } PlaidResult<IList<Account>> errorResult = new PlaidResult<IList<Account>>(); errorResult.Exception = await this.ParseException(response, responseJson); return errorResult; }
/// <inheritdoc /> public Task<AddUserResult> AuthenticateUserAsync(AccessToken accessToken, DeliveryType deliveryType, bool isUpdate = false, ApiType api = ApiType.Connect) { Condition.Requires(accessToken).IsNotNull(); Condition.Requires(deliveryType).IsNotNull(); AuthUserRequest authRequest = new AuthUserRequest(this.clientId, this.clientSecret, accessToken); authRequest.Options = new SendMethodRequest(); authRequest.Options.SendMethod = new ExpandoObject(); authRequest.Options.SendMethod.type = deliveryType.Value; return this.AuthUserInternal(authRequest, api, isUpdate); }
/// <inheritdoc /> public async Task<TransactionResult> GetTransactionsAsync(AccessToken accessToken, bool? includePending = null, string accountId = null, DateTimeOffset? greaterThanDate = null, DateTimeOffset? lessThanDate = null) { Condition.Requires(accessToken).IsNotNull(); GetTransactionsRequest transactionRequest = new GetTransactionsRequest(this.clientId, this.clientSecret, accessToken.Value); if (includePending.HasValue || !string.IsNullOrWhiteSpace(accountId) || greaterThanDate.HasValue || lessThanDate.HasValue) { transactionRequest.Options = new TransactionOptionsRequest { Account = accountId, GreaterThanDate = greaterThanDate, LessThanDate = lessThanDate, Pending = includePending }; } HttpResponseMessage response = await this.httpClient.PostAsJsonAsync(GetEndpoint(ApiType.Connect, "get"), transactionRequest); string responseJson = await response.Content.ReadAsStringAsync(); TransactionResult result = new TransactionResult(); // 200 OK indicates success, response includes access token and accounts/transactions if (response.StatusCode == HttpStatusCode.OK) { // Can just re-use the AddUserResponse since it contains account and transaction objects AddUserResponse userResponse = JsonConvert.DeserializeObject<AddUserResponse>(responseJson); if (userResponse.Accounts != null) result.Accounts = userResponse.Accounts.Select(x => x.ToAccount()).ToList(); if (userResponse.Transactions != null) result.Transactions = userResponse.Transactions.Select(x => x.ToTransaction()).ToList(); return result; } result.Exception = await this.ParseException(response, responseJson); return result; }
/// <inheritdoc /> public async Task<AddUserResult> UpdateUserAsync(AccessToken accessToken, string username, string password, string pin = null, Uri webhookUri = null, ApiType api = ApiType.Connect) { Condition.Requires(accessToken).IsNotNull(); if ((string.IsNullOrWhiteSpace(username) || password == null) && webhookUri == null) throw new ArgumentException("Username/password required unless only updating webhookUri"); UpdateUserRequest updateRequest = new UpdateUserRequest(this.clientId, this.clientSecret, accessToken.Value); updateRequest.Username = username; updateRequest.Password = password; updateRequest.Pin = pin; if (webhookUri != null) updateRequest.Options = new UpdateUserRequestOptions { Webhook = webhookUri.ToString() }; HttpResponseMessage response = await this.httpClient.PatchAsJsonAsync(GetEndpoint(api), updateRequest); return await this.ProcessAddOrAuthResponse(response); }
/// <inheritdoc /> public async Task<PlaidResult<bool>> DeleteUserAsync(AccessToken accessToken, ApiType api = ApiType.Connect) { Condition.Requires(accessToken).IsNotNull(); PlaidRequest deleteRequest = new PlaidRequest(this.clientId, this.clientSecret, accessToken.Value); HttpResponseMessage response = await this.httpClient.DeleteAsJsonAsync(GetEndpoint(api), deleteRequest); PlaidResult<bool> result = new PlaidResult<bool>(response.StatusCode == HttpStatusCode.OK); result.Exception = await this.ParseException(response); return result; }
/// <inheritdoc /> public Task<AddUserResult> AuthenticateUserAsync(AccessToken accessToken, bool isUpdate = false, ApiType api = ApiType.Connect, params string[] mfaValues) { Condition.Requires(accessToken).IsNotNull(); Condition.Requires(mfaValues).IsNotNull().IsNotEmpty(); AuthUserRequest authRequest = new AuthUserRequest(this.clientId, this.clientSecret, accessToken); if (mfaValues.Length == 1) authRequest.MfaValue = mfaValues.FirstOrDefault(); else authRequest.MfaValue = new List<string>(mfaValues); return this.AuthUserInternal(authRequest, api, isUpdate); }
/// <inheritdoc /> public Task<AddUserResult> AuthenticateUserAsync(AccessToken accessToken, string deviceMask, bool isUpdate = false, ApiType api = ApiType.Connect) { Condition.Requires(accessToken).IsNotNull(); Condition.Requires(deviceMask).IsNotNullOrWhiteSpace(); AuthUserRequest authRequest = new AuthUserRequest(this.clientId, this.clientSecret, accessToken); authRequest.Options = new SendMethodRequest(); authRequest.Options.SendMethod = new ExpandoObject(); authRequest.Options.SendMethod.mask = deviceMask; return this.AuthUserInternal(authRequest, api, isUpdate); }
public async Task AuthUserMultipleQuestions() { IHttpClientWrapper httpClient = this.GetMockHttpClient("QuestionMfa.json", HttpStatusCode.Created, HttpMethod.Post, "connect/step"); IPlaidClient testClient = this.GetPlaidClient(httpClient);testClient = this.GetPlaidClient(httpClient); AccessToken token = new AccessToken("test_us"); AddUserResult result = await testClient.AuthenticateUserAsync(token, false, ApiType.Connect, "again"); Assert.IsNotNull(result); Assert.IsFalse(result.IsError); Assert.IsTrue(result.IsMfaRequired); Assert.IsNotNull(result.AuthPrompt); Assert.IsNotNull(result.AuthPrompt.Questions); Assert.IsNotNull(result.AccessToken); httpClient = this.GetMockHttpClient("AuthUserUsBank.json", HttpStatusCode.OK, HttpMethod.Post, "connect/step"); testClient = this.GetPlaidClient(httpClient); result = await testClient.AuthenticateUserAsync(token, false, mfaValues: "tomato"); Assert.IsNotNull(result); Assert.IsFalse(result.IsError); Assert.IsFalse(result.IsMfaRequired); Assert.IsNotNull(result.AccessToken); }
public async Task AuthUserSingleQuestion() { IHttpClientWrapper httpClient = this.GetMockHttpClient("AuthUserUsBank.json", HttpStatusCode.OK, HttpMethod.Post, "connect/step"); IPlaidClient testClient = this.GetPlaidClient(httpClient); AccessToken token = new AccessToken("test_us"); AddUserResult result = await testClient.AuthenticateUserAsync(token, false, ApiType.Connect, "tomato"); Assert.IsNotNull(result); Assert.IsFalse(result.IsError); Assert.IsFalse(result.IsMfaRequired); Assert.IsNotNull(result.AccessToken); }
/// <summary> /// Initializes a new instance of the <see cref="AuthUserRequest"/> class. /// </summary> /// <param name="clientId">The client id provided on signup.</param> /// <param name="secret">The client secret provided on signup.</param> /// <param name="accessToken">The access token associated with the request.</param> public AuthUserRequest(string clientId, string secret, AccessToken accessToken) : base(clientId, secret, accessToken?.Value) { }
/// <inheritdoc /> public async Task<PlaidResult<IList<Account>>> GetAccountsAsync(AccessToken accessToken) { Condition.Requires(accessToken).IsNotNull(); PlaidRequest balanceRequest = new PlaidRequest(this.clientId, this.clientSecret, accessToken.Value); HttpResponseMessage response = await this.httpClient.PostAsJsonAsync("balance", balanceRequest); // Re-use add user result since it contains the account objects of interest AddUserResult userResult = await this.ProcessAddOrAuthResponse(response); PlaidResult<IList<Account>> result = new PlaidResult<IList<Account>>(); if (userResult.Accounts != null) result.Value = new List<Account>(userResult.Accounts); result.Exception = userResult.Exception; return result; }