Initial Commit

This commit is contained in:
2026-03-01 15:14:42 -04:00
commit f60174625e
377 changed files with 98166 additions and 0 deletions

View File

@@ -0,0 +1,210 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SportsDivision.Application.DTOs;
using SportsDivision.Application.Interfaces;
using SportsDivision.Infrastructure.Identity;
namespace SportsDivision.Web.Controllers;
[Authorize(Roles = "Admin")]
public class UserManagementController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
private readonly ISchoolService _schoolService;
public UserManagementController(
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
ISchoolService schoolService)
{
_userManager = userManager;
_roleManager = roleManager;
_schoolService = schoolService;
}
public async Task<IActionResult> Index(string? role, bool? isActive)
{
var users = await _userManager.Users.ToListAsync();
var schools = await _schoolService.GetAllAsync();
var schoolLookup = schools.ToDictionary(s => s.SchoolId, s => s.Name);
var userDtos = new List<UserDto>();
foreach (var user in users)
{
var roles = await _userManager.GetRolesAsync(user);
var dto = new UserDto
{
Id = user.Id,
Email = user.Email ?? string.Empty,
FirstName = user.FirstName,
LastName = user.LastName,
FullName = user.FullName,
Role = roles.FirstOrDefault() ?? "None",
SchoolId = user.SchoolId,
SchoolName = user.SchoolId.HasValue && schoolLookup.TryGetValue(user.SchoolId.Value, out var name) ? name : null,
IsActive = user.IsActive
};
userDtos.Add(dto);
}
if (!string.IsNullOrEmpty(role))
{
userDtos = userDtos.Where(u => u.Role == role).ToList();
}
if (isActive.HasValue)
{
userDtos = userDtos.Where(u => u.IsActive == isActive.Value).ToList();
}
ViewBag.Roles = await _roleManager.Roles.Select(r => r.Name).ToListAsync();
ViewBag.SelectedRole = role;
ViewBag.SelectedIsActive = isActive;
return View(userDtos);
}
[HttpGet]
public async Task<IActionResult> Create()
{
await PopulateDropdowns();
return View(new UserCreateDto());
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(UserCreateDto dto)
{
if (!ModelState.IsValid)
{
await PopulateDropdowns();
return View(dto);
}
var user = new ApplicationUser
{
UserName = dto.Email,
Email = dto.Email,
FirstName = dto.FirstName,
LastName = dto.LastName,
SchoolId = dto.SchoolId,
IsActive = true,
EmailConfirmed = true
};
var result = await _userManager.CreateAsync(user, dto.Password);
if (!result.Succeeded)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
await PopulateDropdowns();
return View(dto);
}
if (!string.IsNullOrEmpty(dto.Role))
{
await _userManager.AddToRoleAsync(user, dto.Role);
}
TempData["SuccessMessage"] = "User created successfully.";
return RedirectToAction(nameof(Index));
}
[HttpGet]
public async Task<IActionResult> Edit(string id)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null) return NotFound();
var roles = await _userManager.GetRolesAsync(user);
var dto = new UserUpdateDto
{
Id = user.Id,
FirstName = user.FirstName,
LastName = user.LastName,
Role = roles.FirstOrDefault() ?? string.Empty,
SchoolId = user.SchoolId,
IsActive = user.IsActive
};
ViewBag.Email = user.Email;
await PopulateDropdowns();
return View(dto);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(UserUpdateDto dto)
{
if (!ModelState.IsValid)
{
var u = await _userManager.FindByIdAsync(dto.Id);
ViewBag.Email = u?.Email;
await PopulateDropdowns();
return View(dto);
}
var user = await _userManager.FindByIdAsync(dto.Id);
if (user == null) return NotFound();
user.FirstName = dto.FirstName;
user.LastName = dto.LastName;
user.SchoolId = dto.SchoolId;
user.IsActive = dto.IsActive;
var updateResult = await _userManager.UpdateAsync(user);
if (!updateResult.Succeeded)
{
foreach (var error in updateResult.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
ViewBag.Email = user.Email;
await PopulateDropdowns();
return View(dto);
}
// Update role if changed
var currentRoles = await _userManager.GetRolesAsync(user);
var currentRole = currentRoles.FirstOrDefault();
if (currentRole != dto.Role)
{
if (!string.IsNullOrEmpty(currentRole))
{
await _userManager.RemoveFromRoleAsync(user, currentRole);
}
if (!string.IsNullOrEmpty(dto.Role))
{
await _userManager.AddToRoleAsync(user, dto.Role);
}
}
TempData["SuccessMessage"] = "User updated successfully.";
return RedirectToAction(nameof(Index));
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ToggleActive(string id)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null) return NotFound();
user.IsActive = !user.IsActive;
await _userManager.UpdateAsync(user);
TempData["SuccessMessage"] = $"User {(user.IsActive ? "activated" : "deactivated")} successfully.";
return RedirectToAction(nameof(Index));
}
private async Task PopulateDropdowns()
{
ViewBag.Roles = await _roleManager.Roles.Select(r => r.Name).ToListAsync();
ViewBag.Schools = (await _schoolService.GetAllAsync()).Where(s => s.IsActive).ToList();
}
}