using Dpz.Core.Public.Entity.Auth;
using Dpz.Core.Service.Mediator.Features.Auth.Contracts;

namespace Dpz.Core.Service.Mediator.Features.Auth.Queries;

public class SearchApplicationAccessRequestsQueryHandler(
    IRepository<ApplicationAccessRequest> repository
) : IRequestHandler<SearchApplicationAccessRequestsQuery, PagedListWarp<AuthAccessRequestItem>>
{
    public async ValueTask<PagedListWarp<AuthAccessRequestItem>> Handle(
        SearchApplicationAccessRequestsQuery request,
        CancellationToken cancellationToken
    )
    {
        var query = repository.SearchFor(x => true);

        if (!string.IsNullOrWhiteSpace(request.Account))
        {
            query = query.Where(x => x.UserId == request.Account);
        }

        if (!string.IsNullOrWhiteSpace(request.ClientId))
        {
            query = query.Where(x => x.ClientId == request.ClientId);
        }

        if (request.StartDate.HasValue)
        {
            query = query.Where(x => x.RequestTime >= request.StartDate.Value);
        }

        if (request.EndDate.HasValue)
        {
            var end = request.EndDate.Value.Date.AddDays(1).AddTicks(-1);
            query = query.Where(x => x.RequestTime <= end);
        }

        var pagedList = await query
            .OrderByDescending(x => x.RequestTime)
            .ToPagedListAsync<ApplicationAccessRequest, AuthAccessRequestItem>(
                request.Page,
                request.Limit,
                cancellationToken
            );

        return pagedList.ToPagedListWarp();
    }
}
评论加载中...