using AutoMapper; using MediatR; using ExpenseTracker.Application.Common.Extensions; using ExpenseTracker.Application.Common.Interfaces.Repositories; using ExpenseTracker.Application.Common.Models; using ExpenseTracker.Domain.Entities; namespace ExpenseTracker.Application.Transactions.Queries.GetWithPagination; public class GetTransactionsWithPaginationQueryHandler : IRequestHandler> { private readonly IMapper _mapper; private readonly ITransactionRepository _transactionRepository; public GetTransactionsWithPaginationQueryHandler( IMapper mapper, ITransactionRepository repository) { _mapper = mapper; _transactionRepository = repository; } public async Task> Handle( GetTransactionsWithPaginationQuery request, CancellationToken cancellationToken) { // TODO: This is unoptimized. Pagination is being applied // on the side of the application // and not on the side of the database Func func = t => t.Time; var entities = _transactionRepository.Queryable .Where(e => e.AccountId == request.AccountId) .OrderByDescending(func) .AsQueryable(); return entities .ProjectToPaginatedList(request.PageNumber, request.PageSize, _mapper.ConfigurationProvider); } }