using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SkyArtShop.Models; using SkyArtShop.Services; namespace SkyArtShop.Controllers; [Authorize(Roles = "Admin,MasterAdmin")] [Route("admin/users")] public class AdminUsersController : Controller { private readonly PostgreSQLService _pgService; private readonly PostgreAuthService _authService; public AdminUsersController(PostgreSQLService pgService, PostgreAuthService authService) { _pgService = pgService; _authService = authService; } [HttpGet("")] public async Task Index() { return View((await _pgService.GetAllAsync("AdminUsers")).OrderBy((AdminUser u) => u.CreatedAt).ToList()); } [HttpGet("create")] public IActionResult Create() { base.ViewBag.Roles = GetAvailableRoles(); return View(); } [HttpPost("create")] public async Task Create(AdminUser user, string password) { if (string.IsNullOrWhiteSpace(password)) { base.ModelState.AddModelError("", "Password is required"); base.ViewBag.Roles = GetAvailableRoles(); return View(user); } if (await _authService.GetUserByEmailAsync(user.Email) != null) { base.ModelState.AddModelError("", "Email already exists"); base.ViewBag.Roles = GetAvailableRoles(); return View(user); } AdminUser adminUser = await _authService.CreateUserAsync(user.Email, password, user.Name, user.Role); adminUser.Phone = user.Phone; adminUser.Notes = user.Notes; adminUser.Permissions = GetRolePermissions(user.Role); adminUser.CreatedBy = base.User.Identity?.Name ?? "System"; adminUser.PasswordNeverExpires = user.PasswordNeverExpires; adminUser.PasswordExpiresAt = (user.PasswordNeverExpires ? ((DateTime?)null) : new DateTime?(DateTime.UtcNow.AddDays(90.0))); await _pgService.UpdateAsync("AdminUsers", adminUser.Id, adminUser); base.TempData["Success"] = "User " + user.Name + " created successfully! They can now login."; return RedirectToAction("Index"); } [HttpGet("edit/{id}")] public async Task Edit(string id) { AdminUser adminUser = await _pgService.GetByIdAsync("AdminUsers", id); if (adminUser == null) { return NotFound(); } base.ViewBag.Roles = GetAvailableRoles(); return View(adminUser); } [HttpPost("edit/{id}")] public async Task Edit(string id, AdminUser user, string? newPassword) { AdminUser adminUser = await _pgService.GetByIdAsync("AdminUsers", id); if (adminUser == null) { return NotFound(); } adminUser.Name = user.Name; adminUser.Email = user.Email; adminUser.Role = user.Role; adminUser.Phone = user.Phone; adminUser.Notes = user.Notes; adminUser.IsActive = user.IsActive; adminUser.Permissions = GetRolePermissions(user.Role); adminUser.PasswordNeverExpires = user.PasswordNeverExpires; adminUser.PasswordExpiresAt = (user.PasswordNeverExpires ? ((DateTime?)null) : new DateTime?(DateTime.UtcNow.AddDays(90.0))); if (!string.IsNullOrWhiteSpace(newPassword)) { adminUser.PasswordHash = _authService.HashPassword(newPassword); } await _pgService.UpdateAsync("AdminUsers", id, adminUser); if (!string.IsNullOrWhiteSpace(newPassword)) { base.TempData["Success"] = "User " + user.Name + " and password updated successfully!"; } else { base.TempData["Success"] = "User " + user.Name + " updated successfully!"; } return RedirectToAction("Index"); } [HttpPost("delete/{id}")] public async Task Delete(string id) { AdminUser user = await _pgService.GetByIdAsync("AdminUsers", id); if (user == null) { return NotFound(); } if (user.Role == "MasterAdmin") { base.TempData["Error"] = "Cannot delete Master Admin!"; return RedirectToAction("Index"); } await _pgService.DeleteAsync("AdminUsers", id); base.TempData["Success"] = "User " + user.Name + " deleted successfully!"; return RedirectToAction("Index"); } [HttpGet("view/{id}")] public async Task ViewUser(string id) { AdminUser adminUser = await _pgService.GetByIdAsync("AdminUsers", id); if (adminUser == null) { return NotFound(); } return View("View", adminUser); } private List GetAvailableRoles() { return new List { "MasterAdmin", "Admin", "Cashier", "Accountant" }; } private List GetRolePermissions(string role) { return role switch { "MasterAdmin" => new List { "manage_users", "manage_products", "manage_orders", "manage_content", "manage_settings", "view_reports", "manage_finances", "manage_inventory", "manage_customers", "manage_blog", "manage_portfolio", "manage_pages" }, "Admin" => new List { "manage_products", "manage_orders", "manage_content", "view_reports", "manage_inventory", "manage_customers", "manage_blog", "manage_portfolio", "manage_pages" }, "Cashier" => new List { "view_products", "manage_orders", "view_customers", "process_payments" }, "Accountant" => new List { "view_products", "view_orders", "view_reports", "manage_finances", "view_customers", "export_data" }, _ => new List(), }; } }