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> { private readonly UnitOfWork _unitOfWork; private readonly IMapper _mapper; public GetCompaniesPageQueryHandler( UnitOfWork unitOfWork, IMapper mapper) { _unitOfWork = unitOfWork; _mapper = mapper; } public async Task> 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(paginatedList.Items.AsQueryable()); mappedItems = QueryableExtension .ApplySort(mappedItems, request.Sort); _unitOfWork.Dispose(); return new PaginatedList( mappedItems.ToList(), paginatedList.TotalCount, request.PageNumber, request.PageSize); } }