http-api/src/Application/Companies/Queries/GetCompaniesPage/GetCompaniesPageQueryHandler.cs

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);
}
}