/// <summary> /// Verify the provided account credentials. Raises an exception if validation fails /// </summary> /// <param name="financialInstitution">Financial institution to query</param> /// <param name="fiCredentials">Credentials for financial institution account</param> /// <returns>List of accounts</returns> public static async Task VerifyAccountCredentials(FinancialInstitution financialInstitution, OFX.Types.Credentials fiCredentials) { using (BackgroundTaskTracker.BeginTask("Verifying Credentials")) { // Convert from data model FI into OFX FI var ofxFinancialInstitition = new OFX.Types.FinancialInstitution(financialInstitution.Name, new Uri(financialInstitution.OfxUpdateUrl), financialInstitution.OfxOrganizationId, financialInstitution.OfxFinancialUnitId); var ofxService = new OFX2Service(ofxFinancialInstitition, fiCredentials); // Call list accounts to validate credentials await ofxService.ListAccounts().ConfigureAwait(false); } }
/// <summary> /// Add an account to the database - Using OFX data specification /// </summary> /// <param name="account">Populated account object to add to database</param> /// <param name="financialInstitution">OFX financial institution to link in database. Will be created if necessary.</param> /// <param name="fiUser">User credentials for the financial institution</param> /// <returns>Created account</returns> public Account AddAccount(Account account, OFX.Types.FinancialInstitution financialInstitution, FinancialInstitutionUser fiUser) { // TODO: See if there's an existing FI or user with this info already // Look for existing FI entry with the same name FinancialInstitution fi; try { fi = DbContext.FinancialInstitutions.First(i => i.Name == financialInstitution.Name); } catch (Exception ex) { // Can result in InvalidOperationException or NullReferenceException depending on provider if (ex is InvalidOperationException || ex is NullReferenceException) { // FI Doesn't exist, add a new one fi = new FinancialInstitution { Name = financialInstitution.Name, OfxFinancialUnitId = financialInstitution.FinancialId, OfxOrganizationId = financialInstitution.OrganizationId, OfxUpdateUrl = financialInstitution.ServiceEndpoint.ToString() }; DbContext.FinancialInstitutions.Add(fi); } else throw; // Unhandled } // Look for existing user under this FI with same userId try { fiUser = fi.Users.First(u => u.UserId == fiUser.UserId && u.Password == fiUser.Password); } catch (Exception ex) { // Can result in InvalidOperationException or NullReferenceException depending on provider if (ex is InvalidOperationException || ex is NullReferenceException) { // User doesn't exist, add as new fi.Users.Add(fiUser); DbContext.FinancialInstitutionUsers.Add(fiUser); } else throw; // Unhandled } fiUser.Accounts.Add(account); DbContext.Accounts.Add(account); return account; }