using SharedKernel.Helpers; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Donation.Rank; public class IndexModel(IMediator mediator) : PageModel { [BindProperty(SupportsGet = true)] public QueryParams Query { get; set; } = new(); public sealed class QueryParams { [Range(1, int.MaxValue)] [DisplayName("페이지 번호")] public int PageNum { get; set; } = 1; [Range(1, 100)] [DisplayName("페이지 목록 수")] public ushort PerPage { get; set; } = 10; [DisplayName("검색 조건")] [Range(1, 7, ErrorMessage = "{0}이(가) 올바르지 않습니다.")] public int? Search { get; set; } [DisplayName("검색어")] [MaxLength(100, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string? Keyword { get; set; } [DisplayName("시작일")] public string? StartAt { get; set; } [DisplayName("종료일")] public string? EndAt { get; set; } [DisplayName("탭")] [Range(0, 6)] public int Tab { get; set; } = 0; [DisplayName("정렬")] [Range(1, 4)] public int Sort { get; set; } = 1; } public int Total { get; set; } = 0; public List List { get; set; } = []; public Pagination? Pagination { get; set; } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var result = await mediator.Send(new SearchDonationRanks.Query( Query.PageNum, Query.PerPage, Query.Search, Query.Keyword, Query.StartAt, Query.EndAt, Query.Tab, Query.Sort ), ct); Total = result.Total; List = [.. result.List]; Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage, Request.QueryString.ToString()); } }