using Microsoft.AspNetCore.Mvc;
using MediatR;
using Microsoft.Extensions.Logging;
using CellularManagement.Application.Features.RolePermissions.Commands.AddRolePermissions;
using CellularManagement.Application.Features.RolePermissions.Commands.DeleteRolePermissions;
using CellularManagement.Application.Features.RolePermissions.Queries.GetRolePermissions;
using CellularManagement.Application.Common;
using Microsoft.AspNetCore.Http;
using CellularManagement.Presentation.Abstractions;
using CellularManagement.Domain.Common;
namespace CellularManagement.Presentation.Controllers;
///
/// 角色权限控制器
/// 提供角色权限管理相关的 API 接口,包括添加、删除和查询角色权限功能
///
public class RolePermissionController : ApiController
{
private readonly ILogger _logger;
///
/// 初始化角色权限控制器
///
/// MediatR 中介者,用于处理命令和查询
/// 日志记录器
public RolePermissionController(
IMediator mediator,
ILogger logger) : base(mediator)
{
_logger = logger;
}
///
/// 获取角色权限
///
///
/// 示例请求:
///
/// GET /api/role-permissions/{roleId}?includeDetails=true
///
///
/// 角色ID
/// 是否包含权限详情
///
/// 角色权限信息,包含:
/// - 角色基本信息
/// - 权限列表
///
/// 获取成功,返回角色权限信息
/// 获取失败,返回错误信息
[HttpGet("{roleId}")]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status400BadRequest)]
public async Task>> GetRolePermissions(
string roleId,
[FromQuery] bool includeDetails = true)
{
try
{
var query = new GetRolePermissionsQuery
{
RoleId = roleId,
IncludeDetails = includeDetails
};
var result = await mediator.Send(query);
if (result.IsSuccess)
{
_logger.LogInformation(
"成功获取角色 {RoleId} 的权限信息,共 {Count} 个权限",
roleId,
result.Data?.Permissions.Count());
}
else
{
_logger.LogWarning(
"获取角色 {RoleId} 的权限信息失败: {Error}",
roleId,
result.ErrorMessages?.FirstOrDefault());
}
return Ok(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "获取角色 {RoleId} 的权限信息时发生异常", roleId);
return StatusCode(StatusCodes.Status500InternalServerError,
OperationResult.CreateFailure("系统错误,请稍后重试"));
}
}
///
/// 添加角色权限
///
///
/// 示例请求:
///
/// POST /api/role-permissions
/// {
/// "roleId": "角色ID",
/// "permissionIds": ["权限ID1", "权限ID2"]
/// }
///
///
/// 添加角色权限命令
///
/// 添加结果,包含:
/// - 成功:返回添加成功的权限ID列表
/// - 失败:返回错误信息
///
/// 添加成功,返回添加结果
/// 添加失败,返回错误信息
[HttpPost]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status400BadRequest)]
public async Task>> AddRolePermissions(
[FromBody] AddRolePermissionsCommand command)
{
try
{
var result = await mediator.Send(command);
if (result.IsSuccess)
{
_logger.LogInformation(
"成功为角色 {RoleId} 添加权限,添加成功:{SuccessCount},添加失败:{FailedCount}",
command.RoleId,
result.Data?.AddedPermissionIds.Count(),
result.Data?.FailedPermissionIds.Count());
}
else
{
_logger.LogWarning(
"为角色 {RoleId} 添加权限失败: {Error}",
command.RoleId,
result.ErrorMessages?.FirstOrDefault());
}
return Ok(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "为角色 {RoleId} 添加权限时发生异常", command.RoleId);
return StatusCode(StatusCodes.Status500InternalServerError,
OperationResult.CreateFailure("系统错误,请稍后重试"));
}
}
///
/// 删除角色权限
///
///
/// 示例请求:
///
/// DELETE /api/role-permissions
/// {
/// "roleId": "角色ID",
/// "permissionIds": ["权限ID1", "权限ID2"]
/// }
///
///
/// 删除角色权限命令
///
/// 删除结果,包含:
/// - 成功:返回删除的权限数量
/// - 失败:返回错误信息
///
/// 删除成功,返回删除结果
/// 删除失败,返回错误信息
[HttpDelete]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(OperationResult), StatusCodes.Status400BadRequest)]
public async Task>> DeleteRolePermissions(
[FromBody] DeleteRolePermissionsCommand command)
{
try
{
var result = await mediator.Send(command);
if (result.IsSuccess)
{
_logger.LogInformation(
"成功从角色 {RoleId} 删除权限,删除数量:{DeletedCount},删除失败:{FailedCount}",
command.RoleId,
result.Data?.DeletedCount,
result.Data?.FailedPermissionIds.Count());
}
else
{
_logger.LogWarning(
"从角色 {RoleId} 删除权限失败: {Error}",
command.RoleId,
result.ErrorMessages?.FirstOrDefault());
}
return Ok(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "从角色 {RoleId} 删除权限时发生异常", command.RoleId);
return StatusCode(StatusCodes.Status500InternalServerError,
OperationResult.CreateFailure("系统错误,请稍后重试"));
}
}
}