using AutoMapper; using AutoMapper.QueryableExtensions; using CleanArchitecture.Application.Common.Interfaces; using CleanArchitecture.Application.Common.Mappings; using CleanArchitecture.Application.Common.Models; using CleanArchitecture.Application.TodoLists.Queries.GetTodos; using MediatR; using System.Linq; using System.Threading; using System.Threading.Tasks; using CleanArchitecture.Domain.Entities; using CleanArchitecture.WebUI.Controllers; using FluentValidation; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace CleanArchitecture.Application.TodoItems.Queries.GetTodoItemsWithPagination { [Authorize] public class GetTodoItemsWithPaginationController : ApiControllerBase { [HttpGet("/todoItems")] public async Task<ActionResult<PaginatedList<TodoItemDto>>> GetTodoItemsWithPagination([FromQuery] GetTodoItemsWithPaginationQuery query) { return await Mediator.Send(query); } } public class GetTodoItemsWithPaginationQueryValidator : AbstractValidator<GetTodoItemsWithPaginationQuery> { public GetTodoItemsWithPaginationQueryValidator() { RuleFor(x => x.ListId) .NotNull() .NotEmpty().WithMessage("ListId is required."); RuleFor(x => x.PageNumber) .GreaterThanOrEqualTo(1).WithMessage("PageNumber at least greater than or equal to 1."); RuleFor(x => x.PageSize) .GreaterThanOrEqualTo(1).WithMessage("PageSize at least greater than or equal to 1."); } } public class GetTodoItemsWithPaginationQuery : IRequest<PaginatedList<TodoItemDto>> { public int ListId { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 10; } public class TodoItemDto : IMapFrom<TodoItem> { public int Id { get; set; } public int ListId { get; set; } public string Title { get; set; } public bool Done { get; set; } public int Priority { get; set; } public string Note { get; set; } public void Mapping(Profile profile) { profile.CreateMap<TodoItem, TodoItemDto>() .ForMember(d => d.Priority, opt => opt.MapFrom(s => (int)s.Priority)); } } public class GetTodoItemsWithPaginationQueryHandler : IRequestHandler<GetTodoItemsWithPaginationQuery, PaginatedList<TodoItemDto>> { private readonly IApplicationDbContext _context; private readonly IMapper _mapper; public GetTodoItemsWithPaginationQueryHandler(IApplicationDbContext context, IMapper mapper) { _context = context; _mapper = mapper; } public async Task<PaginatedList<TodoItemDto>> Handle(GetTodoItemsWithPaginationQuery request, CancellationToken cancellationToken) { return await _context.TodoItems .Where(x => x.ListId == request.ListId) .OrderBy(x => x.Title) .ProjectTo<TodoItemDto>(_mapper.ConfigurationProvider) .PaginatedListAsync(request.PageNumber, request.PageSize); ; } } }