Files
tiku-backend.net/Tiku.Api/Controllers/PlatformGovernanceController.cs
xiong 290a0c7bd7
Some checks failed
ci / release-gate (push) Has been cancelled
feat(platform): harden governance and approval workflows
2026-08-03 11:43:18 +08:00

90 lines
5.7 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Tiku.Api.Contracts;
using Tiku.Api.OpenApi;
using Tiku.Application.PlatformAdmin;
using Tiku.Application.Security;
using Tiku.Domain.Platform;
namespace Tiku.Api.Controllers;
[ApiController]
[Tags("平台端-治理配置")]
[Route("api/platform-admin/governance")]
[Authorize(Policy = TikuPolicies.PlatformBackofficeBootstrap)]
public sealed class PlatformGovernanceController(
IPlatformGovernanceService governanceService,
ICurrentAccessContext currentAccessContext) : ControllerBase
{
[HttpGet("configuration/definitions")]
[Authorize(Policy = BackendPermissions.PlatformConfigurationManage)]
[EndpointSummary("查询类型化平台配置定义")]
public async Task<IReadOnlyCollection<PlatformConfigurationDefinitionItem>> ConfigurationDefinitions(CancellationToken cancellationToken) =>
await governanceService.GetConfigurationDefinitionsAsync(await ActorAsync(cancellationToken), cancellationToken);
[HttpGet("configuration/versions")]
[Authorize(Policy = BackendPermissions.PlatformConfigurationManage)]
[EndpointSummary("查询平台配置版本")]
public async Task<IReadOnlyCollection<PlatformConfigurationVersionItem>> ConfigurationVersions(string definitionCode, string? environment, CancellationToken cancellationToken) =>
await governanceService.GetConfigurationVersionsAsync(await ActorAsync(cancellationToken), definitionCode, environment, cancellationToken);
[HttpPost("configuration/drafts")]
[Authorize(Policy = BackendPermissions.PlatformConfigurationManage)]
[EndpointSummary("保存平台配置草稿")]
public async Task<PlatformConfigurationVersionItem> SaveConfigurationDraft(SavePlatformConfigurationDraftDto request, CancellationToken cancellationToken) =>
await governanceService.SaveConfigurationDraftAsync(await ActorAsync(cancellationToken), request.ToCommand(), cancellationToken);
[HttpPost("configuration/versions/{versionId:guid}/publish")]
[Authorize(Policy = BackendPermissions.PlatformConfigurationManage)]
[EndpointSummary("发布平台配置版本")]
[PlatformOperationRisk("high")]
public async Task<PlatformConfigurationVersionItem> PublishConfiguration(Guid versionId, CancellationToken cancellationToken) =>
await governanceService.PublishConfigurationAsync(await ActorAsync(cancellationToken), versionId, cancellationToken);
[HttpPost("configuration/versions/{versionId:guid}/rollback")]
[Authorize(Policy = BackendPermissions.PlatformConfigurationManage)]
[EndpointSummary("回滚平台配置版本")]
[PlatformOperationRisk("high")]
public async Task<PlatformConfigurationVersionItem> RollbackConfiguration(Guid versionId, PlatformRollbackDto request, CancellationToken cancellationToken) =>
await governanceService.RollbackConfigurationAsync(await ActorAsync(cancellationToken), versionId, request.Reason, cancellationToken);
[HttpGet("notifications/templates")]
[Authorize(Policy = BackendPermissions.PlatformNotificationManage)]
[EndpointSummary("查询平台通知模板")]
public async Task<IReadOnlyCollection<PlatformNotificationTemplateItem>> NotificationTemplates(CancellationToken cancellationToken) =>
await governanceService.GetNotificationTemplatesAsync(await ActorAsync(cancellationToken), cancellationToken);
[HttpPut("notifications/templates")]
[Authorize(Policy = BackendPermissions.PlatformNotificationManage)]
[EndpointSummary("新增或更新平台通知模板")]
public async Task<PlatformNotificationTemplateItem> UpsertNotificationTemplate(UpsertPlatformNotificationTemplateDto request, CancellationToken cancellationToken) =>
await governanceService.UpsertNotificationTemplateAsync(await ActorAsync(cancellationToken), request.ToCommand(), cancellationToken);
[HttpPost("notifications/send")]
[Authorize(Policy = BackendPermissions.PlatformNotificationManage)]
[EndpointSummary("按平台岗位发送通知")]
public async Task<IReadOnlyCollection<PlatformNotificationDeliveryItem>> SendNotification(SendPlatformNotificationDto request, CancellationToken cancellationToken) =>
await governanceService.SendNotificationAsync(await ActorAsync(cancellationToken), request.ToCommand(), cancellationToken);
[HttpGet("notifications/deliveries")]
[Authorize(Policy = BackendPermissions.PlatformNotificationManage)]
[EndpointSummary("分页查询平台通知投递")]
public async Task<PagedResult<PlatformNotificationDeliveryItem>> NotificationDeliveries(
int page = 1, int pageSize = 50, string? search = null, PlatformNotificationDeliveryStatus? status = null, CancellationToken cancellationToken = default) =>
await governanceService.GetNotificationDeliveriesAsync(await ActorAsync(cancellationToken), new PagedQuery(page, pageSize, search), status, cancellationToken);
[HttpPost("notifications/deliveries/{deliveryId:guid}/retry")]
[Authorize(Policy = BackendPermissions.PlatformNotificationManage)]
[EndpointSummary("重试平台通知投递")]
public async Task<PlatformNotificationDeliveryItem> RetryNotification(Guid deliveryId, CancellationToken cancellationToken) =>
await governanceService.RetryNotificationAsync(await ActorAsync(cancellationToken), deliveryId, cancellationToken);
private async Task<PlatformApprovalActor> ActorAsync(CancellationToken cancellationToken)
{
var access = await currentAccessContext.GetAsync(cancellationToken);
return access.UserId is { } userId && access.IsUserActive
? new PlatformApprovalActor(userId, access.PlatformPermissions)
: throw new PlatformApprovalException("Platform actor was not resolved.", "platform_access_denied");
}
}