public async Task <LoginResult> LoginAsync(string userIdentifier, BankLogin bankLogin) { try { var credentials = BankStatementsUtil.FormatCredentials(bankLogin, await InstitutionsAsync().ConfigureAwait(false)); var policy = Policy .Handle <FlurlHttpTimeoutException>() .RetryAsync(3, (exception, retryCount) => { Trace.TraceWarning(exception.ToString(), "BankStatement login timed out {RetryCount} times", retryCount); }); string refcode = CreateReferralCode(userIdentifier); var response = await policy.ExecuteAsync(() => (_configuration.ApiUrl + "/login") .WithHeader("X-API-KEY", _configuration.ApiKey) .WithHeader("REFERRAL-CODE", refcode) .WithHeader("Accept", "application/json") .PostJsonAsync(new { silent = 0, async = 0, credentials }).ReceiveString()).ConfigureAwait(false); var loginResponse = JsonConvert.DeserializeObject <LoginResponse>(response); loginResponse.ReferralCode = refcode; return(new LoginResult(BankStatementResponseType.LoginSuccess, loginResponse)); } catch (FlurlHttpException ex) { Trace.TraceWarning("Failed to login to bank statements for " + userIdentifier); if (ex.Call.Response == null) { throw; } var response = await ex.Call?.Response.Content.ReadAsStringAsync(); if (response == null) { return(new LoginResult(BankStatementResponseType.Failed, ex.GetInnerMostException()?.Message)); } var error = JsonConvert.DeserializeObject <BankStatementError>(response); if (error.IsInvalidLogin()) { return(new LoginResult( BankStatementResponseType.InvalidLogin, error.Error)); } return(new LoginResult(BankStatementResponseType.Failed, response)); } }
public void Format_credentials_adds_institution() { var assembly = Assembly.GetExecutingAssembly(); var resourceName = "Vita.Domain.Tests.BankStatements.bankstatements-institutions.json"; var names = assembly.GetManifestResourceNames(); foreach (var name in names) { Console.WriteLine(name); } using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); var dic = new Dictionary <string, string> { { "customer registration number", SecretMan.Get("bankstatements-cba-test-username") }, { "password", SecretMan.Get("bankstatements-cba-test-password") } }; var login = new BankLogin("anz", dic); var data = JsonConvert.DeserializeObject <Institution[]>(result); var creds = BankStatementsUtil.FormatCredentials(login, data); Assert.True(creds.ContainsKey("institution")); } }
public async Task <BankStatementDownload> LoginFetchAllAsync(string userIdentifier, BankLogin bankLogin) { try { var credentials = BankStatementsUtil.FormatCredentials(bankLogin, await InstitutionsAsync().ConfigureAwait(false)); var policy = Policy .Handle <FlurlHttpTimeoutException>() .RetryAsync(3, (exception, retryCount) => { Trace.TraceWarning(exception.ToString(), "BankStatement download timed out {RetryCount} times", retryCount); }); var response = await policy.ExecuteAsync(() => (_configuration.ApiUrl + "/login_fetch_all") .WithHeader("X-API-KEY", _configuration.ApiKey) .WithHeader("REFERRAL-CODE", CreateReferralCode(userIdentifier)) .WithHeader("Accept", "application/json") .PostJsonAsync(new { silent = 0, async = 0, credentials }).ReceiveString()); return(new BankStatementDownload(response)); } catch (FlurlHttpException ex) { Debug.Write(ex, "Failed to download bank statement"); if (ex.Call.Response == null) { throw; } var response = ex.Call.Exception.Message; if (response == null) { return(BankStatementDownload.Errored(new BankStatementError { Error = "Empty response from bs.com", ReferralCode = userIdentifier })); } var deserializer = new XmlSerializer(typeof(BankStatementError)); var reader = new StringReader(response); var error = (BankStatementError)deserializer.Deserialize(reader); return(BankStatementDownload.Errored(error)); } }