using GamificationService.Models.BasicResponses; using GamificationService.Models.DTO; using GamificationService.Services.Roles; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; namespace GamificationService.Controllers; [ApiController] [Route("api/[controller]")] [Authorize(Policy = "Admin")] public class RoleController : ControllerBase { #region Services private readonly IRolesService _rolesService; private readonly ILogger _logger; #endregion #region Constructor public RoleController(ILogger logger, IRolesService rolesService) { _logger = logger; _rolesService = rolesService; } #endregion #region ControllerMethods [HttpGet] public async Task GetAllRolesAsync([FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10) { try { var (roles, totalCount) = await _rolesService.GetAllRolesAsync(pageNumber, pageSize); _logger.LogInformation($"Roles found successfully, {roles.Count}"); var response = new GetAllRolesResponse() { Roles = roles, TotalCount = totalCount, PageNumber = pageNumber, PageSize = pageSize }; return Ok(response); } catch (Exception ex) { _logger.LogError(ex,ex.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to get roles" }); } } [HttpGet("{id}")] public async Task GetRoleByIdAsync(long id) { var role = await _rolesService.GetRoleByIdAsync(id); _logger.LogInformation($"Role found successfully, {role.Id}"); if (role == null) { return NotFound(new BasicResponse() { Code = 404, Message = "Role not found" }); } return Ok(role); } [HttpPost] public async Task CreateRoleAsync([FromBody] RoleDTO model) { try { var role = await _rolesService.CreateRoleAsync(model.Name, model.Description); _logger.LogInformation($"Role created successfully, {role.Id}"); return CreatedAtAction(nameof(CreateRoleAsync), new { id = role.Id }, role); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to create role" }); } } [HttpPut("{id}")] public async Task UpdateRoleAsync(long id, [FromBody] RoleDTO model) { try { if (await _rolesService.UpdateRoleAsync(id, model.Name, model.Description)) { _logger.LogInformation($"Role updated successfully, {id}"); return Ok(new BasicResponse() { Code = 200, Message = "Role updated successfully" }); } _logger.LogCritical($"Unknown error with role updating, {id}"); return StatusCode(418,new BasicResponse() { Code = 418, Message = "Role not found" }); } catch (KeyNotFoundException) { _logger.LogError($"Role not found, {id} "); return NotFound(new BasicResponse() { Code = 404, Message = "Role not found" }); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to update role" }); } } [HttpDelete("{id}")] public async Task DeleteRoleAsync(long id) { try { if (await _rolesService.DeleteRoleAsync(id)) { _logger.LogInformation($"Role updated successfully, {id}"); return Ok(new BasicResponse() { Code = 200, Message = "Role updated successfully" }); } _logger.LogCritical($"Unknown error with role deleting, RoleId {id}"); return StatusCode(418,new BasicResponse() { Code = 418, Message = "Role not found" }); } catch (KeyNotFoundException) { _logger.LogError($"Role not found, {id} "); return NotFound(new BasicResponse() { Code = 404, Message = "Role not found" }); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to delete role" }); } } [HttpPost("{roleId}/rights/{rightId}")] public async Task AddRightToRoleAsync(long roleId, long rightId) { try { if (await _rolesService.AddRightToRoleAsync(roleId, rightId)) { _logger.LogInformation($"Right added to role successfully, RoleId: {roleId}, RightId: {rightId}"); return Ok(new BasicResponse() { Code = 200, Message = "Right added to role successfully" }); } _logger.LogCritical($"Unknown error with adding right to role, RoleId: {roleId}, RightId: {rightId}"); return StatusCode(418,new BasicResponse() { Code = 418, Message = "Right not found for role" }); } catch(KeyNotFoundException e) { _logger.LogError(e, e.Message); return NotFound(new BasicResponse() { Code = 404, Message = "Right not found for role" }); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to add right to role" }); } } [HttpDelete("{roleId}/rights/{rightId}")] public async Task RemoveRightFromRoleAsync(long roleId, long rightId) { try { if (await _rolesService.RemoveRightFromRoleAsync(roleId, rightId)) { _logger.LogInformation($"Right removed from role successfully, RoleId: {roleId}, RightId: {rightId}"); return Ok(new BasicResponse() { Code = 200, Message = "Right removed from role successfully" }); } _logger.LogCritical($"Unknown error with removing right from role, RoleId: {roleId}, RightId: {rightId}"); return StatusCode(418, new BasicResponse() { Code = 418, Message = "Right not found right for role" }); } catch (KeyNotFoundException e) { _logger.LogError(e, e.Message); return NotFound(new BasicResponse() { Code = 404, Message = "Right not found for role" }); } catch (Exception e) { _logger.LogError(e, e.Message); return StatusCode(500, new BasicResponse() { Code = 500, Message = "Failed to remove right from role" }); } } #endregion }