63 lines
2.1 KiB
C#
63 lines
2.1 KiB
C#
using MediatR;
|
|
using cuqmbr.TravelGuide.Application.Common.Persistence;
|
|
using AutoMapper;
|
|
using cuqmbr.TravelGuide.Application.Common.Models;
|
|
using cuqmbr.TravelGuide.Application.Common.Extensions;
|
|
|
|
namespace cuqmbr.TravelGuide.Application.Companies.Queries.GetCompaniesPage;
|
|
|
|
public class GetCompaniesPageQueryHandler :
|
|
IRequestHandler<GetCompaniesPageQuery, PaginatedList<CompanyDto>>
|
|
{
|
|
private readonly UnitOfWork _unitOfWork;
|
|
private readonly IMapper _mapper;
|
|
|
|
public GetCompaniesPageQueryHandler(
|
|
UnitOfWork unitOfWork,
|
|
IMapper mapper)
|
|
{
|
|
_unitOfWork = unitOfWork;
|
|
_mapper = mapper;
|
|
}
|
|
|
|
public async Task<PaginatedList<CompanyDto>> Handle(
|
|
GetCompaniesPageQuery request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var paginatedList = await _unitOfWork.CompanyRepository.GetPageAsync(
|
|
e =>
|
|
e.Name.ToLower().Contains(request.Search.ToLower()) ||
|
|
e.LegalAddress.ToLower().Contains(request.Search.ToLower()) ||
|
|
e.ContactEmail.ToLower().Contains(request.Search.ToLower()) ||
|
|
e.ContactPhoneNumber.ToLower().Contains(request.Search.ToLower()),
|
|
request.PageNumber, request.PageSize,
|
|
cancellationToken);
|
|
|
|
// Hydrate companies
|
|
|
|
var accountIds = paginatedList.Items.Select(e => e.AccountId);
|
|
var accounts = await _unitOfWork.AccountRepository.GetPageAsync(
|
|
e => accountIds.Contains(e.Id),
|
|
1, paginatedList.Items.Count, cancellationToken);
|
|
|
|
foreach (var company in paginatedList.Items)
|
|
{
|
|
company.Account =
|
|
accounts.Items.First(a => a.Id == company.AccountId);
|
|
}
|
|
|
|
var mappedItems = _mapper
|
|
.ProjectTo<CompanyDto>(paginatedList.Items.AsQueryable());
|
|
|
|
mappedItems = QueryableExtension<CompanyDto>
|
|
.ApplySort(mappedItems, request.Sort);
|
|
|
|
_unitOfWork.Dispose();
|
|
|
|
return new PaginatedList<CompanyDto>(
|
|
mappedItems.ToList(),
|
|
paginatedList.TotalCount, request.PageNumber,
|
|
request.PageSize);
|
|
}
|
|
}
|