using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using TaskTrackingSystem.Shared; using TaskTrackingSystem.Shared.Models.Role; using TaskTrackingSystem.WebApi.Infrastructure; namespace TaskTrackingSystem.WebApi.Features.Role { [Route("api/[controller]")] [ApiController] [Authorize] public class RoleController : ControllerBase { private readonly RoleService _roleService; private readonly PermissionAuthorizationService _permissionAuthorizationService; public RoleController(RoleService roleService, PermissionAuthorizationService permissionAuthorizationService) { _roleService = roleService; _permissionAuthorizationService = permissionAuthorizationService; } [HttpGet] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetRoles( [FromQuery] string? search, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var roles = await _roleService.GetAllRolesAsync(); return Ok(roles); } var page = PaginationExtensions.NormalizePage(paging.Page); var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0); var paged = await _roleService.GetPagedRolesAsync(search, page, limit); return Ok(paged); } [HttpGet("{id}")] public async Task> GetRole(long id) { var role = await _roleService.GetRoleByIdAsync(id); if (role == null) { return NotFound(new { message = $"Role with ID {id} not found." }); } return Ok(role); } [HttpPost] public async Task>> CreateRole([FromBody] CreateRoleDto createRoleDto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Create")) { return Forbid(); } long? currentUserId = User.GetUserId(); var result = await _roleService.CreateRoleAsync(createRoleDto, currentUserId); return StatusCode(result.StatusCode, result); } [HttpPut("{id}")] public async Task> UpdateRole(long id, [FromBody] UpdateRoleDto updateRoleDto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Update")) { return Forbid(); } long? currentUserId = User.GetUserId(); var result = await _roleService.UpdateRoleAsync(id, updateRoleDto, currentUserId); return StatusCode(result.StatusCode, result); } [HttpDelete("{id}")] public async Task> DeleteRole(long id) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Delete")) { return Forbid(); } var result = await _roleService.SoftDeleteRoleAsync(id, User.GetUserId()); return StatusCode(result.StatusCode, result); } [HttpGet("{id}/menus")] [HttpGet("{id}/access")] public async Task>>> GetAssignedAccessCodes(long id) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Update")) { return Forbid(); } var result = await _roleService.GetAssignedAccessCodesByRoleIdAsync(id); if (!result.IsSuccess) { return StatusCode(result.StatusCode, new { message = result.ErrorMessage }); } return Ok(result); } [HttpPost("{id}/menus")] [HttpPost("{id}/access")] public async Task AssignAccess(long id, [FromBody] AssignAccessDto dto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Role", "Update")) { return Forbid(); } var result = await _roleService.AssignAccessToRoleAsync(id, dto, User.GetUserId()); if (!result.IsSuccess) { return StatusCode(result.StatusCode, new { message = result.ErrorMessage }); } return Ok(); } } }