public async Task HandleAsync(SignIn command)
        {
            var user = await _userRepository.GetByNameAsync(command.Name);

            if (user is null || !_passwordService.IsValid(user.Password, command.Password))
            {
                _logger.LogError($"User with name: {command.Name} was not found.");
                throw new InvalidCredentialsException(command.Name);
            }

            if (user.Locked)
            {
                throw new UserLockedException(user.Id);
            }

            var claims = user.Permissions.Any()
                ? new Dictionary <string, IEnumerable <string> >
            {
                ["permissions"] = user.Permissions
            }
                : null;
            var auth = _jwtProvider.Create(user.Id, user.Name, user.Role, claims: claims);

            auth.RefreshToken = await CreateRefreshTokenAsync(user.Id);

            _storage.Set(command.Id, auth);
            _logger.LogInformation($"User with ID: {user.Id} has been authenticated.");
            await _messageBroker.PublishAsync(new SignedIn(user.Id));
        }
        public async Task HandleAsync(UseRefreshToken command)
        {
            var token = await _refreshTokenRepository.GetAsync(command.RefreshToken);

            if (token is null)
            {
                throw new InvalidRefreshTokenException();
            }

            if (token.Revoked)
            {
                throw new RevokedRefreshTokenException();
            }

            var user = await _userRepository.GetAsync(token.UserId);

            if (user is null)
            {
                throw new UserNotFoundException(token.UserId);
            }

            var claims = user.Permissions.Any()
                ? new Dictionary <string, IEnumerable <string> >
            {
                ["permissions"] = user.Permissions
            }
                : null;
            var auth = _jwtProvider.Create(token.UserId, user.Name, user.Role, claims: claims);

            auth.RefreshToken = command.RefreshToken;
            _storage.Set(command.Id, auth);
        }