public async Task <ActionResult> Update(UserEditorVM vm) { if (!ModelState.IsValid) { return(await ViewUpdateFormAsync(vm)); } try { if (vm.CreatePersonalPage && await _users.CanCreatePersonalPageAsync(vm)) { var page = await _pages.CreateDefaultUserPageAsync(vm, User); vm.PersonalPageId = page.Id; vm.CreatePersonalPage = false; } await _users.UpdateAsync(vm, User); await _db.SaveChangesAsync(); return(RedirectToSuccess("Пользователь обновлен")); } catch (ValidationException ex) { SetModelState(ex); return(await ViewUpdateFormAsync(vm)); } }
/// <summary> /// Performs additional checks on the request. /// </summary> private async Task ValidateUpdateRequestAsync(UserEditorVM request) { var val = new Validator(); var emailUsed = await _db.Users .AnyAsync(x => x.Id != request.Id && x.Email == request.Email); if (emailUsed) { val.Add(nameof(request.Email), "Адрес почты уже используется другим пользователем"); } if (request.PersonalPageId != null) { var exists = await _db.Pages .AnyAsync(x => x.Id == request.PersonalPageId); if (!exists) { val.Add(nameof(request.PersonalPageId), "Страница не существует"); } } val.ThrowIfInvalid(); }
/// <summary> /// Checks if the personal page should be created for this user. /// </summary> public async Task <bool> CanCreatePersonalPageAsync(UserEditorVM vm) { return(await _db.Users .Where(x => x.Id == vm.Id) .Select(x => x.Page == null) .FirstOrDefaultAsync()); }
/// <summary> /// Updates the user. /// </summary> public async Task <AppUser> UpdateAsync(UserEditorVM request, ClaimsPrincipal currUser) { await ValidateUpdateRequestAsync(request); var user = await _db.Users .GetAsync(x => x.Id == request.Id, "Пользователь не найден"); _mapper.Map(request, user); user.IsValidated = true; if (!IsSelf(request.Id, currUser)) { var allRoles = await _userMgr.GetRolesAsync(user); await _userMgr.RemoveFromRolesAsync(user, allRoles); var role = request.Role.ToString(); await _userMgr.AddToRoleAsync(user, role); } if (request.IsLocked && user.LockoutEnd == null) { user.LockoutEnd = DateTimeOffset.MaxValue; } else if (!request.IsLocked && user.LockoutEnd != null) { user.LockoutEnd = null; } return(user); }
/// <summary> /// Displays the UpdateUser form. /// </summary> private async Task <ActionResult> ViewUpdateFormAsync(UserEditorVM vm) { var canCreate = await _users.CanCreatePersonalPageAsync(vm); var pageItems = await GetPageItemsAsync(vm.PersonalPageId); ViewBag.Data = new UserEditorDataVM { IsSelf = _users.IsSelf(vm.Id, User), UserRoleItems = ViewHelper.GetEnumSelectList(vm.Role), CanCreatePersonalPage = canCreate, PageItems = pageItems }; return(View("Update", vm)); }
/// <summary> /// Updates the user. /// </summary> public async Task <AppUser> UpdateAsync(UserEditorVM request, ClaimsPrincipal currUser) { await ValidateUpdateRequestAsync(request); var user = await _db.Users .GetAsync(x => x.Id == request.Id, "Пользователь не найден"); _mapper.Map(request, user); user.IsValidated = true; if (!IsSelf(request.Id, currUser)) { var allRoles = EnumHelper.GetEnumValues <UserRole>().Select(x => x.ToString()); await _userMgr.RemoveFromRolesAsync(user, allRoles); var role = request.Role.ToString(); await _userMgr.AddToRoleAsync(user, role); } return(user); }
/// <summary> /// Returns the select list for a page picker. /// </summary> private async Task <IReadOnlyList <SelectListItem> > GetPageItemsAsync(UserEditorVM vm) { if (vm.PersonalPageId != null) { var page = await _db.Pages .Where(x => x.Id == vm.PersonalPageId) .Select(x => x.Title) .FirstOrDefaultAsync(); if (!string.IsNullOrEmpty(page)) { return new[] { new SelectListItem(page, vm.PersonalPageId.Value.ToString(), true) } } ; } return(Array.Empty <SelectListItem>()); } #endregion }
/// <summary> /// Checks if the personal page can be created for this user. /// </summary> public async Task <bool> CanCreatePersonalPageAsync(UserEditorVM vm) { return(await _db.Users .Where(x => x.Id == vm.Id && x.Page == null) .AnyAsync()); }