Files
TakeoutSaaS.AdminApi/src/Application/TakeoutSaaS.Application/Identity/Handlers/SearchPermissionsQueryHandler.cs

55 lines
2.0 KiB
C#

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;
/// <summary>
/// 权限分页查询处理器。
/// </summary>
public sealed class SearchPermissionsQueryHandler(
IPermissionRepository permissionRepository,
ITenantProvider tenantProvider)
: IRequestHandler<SearchPermissionsQuery, PagedResult<PermissionDto>>
{
public async Task<PagedResult<PermissionDto>> 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<PermissionDto>(items, request.Page, request.PageSize, permissions.Count);
}
}