using SharedKernel.Helpers; using SharedKernel.Extensions; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Forum.Comments.List { public class IndexModel(IMediator mediator) : PageModel { [BindProperty(SupportsGet = true)] public QueryParams Query { get; set; } = new(); public sealed class QueryParams { public int? BoardID { get; set; } public int? Search { get; set; } public string? Keyword { get; set; } public string? StartAt { get; set; } public string? EndAt { get; set; } public int? Sort { get; set; } public bool? IsDeleted { get; set; } [Range(1, int.MaxValue)] [DisplayName("페이지 번호")] public int PageNum { get; set; } = 1; [Range(1, 100)] [DisplayName("페이지 목록 수")] public ushort PerPage { get; set; } = 20; } public int Total { get; set; } = 0; public List BoardList { get; set; } = []; public List<( int Num, int ID, int BoardID, string BoardName, int PostID, string PostSubject, string Content, string? Name, string? SID, bool IsReply, bool IsSecret, bool IsDeleted, int Likes, int Dislikes, int Reports, int Replies, string? UpdatedAt, string CreatedAt )> List { get; set; } = []; public Pagination? Pagination { get; set; } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var boards = await mediator.Send(new SearchBoards.Query(null, null, 1, 500), ct); BoardList = [..boards.List.Select(c => new SelectListItem { Value = c.ID.ToString(), Text = $"[{c.BoardGroupName}] {c.Name}" })]; var result = await mediator.Send(new SearchComments.Query( Query.BoardID, null, Query.Search, Query.Keyword, Query.StartAt, Query.EndAt, Query.IsDeleted, Query.PageNum, Query.PerPage ), ct); Total = result.Total; List = [..result.List.Select(c => ( c.Num, c.ID, c.BoardID, c.BoardName, c.PostID, c.PostSubject, c.Content, c.Name, c.SID, c.IsReply, c.IsSecret, c.IsDeleted, c.Likes, c.Dislikes, c.Reports, c.Replies, c.UpdatedAt.GetDateAt() ?? "-", c.CreatedAt.GetDateAt() ))]; Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage); } public async Task OnPostDeleteAsync(int[] ids, CancellationToken ct) { try { await mediator.Send(new DeleteComment.Command(ids), ct); TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Forum/Comments/List/Index", Query); } } }