using F9WebAiTest.Application.Common;
using F9WebAiTest.Application.Common.Exceptions;
using F9WebAiTest.Application.CQRS.SYS.RBAC.Roles.Commands;
using F9WebAiTest.Application.CQRS.SYS.RBAC.Roles.Queries;
using F9WebAiTest.Domain.Enums.SYS.RBAC;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace F9WebAiTest.Api.Controllers;
/// 系统角色管理(DDD + CQRS)
[ApiController]
[Route("api/sys/role")]
[Authorize]
public class SysRoleController : ControllerBase
{
private readonly IMediator _mediator;
public SysRoleController(IMediator mediator) => _mediator = mediator;
[HttpGet]
public async Task GetAll()
=> Ok(ApiResult.Ok(await _mediator.Send(new GetRoleAllQuery())));
[HttpGet("{id}")]
public async Task GetById(long id)
=> Ok(ApiResult.Ok(await _mediator.Send(new GetRoleByIdForEditQuery(id))));
[HttpGet("{id}/permissions")]
public async Task GetPermissions(long id, [FromQuery] Resource_Type_Enum resourceType)
=> Ok(ApiResult.Ok(await _mediator.Send(new GetRolePermissionsByResourceTypeQuery(id, resourceType))));
[HttpPost]
public async Task Create([FromBody] Role_CreateCommand command)
{
try { return Ok(ApiResult.Ok(new { id = await _mediator.Send(command) }, "创建成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
[HttpPut("{id}")]
public async Task Update(long id, [FromBody] Role_UpdateCommand command)
{
try { return Ok(ApiResult.Ok(await _mediator.Send(command with { Id = id }), "修改成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
[HttpDelete("{id}")]
public async Task Delete(long id)
{
try { return Ok(ApiResult.Ok(await _mediator.Send(new Role_DelCommand(id)), "删除成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
[HttpPut("{id}/active")]
public async Task ActiveOrDeactivate(long id, [FromBody] Role_ActiveOrDeactivateCommand command)
{
try { return Ok(ApiResult.Ok(await _mediator.Send(command with { Id = id }), "操作成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
[HttpPost("{id}/permissions")]
public async Task AssignPermission(long id, [FromBody] RolePermission_AssignCommand command)
{
try { return Ok(ApiResult.Ok(await _mediator.Send(command with { RoleId = id }), "绑定成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
[HttpDelete("{id}/permissions/{rpId}")]
public async Task RemovePermission(long id, long rpId, [FromQuery] Resource_Type_Enum resourceType)
{
try { return Ok(ApiResult.Ok(await _mediator.Send(new RolePermission_RemoveCommand(rpId, resourceType)), "解绑成功")); }
catch (F9NotFoundException ex) { return NotFound(ApiResult.Fail(ex.Message, 404)); }
catch (F9OperationException ex) { return BadRequest(ApiResult.Fail(ex.Message, 400)); }
}
}