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; } }