public static OAuthClaimsParser Create(ExternalLoginType externalLoginType, ClaimsIdentity claimsIdentity)
 {
     switch (externalLoginType)
     {
         case ExternalLoginType.Facebook:
             return new FacebookOAuthClaimsParser(claimsIdentity);
         case ExternalLoginType.Google:
             return new OAuthClaimsParser(claimsIdentity);
         case ExternalLoginType.Vkontakte:
             return new VkontakteOAuthCLaimsParser(claimsIdentity);
         default:
             throw new ArgumentOutOfRangeException(nameof(externalLoginType), externalLoginType, null);
     }
 }
        public UserDto GetUserByExtenalLogin(string externalKey, ExternalLoginType externalLoginType)
        {
            using (var context = new PicturesDbContext())
            {
                var user =
                    context.Logins.FirstOrDefault(
                        i => i.ExternalUserId == externalKey && i.LoginType == externalLoginType);

                if (user == null)
                    return null;

                return user.User.CreateUserDto(user.User.Logins);
            }
        }
        public async Task<User> CreateExternalUser(string externalUserId, string firstName, string lastName, string photoRec, ExternalLoginType externalLoginType, string email)
        {
            var newUser = await _userDataAccess.AddNewUser(new NewUserCommandDto
            {   
                ExternalLoginId = externalUserId,
                LoginType = externalLoginType,
                FirstName = firstName,
                LastName = lastName,
                Login = externalUserId,
                Password = null,
                PhotoRec = photoRec,
                Email = email
            });

            return _userDataAccess.GetUserByExtenalLogin(externalUserId, externalLoginType).CreateAccountEntity();
        }
        public bool ValidateExternalUser(string externalUserId, ExternalLoginType externalLoginType)
        {
            var user = _userDataAccess.GetUserByExtenalLogin(externalUserId, externalLoginType);

            return user != null;
        }
        public User GetExternalUserByLogin(ExternalLoginType provider, string userLogin)
        {
            var user = _userDataAccess.GetUserByExtenalLogin(userLogin, provider);

            return user?.CreateAccountEntity();
        }
        public bool ValidateExternalUser(string externalUserId, string firstName, string lastName, string photoRec, ExternalLoginType externalLoginType)
        {
            var externalUser = _userDataAccess.GetUserByExtenalLogin(externalUserId, externalLoginType);
            if (externalUser != null)
            {
                _userDataAccess.UpdateExternalLoginValues(externalUser, firstName, lastName, photoRec);
                return true;
            }

            return false;
        }