예제 #1
0
        public void Refreshes_On_First_Attempt()
        {
            var userBankAccount = new FinanceUserBankAccount();

            if (!DateTime.TryParseExact(userBankAccount.Updated, "O", CultureInfo.InvariantCulture, DateTimeStyles.None, out var updated))
            {
                updated = DateTime.UtcNow.AddYears(-1);
            }
            var refreshPoint = DateTime.UtcNow.AddHours(-1);

            if (refreshPoint <= updated)
            {
                Assert.True(false);
            }
            else
            {
                Assert.True(true);
            }
        }
예제 #2
0
        public void Uses_Cache_When_Not_Stale()
        {
            var userBankAccount = new FinanceUserBankAccount
            {
                Updated = DateTime.UtcNow.AddYears(1).ToString("O")
            };

            if (!DateTime.TryParseExact(userBankAccount.Updated, "O", CultureInfo.InvariantCulture, DateTimeStyles.None, out var updated))
            {
                updated = DateTime.UtcNow;
            }
            var refreshPoint = DateTime.UtcNow.AddHours(-1);

            if (refreshPoint <= updated)
            {
                Assert.True(true);
            }
            else
            {
                Assert.True(false);
            }
        }
예제 #3
0
        public FinanceUserBankAccount GetAndCacheFinanceUserBankAccount(
            FinanceUser user,
            DatabaseClient <FinanceUserBankAccount> userBankAccountClient)
        {
            Console.WriteLine("Getting account data from plaid");
            var failedAccounts         = new List <FinanceUserBankAccountFailedAccount>();
            var accounts               = new ConcurrentBag <AccountBalance>();
            var institutionsDictionary = new ConcurrentDictionary <string, string>();

            user.BankLinks ??= new List <BankLink>();
            var client = Configuration.BankClient;

            Parallel.ForEach(user.BankLinks, new ParallelOptions {
                MaxDegreeOfParallelism = 10
            }, (bankLink) =>
            {
                try
                {
                    var accountBalance = client.GetAccountBalance(bankLink.AccessToken);
                    institutionsDictionary.TryAdd(
                        accountBalance.Item["institution_id"].Value <string>(),
                        accountBalance.Item["institution_id"].Value <string>());
                    accounts.Add(accountBalance);
                }
                catch (Exception e)
                {
                    failedAccounts.Add(new FinanceUserBankAccountFailedAccount
                    {
                        ItemId           = bankLink.ItemId,
                        ErrorDescription = e.ToString(),
                        InstitutionName  = bankLink.InstitutionName
                    });
                }
            });
            var institutionDetails = new ConcurrentBag <JObject>();

            Parallel.ForEach(institutionsDictionary.Keys, new ParallelOptions {
                MaxDegreeOfParallelism = 10
            }, institution =>
            {
                institutionDetails.Add(client.GetInstitution(institution));
            });
            var institutionsJson = new JArray();

            foreach (var institutionDetail in institutionDetails)
            {
                institutionsJson.Add(institutionDetail["institution"]);
            }
            foreach (var account in accounts)
            {
                var institutionId = account.Item["institution_id"].Value <string>();
                account.Item["institution"] = institutionsJson.First(x =>
                                                                     string.Equals(x["institution_id"].Value <string>(), institutionId, StringComparison.OrdinalIgnoreCase));
            }
            var financeUserBankAccount = new FinanceUserBankAccount
            {
                Email          = user.Email,
                AllAccounts    = JArray.FromObject(accounts),
                FailedAccounts = failedAccounts,
                Updated        = DateTime.UtcNow.ToString("O")
            };

            userBankAccountClient.Create(financeUserBankAccount);
            return(financeUserBankAccount);
        }