예제 #1
0
        public async Task <EntityOperationResult <User> > Authenticate(string username, string password)
        {
            var result = new EntityOperationResult <User>();

            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                result.AddError("Login fail", "Name or Password are empty");
                return(result);
            }

            var user = await _context.Users.FirstOrDefaultAsync(x => x.Name == username);

            if (user == null)
            {
                result.AddError("User inexistent", "User is nor registered");
                return(result);
            }

            if (!VerifyPasswordHash(password, user.PasswordHash, user.PasswordSalt))
            {
                result.AddError("User invalid", "User password invalid");
                return(result);
            }

            // authentication successful
            return(new EntityOperationResult <User>(user));
        }
예제 #2
0
        private async Task <EntityOperationResult <CurrencyDto> > GetDataFromHtmlAsync(string htmlPage, DateTime date)
        {
            var result   = new EntityOperationResult <CurrencyDto>();
            var parser   = new HtmlParser();
            var document = parser.ParseDocument(htmlPage);

            if (document.GetElementsByClassName("sinResultados").Any())
            {
                Logger.LogInformation("Creating Currency object with No Price.");
                result.Entity = CreateCurrency(date, "0", ServiceSettings.CurrencyCode, "0");

                return(result);
            }

            var titleValidation = document.GetElementsByTagName("tr").ElementAtOrDefault(1);

            if (titleValidation == null)
            {
                await SendSlackNotification(htmlPage, date, CurrencyCodeEnum.Ars);

                result.AddError("Html error", $"Error getting HTML, not exist currency USD. Check Date {date.ToUniversalTime().ToShortDateString()}.");
                return(result);
            }

            var tableRows   = document.QuerySelectorAll("table > tbody > tr");
            var usdCurrency = GetCurrencyByDate(tableRows, date);

            if (usdCurrency == null)
            {
                Logger.LogInformation("Creating Currency object with No Price.");
                result.Entity = CreateCurrency(date, "0", ServiceSettings.CurrencyCode, "0");

                return(result);
            }

            var columns    = usdCurrency.GetElementsByTagName("td");
            var buyColumn  = columns.ElementAtOrDefault(1);
            var saleColumn = columns.ElementAtOrDefault(2);
            var dateColumn = columns.ElementAtOrDefault(3);

            if (buyColumn != null && saleColumn != null && dateColumn != null)
            {
                Logger.LogInformation("Creating Currency object to returned to the client.");
                result.Entity = CreateCurrency(date, saleColumn.InnerHtml, ServiceSettings.CurrencyCode, buyColumn.InnerHtml);

                return(result);
            }

            await SendSlackNotification(htmlPage, date, CurrencyCodeEnum.Ars);

            result.AddError("Error Bna", "Error getting currency, please check HTML.");
            return(result);
        }
예제 #3
0
        public async Task <EntityOperationResult <User> > Register(User user, string password)
        {
            var result = new EntityOperationResult <User>();

            if (string.IsNullOrWhiteSpace(password))
            {
                result.AddError("Password", "Password is required");
                return(result);
            }

            var userRepeated = await _context.Users.FirstOrDefaultAsync(x => x.Spa.Id == user.SpaId && x.Active && x.Name == user.Name);

            if (userRepeated != null)
            {
                result.AddError("Repeated user", "Username \"" + user.Name + "\" is already taken");
                return(result);
            }

            var spaAssociated = await _context.Spas.FirstOrDefaultAsync(x => x.Id == user.SpaId);

            if (spaAssociated == null)
            {
                result.AddError("Spa", "Spa \"" + user.SpaId + "\" is not already exist");
                return(result);
            }

            CreatePasswordHash(password, out var passwordHash, out var passwordSalt);

            var newUser = new User
            {
                Email        = user.Email,
                Active       = true,
                Name         = user.Name,
                PasswordHash = passwordHash,
                PasswordSalt = passwordSalt,
                SpaId        = user.SpaId
            };

            _context.Users.Add(newUser);
            await _context.SaveChangesAsync();

            return(new EntityOperationResult <User>(newUser));
        }
예제 #4
0
        public async Task GetCurrency_ShouldBeHttpStatusCodeBadRequest_WhenResponseReturnAnError()
        {
            //Arrange
            var result = new EntityOperationResult <CurrencyDto>();

            result.AddError("", "");
            _testServer.CurrencyServiceMock.Setup(x => x.GetCurrencyByCurrencyCodeAndDate(
                                                      It.IsAny <DateTime>(),
                                                      It.IsAny <CurrencyCodeEnum>()))
            .ReturnsAsync(result);

            // Act
            var response = await _client.GetAsync("conversion/Ars/01-02-2012");

            // Assert
            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
예제 #5
0
        public async Task GetCurrency_ShouldBeHttpStatusCodeBadRequest_WhenUrlDoesHaveInvalidCurrencyCode()
        {
            //Arrange
            const string currencyCode = "Test";
            var          result       = new EntityOperationResult <CurrencyDto>();

            result.AddError("Currency code invalid", $"Currency code invalid: {currencyCode}");
            _testServer.CurrencyServiceMock.Setup(x => x.GetCurrencyByCurrencyCodeAndDate(
                                                      It.IsAny <DateTime>(),
                                                      It.IsAny <CurrencyCodeEnum>()))
            .ReturnsAsync(result);

            // Act
            var response = await _client.GetAsync("conversion/TEST/02-02-2020");

            // Assert
            Assert.False(response.IsSuccessStatusCode);
        }
예제 #6
0
        private async Task <EntityOperationResult <CurrencyDto> > GetDataFromHtmlAsync(string htmlPage, DateTime date)
        {
            var result   = new EntityOperationResult <CurrencyDto>();
            var parser   = new HtmlParser();
            var document = parser.ParseDocument(htmlPage);

            try
            {
                var table = document.GetElementsByClassName("Tabla_borde").FirstOrDefault();

                if (table != null)
                {
                    var columns = table.GetElementsByTagName("td");
                    if (columns.Any() && columns.Length == 4)
                    {
                        var columnTime = $"{columns.ElementAtOrDefault(2)?.InnerHtml}";

                        if (columnTime == $"{date:dd-MM-yyyy}")
                        {
                            var saleValue = columns.ElementAtOrDefault(3)?.InnerHtml.Replace(".", ",");
                            result.Entity = CreateCurrency(date, saleValue, ServiceSettings.CurrencyCode);

                            return(result);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                await SendSlackNotification(htmlPage, date, CurrencyCodeEnum.Mxn, e);

                result.AddError("Html Error Mxn currency", "Error getting HTML or date is holiday, please check HTML.");
                return(result);
            }

            //No price for current date
            Logger.LogInformation("Creating Currency object with No Price.");
            result.Entity = CreateCurrency(date, "0", ServiceSettings.CurrencyCode);
            return(result);
        }