public async Task <bool> Execute(string emailChangeRecordId)
        {
            EmailChangeRecord record  = null;
            Account           account = null;

            try
            {
                //Get record
                record = await _emailChangeRecordRepo.Find(x => x.RecordId == emailChangeRecordId && x.Status == EmailChangeRecordSatus.Changed).SingleOrDefaultAsync();

                if (record == null)
                {
                    return(false);
                }

                //Get account
                account = await _accountRepo.Find(x => x.AccountId == record.AccountId).SingleOrDefaultAsync();

                if (account == null)
                {
                    throw new NullReferenceException("Account for given given EmailChangeRecord was not found");
                }

                //Update account's email and email status
                await _accountRepo.UpdateOneAsync(x => x.AccountId == record.AccountId, AccountUpdateDef(record.OldEmail));

                //Update email change record
                await _emailChangeRecordRepo.UpdateOneAsync(x => x.RecordId == emailChangeRecordId, RecordUpdateDef());

                //Publish an event
                await Publish(new AccountEmailChangeUndoEvent()
                {
                    CorrelationId = Guid.NewGuid().ToString("N"),
                    Issuer        = "AuthServer.UserSystem.Services.Commands",
                    IssuerSystem  = "AuthServer.UserSystem",
                    EventDate     = DateTime.Now,

                    AccountId = account.AccountId,
                    Username  = account.Username,
                    Email     = record.OldEmail
                });

                return(true);
            }
            catch (Exception ex)
            {
                //Log exception
                await _logger.LogErrorAsync("UndoChangeAccountEmailCommand.Execute", "Exception occurred", new
                {
                    EmailChangeRecordId = emailChangeRecordId,
                    EmailChangeRecord   = record,
                    Exception           = ex
                });

                //rethrow
                throw;
            }
        }
        public async Task Execute(string accountId, ChangeEmailModel model, IValidator validator)
        {
            try
            {
                //Validation
                _validationStrategy.Validate(model, validator);
                if (validator.HasErrors)
                {
                    return;
                }

                //Check email existence
                if (await _accountRepo.CountDocumentsAsync(x => x.Email == model.NewEmail) != 0)
                {
                    validator.AddError("Email already exists");
                    return;
                }

                //Get account from db
                var     accountFilter = AccountFilterDefinition(accountId);
                Account account       = await _accountRepo.Find(accountFilter).SingleOrDefaultAsync();

                if (account == null)
                {
                    validator.AddError("Account not found");
                    return;
                }

                //string oldEmail = account.Email;

                //Update account in db
                _accountRepo.UpdateOne(accountFilter, AccountUpdateDefinition(model.NewEmail));

                //Create and save EmailChangeRecord
                EmailChangeRecord emailChangeRecord = new EmailChangeRecord()
                {
                    RecordId   = Guid.NewGuid().ToString("n"),
                    AccountId  = account.AccountId,
                    OldEmail   = account.Email,
                    NewEmail   = model.NewEmail,
                    Status     = EmailChangeRecordSatus.Changed,
                    CreateDate = DateTime.Now
                };
                _emailChangeRecordRepo.InsertOne(emailChangeRecord);

                //Publish AccountEmailChangedEvent
                await Publish(CreateEvent(model.NewEmail, account, emailChangeRecord.RecordId));

                //Execute confirmation strategy for new email
                await _emailConfirmationStrategy.ImplementConfirmation(account.AccountId);

                return;
            }
            catch (Exception ex)
            {
                //Log exception
                await _logger.LogErrorAsync("ChangeAccountEmailCommand.Execute", "Exception occurred", new
                {
                    ChangeEmailModel = model,
                    Exception        = ex
                });

                //rethrow
                throw;
            }
        }