using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using TakeoutSaaS.Application.App.Tenants.Commands; using TakeoutSaaS.Application.App.Tenants.Dto; using TakeoutSaaS.Application.App.Tenants.Queries; using TakeoutSaaS.Module.Authorization.Attributes; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Web.Api; namespace TakeoutSaaS.AdminApi.Controllers; /// /// 租户通知接口。 /// [ApiVersion("1.0")] [Authorize] [Route("api/admin/v{version:apiVersion}/tenants/{tenantId:long}/notifications")] public sealed class TenantNotificationsController(IMediator mediator) : BaseApiController { /// /// 分页查询通知。 /// /// 租户通知分页结果。 [HttpGet] [PermissionAuthorize("tenant-notification:read")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] public async Task>> Search(long tenantId, [FromQuery] SearchTenantNotificationsQuery query, CancellationToken cancellationToken) { // 1. 绑定租户标识 query = query with { TenantId = tenantId }; // 2. 查询通知列表 var result = await mediator.Send(query, cancellationToken); // 3. 返回分页结果 return ApiResponse>.Ok(result); } /// /// 标记通知已读。 /// /// 标记已读后的通知信息。 [HttpPost("{notificationId:long}/read")] [PermissionAuthorize("tenant-notification:update")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] public async Task> MarkRead(long tenantId, long notificationId, CancellationToken cancellationToken) { // 1. 标记通知为已读 var result = await mediator.Send(new MarkTenantNotificationReadCommand { TenantId = tenantId, NotificationId = notificationId }, cancellationToken); // 2. 返回结果或 404 return result is null ? ApiResponse.Error(StatusCodes.Status404NotFound, "通知不存在") : ApiResponse.Ok(result); } }