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); } }
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); } }
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); }