public async Task <IHttpActionResult> Register(CreateRegiUser model) { var canRegister = await GetRegisterEnabled(); if (!canRegister) { return(BadRequest("registration disabled")); } if (!ModelState.IsValid) { return(BadRequest(ModelState)); } // Validate custom fields var fields = await _fieldsStore.GetCustomUserFields(); var errors = ValidateCustomUserFields(model.CustomFields, fields); if (errors.Any()) { AddErrors(errors); return(BadRequest(ModelState)); } // Create account var user = new RegiAuthUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); // Any errors in UserManager (such as duplicate email or insufficient password strength) if (!result.Succeeded) { AddErrors(result); return(BadRequest(ModelState)); } // Get created account var userModel = await UserManager.FindByEmailAsync(model.Email); // Store custom user data var fieldsTasks = fields.Where(f => model.CustomFields.Any(m => m.Name == f.Name)) .Select(field => new CustomUserValue { FieldId = field.Id, Value = model.CustomFields.Single(f => f.Name == field.Name).Value }).Select(value => _fieldsStore.AddFieldValueForUser(userModel, value)); await Task.WhenAll(fieldsTasks); // Send an email confirmation code var code = await UserManager.GenerateEmailConfirmationTokenAsync(userModel.Id); var body = EmailContentWriter.ConfirmEmail(user.Email, code); try { await UserManager.SendEmailAsync(userModel.Id, EmailContentWriter.ConfirmEmailSubject, body); } catch (CouldNotSendEmailException) { return(BadRequest("Could not send email")); } return(Ok()); }
public async Task <IHttpActionResult> UpdateCustomFields(IList <CreateCustomUserFieldModel> models) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (models == null) { return(BadRequest()); } // Read existing fields from database var existingFields = await _fieldStore.GetCustomUserFields(); // Store lists for database interraction var update = new List <CustomUserField>(); var create = new List <CustomUserField>(); var names = new List <string>(); var errors = new List <string>(); foreach (var model in models) { var validation = new CustomUserValidation(model.Validation); // Ensure the field names are unique if (names.Contains(model.Name)) { var errMsg = $"Duplicate Field name: {model.Name}"; // Avoid duplicate errors if more than two fields share a name if (!errors.Contains(errMsg)) { errors.Add(errMsg); } } else { names.Add(model.Name); } // Creating a new field if (model.Id == 0) { var field = CustomUserField.GetFieldForType(model.Type); field.Name = model.Name; field.Type = model.Type; field.Required = model.Required; if (field.SetValidationProperties(validation)) { create.Add(field); } else { errors.Add($"Invalid Field Valididation for {model.Name}"); } } // Edit an existing field else { var field = existingFields.SingleOrDefault(f => f.Id == model.Id); if (field == null) { errors.Add($"Cannot find existing field, ID: {model.Id}"); continue; } if (field.Type != model.Type) { errors.Add($"Cannot change type of {field.Name} ({field.Id})"); continue; } // Update editable properties field.Name = model.Name; field.Required = model.Required; if (field.SetValidationProperties(validation)) { update.Add(field); } else { errors.Add($"Invalid Field Valididation for {model.Name}"); } } } // Error reading fields, return invalid if (errors.Any()) { foreach (var error in errors) { ModelState.AddModelError("", error); } return(BadRequest(ModelState)); } // Any fields omitted must have been deleted var delete = existingFields.Where(f => !create.Contains(f)).Where(f => !update.Contains(f)).ToList(); // Sanity checks if (create.Count + update.Count != models.Count) { return(InternalServerError()); } if (update.Count + delete.Count != existingFields.Count) { return(InternalServerError()); } // Run synchronously to avoid any uniqueness conflicts and race conditions foreach (var d in delete) { await _fieldStore.DeleteCustomUserField(d); } foreach (var u in update) { await _fieldStore.UpdateCustomUserField(u); } foreach (var c in create) { await _fieldStore.CreateCustomUserField(c); } // Update User View with custom fields (columns) await _fieldStore.UpdateUserView(); return(Ok()); }