using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Application.Backoffice; using Tiku.Application.Security; namespace Tiku.Api.Controllers; [ApiController] [Tags("租户端-后台权限")] [Route("api/backoffice/tenant")] public sealed class TenantBackofficeController( IBackofficeService backofficeService, ICurrentAccessContext currentAccessContext) : ControllerBase { [HttpGet("ui-bootstrap")] [Authorize(Policy = TikuPolicies.TenantBackofficeBootstrap)] [EndpointSummary("查询租户后台菜单与权限")] [EndpointDescription("返回当前租户管理员可见的后台菜单、权限和模块启用状态。")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetUiBootstrap(CancellationToken cancellationToken) { return Ok(await backofficeService.GetTenantUiBootstrapAsync( await currentAccessContext.GetAsync(cancellationToken), cancellationToken)); } [HttpGet("bootstrap")] [Authorize(Policy = BackendPermissions.TenantRoleManage)] [EndpointSummary("查询租户角色管理初始化数据")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetBootstrap(CancellationToken cancellationToken) { return Ok(await backofficeService.GetTenantBootstrapAsync(await ResolveActorAsync(cancellationToken), cancellationToken)); } [HttpPost("roles")] [Authorize(Policy = BackendPermissions.TenantRoleManage)] [EndpointSummary("创建或更新租户后台角色")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> UpsertRole( UpsertBackofficeRoleDto request, CancellationToken cancellationToken) { return Ok(await backofficeService.UpsertTenantRoleAsync(await ResolveActorAsync(cancellationToken), request.ToCommand(), cancellationToken)); } [HttpPut("roles/{roleId:guid}/bindings")] [Authorize(Policy = BackendPermissions.TenantRoleManage)] [EndpointSummary("替换租户后台角色权限绑定")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> ReplaceRoleBindings( Guid roleId, ReplaceRoleBindingsDto request, CancellationToken cancellationToken) { return Ok(await backofficeService.ReplaceTenantRoleBindingsAsync(await ResolveActorAsync(cancellationToken), request.ToCommand(roleId), cancellationToken)); } [HttpPut("users/{userId:guid}/roles")] [Authorize(Policy = BackendPermissions.TenantRoleManage)] [EndpointSummary("替换租户用户后台角色")] [ProducesResponseType(StatusCodes.Status204NoContent)] public async Task ReplaceUserRoles( Guid userId, ReplaceUserRolesDto request, CancellationToken cancellationToken) { await backofficeService.ReplaceTenantUserRolesAsync(await ResolveActorAsync(cancellationToken), request.ToCommand(userId), cancellationToken); return NoContent(); } private async Task ResolveActorAsync(CancellationToken cancellationToken) { return BackofficeActor.FromTenantAccess(await currentAccessContext.GetAsync(cancellationToken)); } }