using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ROLAC.API.Authorization; using ROLAC.API.DTOs.Permissions; using ROLAC.API.Services; namespace ROLAC.API.Controllers; /// /// Admin surface for the configurable RBAC matrix. Restricted to super_admin — /// the role that governs who governs everyone else. /// [ApiController] [Route("api/permissions")] [Authorize(Roles = "super_admin")] public class PermissionsController : ControllerBase { private readonly IPermissionService _permissions; public PermissionsController(IPermissionService permissions) => _permissions = permissions; /// GET /api/permissions — the full role × module matrix. [HttpGet] public async Task GetMatrix() => Ok(await _permissions.GetMatrixAsync()); /// GET /api/permissions/catalog — module + action names for the grid. [HttpGet("catalog")] public IActionResult GetCatalog() => Ok(new PermissionCatalogDto { Modules = Modules.All, Actions = PermissionActions.All, }); /// PUT /api/permissions/{roleName} — replaces a role's grants. [HttpPut("{roleName}")] public async Task UpdateRole(string roleName, [FromBody] UpdateRolePermissionsRequest request) { try { await _permissions.UpsertRoleAsync(roleName, request.Modules); return NoContent(); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { message = ex.Message }); } } }