using AutoMapper; using AutoMapper.QueryableExtensions; namespace ExpenseTracker.Application.Common.Models; public class PaginatedList { public IReadOnlyCollection Items { get; } public int PageNumber { get; } public int TotalPages { get; } public int TotalCount { get; } public PaginatedList(IReadOnlyCollection items, int count, int pageNumber, int pageSize) { PageNumber = pageNumber; TotalPages = (int) Math.Ceiling(count / (double) pageSize); TotalCount = count; Items = items; } public bool HasPreviousPage => PageNumber > 1; public bool HasNextPage => PageNumber < TotalPages; public static PaginatedList Create(IQueryable source, int pageNumber, int pageSize) { var count = source.Count(); var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList(); return new PaginatedList(items, count, pageNumber, pageSize); } public static PaginatedList Create( IQueryable source, int pageNumber, int pageSize, IConfigurationProvider mappingConfigurationProvider) { var count = source.Count(); var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList(); var mappedItems = items.AsQueryable() .ProjectTo(mappingConfigurationProvider).ToList(); return new PaginatedList(mappedItems, count, pageNumber, pageSize); } }