SurveyVista/Web/Areas/Admin/Controllers/UsersController.cs
2024-05-09 14:08:10 +02:00

202 lines
7.2 KiB
C#

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<ApplicationUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public UsersController(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
{
_userManager = userManager;
_roleManager = roleManager;
}
public async Task<IActionResult> Index()
{
var users = _userManager.Users.ToList(); // Consider pagination or asynchronous list retrieval if the user list is very large.
var models = new List<RegisterViewModel>();
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<string>.
};
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<IActionResult> 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<IActionResult> DeleteSelected(List<string> 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<IActionResult> 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<IActionResult> 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);
}
}
}