public async Task AddClientLogin(string providerId, string userId, ProviderClientLogin login)
        {
            var q = _builder
                    .Eq(x => x.Id, providerId)
                    .Match(x => x.Clients, x => x.UserId == userId)
                    .UpdatePush(x => x.Clients[-1].Logins, login);

            await UpdateByQuery(q);
        }
        public async Task <UserPorviderProofResponseModel> LoginProof(string providerToken, string userToken)
        {
            var provider = await _repositoryProvider.GetByToken(providerToken);

            if (provider == null)
            {
                throw new MRException <object>(-1, "Wrong provider token");
            }

            (var providerId, var userId) = ProviderTokenGenerator.DecryptToken(userToken);

            if (!provider.Id.Equals(providerId))
            {
                throw new MRException <object>(-1, "Wrong provider token");
            }

            var user = await _repositoryUser.GetFirst(x => x.Id == userId && x.State == MREntityState.Active);

            if (user == null)
            {
                throw new MRException <object>(-1, "User not found");
            }

            var providerLogin = new ProviderClientLogin
            {
                ProviderToken = providerToken,
                ClientToken   = userToken,
                Time          = DateTime.UtcNow
            };

            if (provider.Clients == null)
            {
                provider.Clients = new List <ProviderClient>();
                await _repositoryProvider.Replace(provider);
            }

            var providerClient = provider.Clients.FirstOrDefault(x => x.UserId == user.Id);

            if (providerClient == null)
            {
                providerClient = new ProviderClient
                {
                    UserId = user.Id,
                    Email  = user.Email,
                    Roles  = provider.Options.DefaultRoles,
                    Logins = new List <ProviderClientLogin> {
                        providerLogin
                    }
                };

                provider.Clients.Add(providerClient);

                await _repositoryProvider.AddClient(provider.Id, providerClient);
            }
            else
            {
                await _repositoryProvider.AddClientLogin(provider.Id, providerClient.UserId, providerLogin);
            }

            var model = _mapper.Map <UserPorviderProofResponseModel>(user);

            model.Roles            = providerClient.Roles;
            model.IsEmailConfirmed = await _managerUser.IsEmailConfirmedAsync(user);

            model.IsEmailOnChange = await _repositoryEmailChangeUnit.Any(x => x.UserId == user.Id && x.Status == Infrastructure.Entity.Enum.EmailChangeResult.NEW);

            return(model);
        }