Пример #1
0
        public async Task ExecuteAsync(CreateAccount cmd)
        {
            var validator        = new CreateAccountValidator(_context);
            var validationResult = validator.Validate(cmd);

            CommandHandlerException.ThrowIsNotValid("Ошибочные значения параметров", validationResult);

            var existsAccount = await _context.Accounts.Where(a => a.IP == cmd.IP)
                                .OrderByDescending(a => a.CreatedAt)
                                .FirstOrDefaultAsync();

            var currentDateTime = DateTime.Now;
            var allowedInterval = _config.Value.AllowedIntervalInSeconds;

            if (existsAccount != null && currentDateTime.Subtract(existsAccount.CreatedAt).Seconds < allowedInterval)
            {
                var ex = new CommandHandlerException(403, $"С одного IP разрешено регистрироваться не более одного раза в {allowedInterval} сек.");
                _loggerService.LogError(ex, ex.Message);
                throw ex;
            }

            var account = new Account(currentDateTime,
                                      cmd.IP,
                                      cmd.Email.ToLower(),
                                      _passwordService.GetSha256Hash(cmd.Password),
                                      cmd.Country,
                                      cmd.Province);

            _context.Accounts.Add(account);

            await _context.SaveChangesAsync();

            _domainEventDispatcher.Raise(new CreatedAccountEvent(account));
        }