From fa75a383bae3618c3000a25517e33cbc786ca7cf Mon Sep 17 00:00:00 2001 From: HARRIS BIN MUSLISHAM Date: Wed, 12 Nov 2025 10:21:08 +0800 Subject: [PATCH] added authorizations in IT controller --- .../ApprovalDashboardController.cs | 80 ++++++--- Areas/IT/Models/RequestFormManager.cs | 11 ++ Areas/IT/Views/ApprovalDashboard/Admin.cshtml | 156 ++++++++++++++---- Controllers/API/ITRequestAPI.cs | 23 +++ DBContext/CentralSystemContext.cs | 1 + 5 files changed, 219 insertions(+), 52 deletions(-) create mode 100644 Areas/IT/Models/RequestFormManager.cs diff --git a/Areas/IT/Controllers/ApprovalDashboardController.cs b/Areas/IT/Controllers/ApprovalDashboardController.cs index 12c9cf6..cace777 100644 --- a/Areas/IT/Controllers/ApprovalDashboardController.cs +++ b/Areas/IT/Controllers/ApprovalDashboardController.cs @@ -1,5 +1,9 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using PSTW_CentralSystem.DBContext; +using PSTW_CentralSystem.Models; namespace PSTW_CentralSystem.Areas.IT.Controllers { @@ -7,41 +11,69 @@ namespace PSTW_CentralSystem.Areas.IT.Controllers [Authorize] public class ApprovalDashboardController : Controller { - public IActionResult Approval() + private readonly CentralSystemContext _db; + private readonly UserManager _userManager; + + public ApprovalDashboardController(CentralSystemContext db, UserManager userManager) { + _db = db; + _userManager = userManager; + } + + // ===== helpers ===== + private int GetCurrentUserId() => int.Parse(_userManager.GetUserId(User)!); + + private async Task IsItTeamAsync(int userId) => + await _db.ItTeamMembers.AnyAsync(t => t.UserId == userId); + + private async Task IsApproverInAnyFlowAsync(int userId) => + await _db.ItApprovalFlows.AnyAsync(f => + f.HodUserId == userId || + f.GroupItHodUserId == userId || + f.FinHodUserId == userId || + f.MgmtUserId == userId); + + private async Task IsRequestFormManagerAsync(int userId) => + await _db.RequestFormManagers.AnyAsync(m => m.UserId == userId); + + // ===== routes ===== + + // Approval is only available for approvers and IT team members + public async Task Approval() + { + var uid = GetCurrentUserId(); + + var isAllowed = await IsItTeamAsync(uid) || await IsApproverInAnyFlowAsync(uid); + if (!isAllowed) return Forbid(); // or: return View("AccessDenied"); + return View(); // ~/Areas/IT/Views/ApprovalDashboard/Approval.cshtml } - public IActionResult Create() + // Assignings (Admin) is only available for Request Form Managers + public async Task Admin() { - return View(); // ~/Areas/IT/Views/ApprovalDashboard/Create.cshtml - } - public IActionResult MyRequests() - { - return View(); // ~/Areas/IT/Views/ApprovalDashboard/MyRequests.cshtml - } - public IActionResult Admin() - { - return View(); // ~/Areas/IT/Views/ApprovalDashboard/MyRequests.cshtml + var uid = GetCurrentUserId(); + + var isManager = await IsRequestFormManagerAsync(uid); + if (!isManager) return Forbid(); // or: return View("AccessDenied"); + + return View(); // ~/Areas/IT/Views/ApprovalDashboard/Admin.cshtml } + + // Open to any authenticated user + public IActionResult Create() => View(); // ~/Areas/IT/Views/ApprovalDashboard/Create.cshtml + public IActionResult MyRequests() => View(); // ~/Areas/IT/Views/ApprovalDashboard/MyRequests.cshtml + + // Use the same gate as Approval (reviewing a specific request) public IActionResult RequestReview(int statusId) { ViewBag.StatusId = statusId; return View(); // ~/Areas/IT/Views/ApprovalDashboard/RequestReview.cshtml } - public IActionResult SectionB() - { - return View(); - } - public IActionResult Edit() - { - return View(); - } - - public IActionResult SectionBEdit() - { - return View(); - } + // Leave these open unless you want extra guards + public IActionResult SectionB() => View(); + public IActionResult Edit() => View(); + public IActionResult SectionBEdit() => View(); } } diff --git a/Areas/IT/Models/RequestFormManager.cs b/Areas/IT/Models/RequestFormManager.cs new file mode 100644 index 0000000..20b6069 --- /dev/null +++ b/Areas/IT/Models/RequestFormManager.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations.Schema; + +namespace PSTW_CentralSystem.Areas.IT.Models +{ + [Table("request_form_managers")] + public class RequestFormManager + { + public int Id { get; set; } + public int UserId { get; set; } + } +} diff --git a/Areas/IT/Views/ApprovalDashboard/Admin.cshtml b/Areas/IT/Views/ApprovalDashboard/Admin.cshtml index 3b41ce2..10e9e0c 100644 --- a/Areas/IT/Views/ApprovalDashboard/Admin.cshtml +++ b/Areas/IT/Views/ApprovalDashboard/Admin.cshtml @@ -3,7 +3,7 @@ Layout = "~/Views/Shared/_Layout.cshtml"; } - +