using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Model; using System.Security.Claims; using Web.ViewModel.AccountVM; namespace Web.Areas.Admin.Controllers { public class UsersController : Controller { private readonly UserManager _userManager; private readonly RoleManager _roleManager; public UsersController(UserManager userManager, RoleManager roleManager) { _userManager = userManager; _roleManager = roleManager; } public async Task Index() { var users = _userManager.Users.ToList(); // Consider pagination or asynchronous list retrieval if the user list is very large. var models = new List(); foreach (var user in users) { var roles = await _userManager.GetRolesAsync(user); // Await the asynchronous call to get roles. var model = new RegisterViewModel { Id=user.Id, Email = user.Email, FirstName = user.FirstName, // Assuming these fields are in ApplicationUser LastName = user.LastName, SelectedRoles = roles.ToList() // Now roles is properly awaited and converted to List. }; models.Add(model); } return View(models); } public IActionResult Register() { var model = new RegisterViewModel { Roles = _roleManager.Roles.Select(r => new SelectListItem { Value = r.Name, Text = r.Name }).ToList() }; return View(model); } [HttpPost] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model) { if (ModelState.IsValid) { // Check if the email already exists var existingUser = await _userManager.FindByEmailAsync(model.Email); if (existingUser != null) { ModelState.AddModelError("Email", "A user with this email already exists."); model.Roles = _roleManager.Roles.Select(r => new SelectListItem { Value = r.Name, Text = r.Name }).ToList(); return View(model); } var user = new ApplicationUser { UserName = model.Email, // Consider using a different username convention if emails and usernames are distinct Email = model.Email, FirstName = model.FirstName, LastName = model.LastName }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { // Assign roles to the user foreach (var role in model.SelectedRoles) { await _userManager.AddToRoleAsync(user, role); } return RedirectToAction(nameof(Index)); // Redirect after successful registration } // If there are errors during the creation, add them to the ModelState foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } } // Refresh the roles list for the form in case of an error model.Roles = _roleManager.Roles.Select(r => new SelectListItem { Value = r.Name, Text = r.Name }).ToList(); return View(model); } [HttpPost] [ValidateAntiForgeryToken] public async Task DeleteSelected(List selectedUserIds) { if (selectedUserIds != null && selectedUserIds.Count > 0) { foreach (var userId in selectedUserIds) { var user = await _userManager.FindByEmailAsync(userId); if (user != null) { var result = await _userManager.DeleteAsync(user); // Optionally handle each result } } // Consider adding a TempData or ViewBag message for success or failure } return RedirectToAction(nameof(Index)); } [HttpGet] public async Task Edit(string id) { var user = await _userManager.FindByIdAsync(id); if (user == null) { return NotFound($"Unable to load user with ID '{id}'."); } var userRoles = await _userManager.GetRolesAsync(user); var allRoles = _roleManager.Roles.ToList(); var viewModel = new EditUserViewModel { Id = user.Id, FirstName = user.FirstName, LastName = user.LastName, SelectedRoles = userRoles.ToList(), Roles = allRoles.Select(role => new SelectListItem { Value = role.Name, Text = role.Name, Selected = userRoles.Contains(role.Name) }).ToList() }; return View(viewModel); } [HttpPost] [ValidateAntiForgeryToken] public async Task Edit(EditUserViewModel model) { var user = await _userManager.FindByIdAsync(model.Id); if (user == null) { ViewBag.ErrorMessage = $"User with Id = {model.Id} cannot be found"; return View("NotFound"); } // Update user properties except for email user.FirstName = model.FirstName; user.LastName = model.LastName; var result = await _userManager.UpdateAsync(user); if (result.Succeeded) { // Handling role updates var roles = await _userManager.GetRolesAsync(user); var resultRemove = await _userManager.RemoveFromRolesAsync(user, roles); if (!resultRemove.Succeeded) { ModelState.AddModelError("", "Cannot remove user existing roles"); return View(model); } var resultAdd = await _userManager.AddToRolesAsync(user, model.SelectedRoles); if (!resultAdd.Succeeded) { ModelState.AddModelError("", "Cannot add selected roles to user"); return View(model); } return RedirectToAction("Index"); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } model.Roles = _roleManager.Roles.Select(r => new SelectListItem { Value = r.Name, Text = r.Name }).ToList(); return View(model); } } }