Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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;
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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;
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
        /// <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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
 /// <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)
 {
 }
Exemplo n.º 11
-1
        /// <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;
        }