using System; using System.Linq; using MediatR; using TakeoutSaaS.Application.Identity.Contracts; using TakeoutSaaS.Application.Identity.Queries; using TakeoutSaaS.Domain.Identity.Repositories; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Abstractions.Tenancy; namespace TakeoutSaaS.Application.Identity.Handlers; /// /// 权限分页查询处理器。 /// public sealed class SearchPermissionsQueryHandler( IPermissionRepository permissionRepository, ITenantProvider tenantProvider) : IRequestHandler> { public async Task> Handle(SearchPermissionsQuery request, CancellationToken cancellationToken) { var tenantId = tenantProvider.GetCurrentTenantId(); var permissions = await permissionRepository.SearchAsync(tenantId, request.Keyword, cancellationToken); var sorted = request.SortBy?.ToLowerInvariant() switch { "name" => request.SortDescending ? permissions.OrderByDescending(x => x.Name) : permissions.OrderBy(x => x.Name), "code" => request.SortDescending ? permissions.OrderByDescending(x => x.Code) : permissions.OrderBy(x => x.Code), _ => request.SortDescending ? permissions.OrderByDescending(x => x.CreatedAt) : permissions.OrderBy(x => x.CreatedAt) }; var paged = sorted .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .ToList(); var items = paged.Select(permission => new PermissionDto { Id = permission.Id, TenantId = permission.TenantId, Name = permission.Name, Code = permission.Code, Description = permission.Description }).ToList(); return new PagedResult(items, request.Page, request.PageSize, permissions.Count); } }