public static UserEntityModel ToEntityModel(this User user, IMediaService mediaService, MediaSettings mediaSettings) { var userCoverId = user.GetPropertyValueAs<int>(PropertyNames.DefaultCoverId); var userProfileImageId = user.GetPropertyValueAs<int>(PropertyNames.DefaultPictureId); var model = new UserEntityModel() { Id = user.Id, FirstName = user.FirstName, LastName = user.LastName, Name = user.Name, UserName = user.UserName, Email = user.Email, Active = user.Active, Remarks = user.Remarks, RoleIds = user.UserRoles.Select(x => x.RoleId).ToList(), LastLoginDateUtc = user.LastLoginDate, LastLoginDateLocal = DateTimeHelper.GetDateInUserTimeZone(user.LastLoginDate, DateTimeKind.Utc, user), CoverImageId = userCoverId, ProfileImageId = userProfileImageId }; model.CoverImageUrl = userCoverId == 0 ? mediaSettings.DefaultUserProfileCoverUrl : mediaService.GetPictureUrl(userCoverId, PictureSizeNames.MediumCover); model.ProfileImageUrl = userProfileImageId == 0 ? mediaSettings.DefaultUserProfileImageUrl : mediaService.GetPictureUrl(userProfileImageId, PictureSizeNames.MediumProfileImage); return model; }
public IHttpActionResult Post(UserEntityModel entityModel) { User user; user = entityModel.Id == 0 ? new User() : _userService.Get(entityModel.Id); if (user == null) return NotFound(); //check if the email has already been registered var emailUser = _userService.Get(x => x.Email == entityModel.Email, null).FirstOrDefault(); if (emailUser != null && emailUser.Id != user.Id) { VerboseReporter.ReportError("The email is already registered with another user", "post_user"); return RespondFailure(); } //same for user name if (_userSettings.AreUserNamesEnabled) { var userNameUser = _userService.Get(x => x.UserName == entityModel.UserName, null).FirstOrDefault(); if (userNameUser != null && userNameUser.Id != user.Id) { VerboseReporter.ReportError("The username is already taken by another user", "post_user"); return RespondFailure(); } } //we should have at least one role if (entityModel.RoleIds.Count == 0) { VerboseReporter.ReportError("At least one role must be assigned to the user", "post_user"); return RespondFailure(); } //is this a new user, we'll require password if (string.IsNullOrEmpty(entityModel.Password) && entityModel.Id == 0) { VerboseReporter.ReportError("You must specify the password for the user", "post_user"); return RespondFailure(); } //are passwords same? if (string.Compare(entityModel.Password, entityModel.ConfirmPassword, StringComparison.Ordinal) != 0) { VerboseReporter.ReportError("The passwords do not match", "post_user"); return RespondFailure(); } user.FirstName = entityModel.FirstName; user.LastName = entityModel.LastName; user.Email = entityModel.Email; user.Remarks = entityModel.Remarks; user.Active = entityModel.Active; user.DateUpdated = DateTime.UtcNow; user.Name = string.Concat(user.FirstName, " ", user.LastName); user.UserName = entityModel.UserName; if (entityModel.Id == 0) { user.Password = entityModel.Password; _userRegistrationService.Register(user, _securitySettings.DefaultPasswordStorageFormat); } else { if (!string.IsNullOrEmpty(entityModel.Password)) // update password if provided { if (string.IsNullOrEmpty(user.PasswordSalt)) user.PasswordSalt = _cryptographyService.CreateSalt(8); user.Password = _cryptographyService.GetHashedPassword(entityModel.Password, user.PasswordSalt, _securitySettings.DefaultPasswordStorageFormat); } _userService.Update(user); } //assign the roles now var roles = _roleService.Get(x => x.IsActive); //current roles var currentRoleIds = user.UserRoles.Select(x => x.RoleId).ToList(); //roles to unassign var rolesToUnassign = currentRoleIds.Except(entityModel.RoleIds); foreach (var roleId in rolesToUnassign) { var role = roles.FirstOrDefault(x => x.Id == roleId); if(role == null) continue; _roleService.UnassignRoleToUser(role, user); } //roles to assign var rolesToAssign = entityModel.RoleIds.Except(currentRoleIds); foreach (var roleId in rolesToAssign) { var role = roles.FirstOrDefault(x => x.Id == roleId); if (role == null) continue; _roleService.AssignRoleToUser(role, user); } //any images to assign if(entityModel.CoverImageId != 0) user.SetPropertyValue(PropertyNames.DefaultCoverId, entityModel.CoverImageId); if(entityModel.ProfileImageId != 0) user.SetPropertyValue(PropertyNames.DefaultPictureId, entityModel.ProfileImageId); VerboseReporter.ReportSuccess("User saved successfully", "post_user"); return RespondSuccess(new { User = user.ToEntityModel(_mediaService, _mediaSettings) }); }