Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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"));
                }
        }
Exemplo n.º 3
0
        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));
            }
        }