public async Task <IActionResult> IndexConfirmationPost(SignUpConfirmationViewModel model) { // Ensure default shell, We cannot sign-up from tenants if (!_shellSettings.IsDefaultShell()) { return(Unauthorized()); } // Validate if (model == null) { throw new ArgumentNullException(nameof(model)); } if (string.IsNullOrEmpty(model.SessionId)) { throw new ArgumentNullException(nameof(model.SessionId)); } if (string.IsNullOrEmpty(model.SecurityToken)) { throw new ArgumentNullException(nameof(model.SecurityToken)); } if (!ModelState.IsValid) { return(View(model)); } // Get the sign-up var signUp = await _signUpStore.GetBySessionIdAsync(model.SessionId); // Ensure we found the sign-up if (signUp == null) { return(NotFound()); } // Validate token var validToken = signUp.SecurityToken.Equals(model.SecurityToken, StringComparison.OrdinalIgnoreCase); if (validToken) { // Reset security token & mark email as confirmed signUp.SecurityToken = string.Empty; signUp.EmailConfirmed = true; await _signUpStore.UpdateAsync(signUp); // Redirect to sign-up confirmation return(RedirectToAction(nameof(SetUp), new RouteValueDictionary() { ["sessionId"] = signUp.SessionId })); } // The confirmation code is incorrect ViewData.ModelState.AddModelError(string.Empty, "The confirmation code is incorrect. Please try again!"); return(await IndexConfirmation(signUp.SessionId)); }
public async Task <ICommandResult <Models.SignUp> > CreateAsync(Models.SignUp model) { var result = new CommandResult <Models.SignUp>(); // Validate if (model.Id > 0) { return(result.Failed(new CommandError($"{nameof(model.Id)} cannot be greater than zero when creating a sign-up"))); } if (string.IsNullOrEmpty(model.Email)) { return(result.Failed("An email address is required!")); } // Do we have an email if (!string.IsNullOrEmpty(model.Email)) { // Validate email var validationResult = await _signUpValidator.ValidateEmailAsync(model.Email); if (!validationResult.Succeeded) { return(result.Failed(validationResult.Errors.ToArray())); } } // Do we have a company name? if (!string.IsNullOrEmpty(model.CompanyName)) { // Validate company name var validationResult = await _signUpValidator.ValidateCompanyNameAsync(model.CompanyName); if (!validationResult.Succeeded) { return(result.Failed(validationResult.Errors.ToArray())); } // Create company name alias model.CompanyNameAlias = _aliasCreator.Create(model.CompanyName); } // Create security token if (string.IsNullOrEmpty(model.SecurityToken)) { // Build simple security token model.SecurityToken = _keyGenerator.GenerateKey(o => { o.OnlyDigits = true; o.MaxLength = 6; }); } // Invoke SignUpCreating subscriptions foreach (var handler in _broker.Pub <Models.SignUp>(this, "SignUpCreating")) { model = await handler.Invoke(new Message <Models.SignUp>(model, this)); } var signUp = await _signUpStore.CreateAsync(model); if (signUp != null) { // Set unique session id, using primary key to ensure uniqueness if (string.IsNullOrEmpty(signUp.SessionId)) { // Set sessionId signUp.SessionId = _keyGenerator.GenerateKey(o => { o.OnlyDigits = false; o.UniqueIdentifier = signUp.Id.ToString(); o.MaxLength = 150; }); // Persist sessionId var updatedSignUp = await _signUpStore.UpdateAsync(signUp); if (updatedSignUp != null) { // Invoke SignUpCreated subscriptions foreach (var handler in _broker.Pub <Models.SignUp>(this, "SignUpCreated")) { updatedSignUp = await handler.Invoke(new Message <Models.SignUp>(updatedSignUp, this)); } // Return success return(result.Success(updatedSignUp)); } } } return(result.Failed(new CommandError("An unknown error occurred whilst attempting to create a sign-up"))); }