public static EditUserViewModel ToServiceModel(this SaveUserModel model) { var serviceModel = new EditUserViewModel { Version = model.Version, FirstName = model.FirstName, LastName = model.LastName, UserName = model.UserName, Email = model.Email, Image = { ImageId = model.ImageId }, Password = model.Password, Roles = model.Roles }; return serviceModel; }
public ActionResult SaveUser(EditUserViewModel model) { if (ModelState.IsValid) { var response = GetCommand<SaveUserCommand>().ExecuteCommand(model); if (response != null) { if (model.Id.HasDefaultValue()) { Messages.AddSuccess(UsersGlobalization.SaveUser_CreatedSuccessfully_Message); } return WireJson(true, response); } } return WireJson(false); }
private List<Role> SaveUserRoles(User user, EditUserViewModel request, bool createIfNotExists) { var dbRoles = user.UserRoles ?? new List<UserRole>(); var requestRoles = request.Roles ?? new List<string>(); var createdRoles = new List<Role>(); // Delete removed roles dbRoles .Where(dbRole => requestRoles.All(requestRole => requestRole != dbRole.Role.Name)) .ToList() .ForEach(del => repository.Delete(del)); // Insert new roles var rolesToInsert = requestRoles .Where(requestRole => dbRoles.All(dbRole => requestRole != dbRole.Role.Name)) .ToList(); if (rolesToInsert.Count > 0) { var roles = repository .AsQueryable<Role>(role => rolesToInsert.Contains(role.Name)) .ToList(); if (createIfNotExists) { foreach (var roleName in rolesToInsert.Where(rr => roles.All(r => r.Name != rr)).ToList()) { var role = new Role { Name = roleName }; createdRoles.Add(role); roles.Add(role); repository.Save(role); } } rolesToInsert.ForEach(roleName => repository.Save(new UserRole { User = user, Role = roles.Where(role => role.Name == roleName).FirstOne() })); } return createdRoles; }
private void ValidateUser(EditUserViewModel model) { var userName = model.UserName.Trim(); var existIngId = repository .AsQueryable<User>(c => c.UserName == userName && c.Id != model.Id) .Select(r => r.Id) .FirstOrDefault(); if (!existIngId.HasDefaultValue()) { var message = string.Format(UsersGlobalization.SaveUse_UserNameExists_Message, model.UserName); var logMessage = string.Format("Failed to update user profile. User Name already exists. User Name: {0}, User Email: {1}, Id: {2}", model.UserName, model.Email, model.Id); throw new ValidationException(() => message, logMessage); } var email = model.Email.Trim(); existIngId = repository .AsQueryable<User>(c => c.Email == email && c.Id != model.Id) .Select(r => r.Id) .FirstOrDefault(); if (!existIngId.HasDefaultValue()) { var message = string.Format(UsersGlobalization.SaveUse_UserEmailExists_Message, model.Email); var logMessage = string.Format("Failed to update user profile. User Email already exists. User Name: {0}, User Email: {1}, Id: {2}", model.UserName, model.Email, model.Id); throw new ValidationException(() => message, logMessage); } }
/// <summary> /// Saves the user. /// </summary> /// <param name="model">The model.</param> /// <param name="treatNullsAsLists">if set to <c>true</c> treat null lists as empty lists.</param> /// <param name="createIfNotExists">if set to <c>true</c> create if not exists.</param> /// <returns> /// Saved user entity /// </returns> public User SaveUser(EditUserViewModel model, bool treatNullsAsLists = true, bool createIfNotExists = false) { ValidateUser(model); User user = null; var isNew = model.Id.HasDefaultValue(); if (!isNew) { user = repository .AsQueryable<User>() .Where(u => u.Id == model.Id) .FetchMany(u => u.UserRoles) .ThenFetch(ur => ur.Role) .ToList() .FirstOrDefault(); isNew = user == null; if (isNew & !createIfNotExists) { throw new EntityNotFoundException(typeof(User), model.Id); } } if (isNew) { user = new User { Id = model.Id }; if (string.IsNullOrWhiteSpace(model.Password)) { var message = UsersGlobalization.CreateUser_Password_IsRequired; var logMessage = string.Format("{0}, UserName: {1}, Email: {2}", message, model.UserName, model.Email); throw new ValidationException(() => message, logMessage); } } unitOfWork.BeginTransaction(); if (model.Version > 0) { user.Version = model.Version; } user.UserName = model.UserName; user.FirstName = model.FirstName; user.LastName = model.LastName; user.Email = model.Email; if (!string.IsNullOrWhiteSpace(model.Password)) { var salt = authenticationService.GeneratePasswordSalt(); user.Password = authenticationService.CreatePasswordHash(model.Password, salt); user.Salt = salt; } if (model.Image != null && model.Image.ImageId.HasValue) { user.Image = repository.AsProxy<MediaImage>(model.Image.ImageId.Value); } else { user.Image = null; } // Set null list as empty if (treatNullsAsLists) { model.Roles = model.Roles ?? new string[0]; } List<Role> createdRoles = null; if (model.Roles != null) { createdRoles = SaveUserRoles(user, model, createIfNotExists); } repository.Save(user); unitOfWork.Commit(); // Notify. if (createdRoles != null) { createdRoles.ForEach(Events.UserEvents.Instance.OnRoleCreated); } if (isNew) { Events.UserEvents.Instance.OnUserCreated(user); } else { Events.UserEvents.Instance.OnUserUpdated(user); } return user; }