Index.cshtml.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using SharedKernel.Extensions;
  2. using SharedKernel.Helpers;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using Microsoft.AspNetCore.Mvc.Rendering;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Crypto.List
  10. {
  11. public class IndexModel(IMediator mediator) : PageModel
  12. {
  13. [BindProperty(SupportsGet = true)]
  14. public QueryParams Query { get; set; } = new();
  15. public List<SelectListItem> Categories { get; set; } = [];
  16. public sealed class QueryParams
  17. {
  18. [Range(1, int.MaxValue)]
  19. [DisplayName("페이지 번호")]
  20. public int PageNum { get; set; } = 1;
  21. [Range(1, 100)]
  22. [DisplayName("페이지 당 수")]
  23. public ushort PerPage { get; set; } = 20;
  24. [DisplayName("카테고리")]
  25. public int? CategoryID { get; set; }
  26. [DisplayName("검색어")]
  27. public string? Keyword { get; set; }
  28. public bool? IsActive { get; set; }
  29. public bool? IsWarning { get; set; }
  30. public bool? IsNew { get; set; }
  31. public bool? IsDelisted { get; set; }
  32. }
  33. public int Total { get; set; }
  34. public List<(
  35. int Num,
  36. int ID,
  37. string Symbol,
  38. string KorName,
  39. string EngName,
  40. string? LogoImage,
  41. IReadOnlyList<string> CategoryNames,
  42. char IsActive,
  43. char IsWarning,
  44. char IsNew,
  45. char IsDelisted,
  46. string? UpdatedAt,
  47. string CreatedAt,
  48. string EditURL
  49. )> List { get; set; } = [];
  50. public Pagination? Pagination { get; set; }
  51. public async Task OnGetAsync(CancellationToken ct)
  52. {
  53. if (!ModelState.IsValid)
  54. {
  55. return;
  56. }
  57. var categories = await mediator.Send(new GetCryptoCategories.Query(), ct);
  58. Categories = [..categories.List.Select(c => new SelectListItem(c.Name, c.ID.ToString()))];
  59. var result = await mediator.Send(new SearchCoins.Query(
  60. Query.CategoryID,
  61. Query.Keyword,
  62. Query.IsActive,
  63. Query.IsWarning,
  64. Query.IsNew,
  65. Query.IsDelisted,
  66. Query.PageNum,
  67. Query.PerPage
  68. ), ct);
  69. Total = result.Total;
  70. List = [..result.List.Select(c => (
  71. c.Num,
  72. c.ID,
  73. c.Symbol,
  74. c.KorName,
  75. c.EngName,
  76. c.LogoImage,
  77. c.CategoryNames,
  78. c.IsActive ? 'Y' : 'N',
  79. c.IsWarning ? 'Y' : 'N',
  80. c.IsNew ? 'Y' : 'N',
  81. c.IsDelisted ? 'Y' : 'N',
  82. c.UpdatedAt.GetDateAt() ?? "-",
  83. c.CreatedAt.GetDateAt(),
  84. EditURL: $"/Crypto/List/Edit/{c.ID}{Request.QueryString}"
  85. ))];
  86. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  87. }
  88. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  89. {
  90. try
  91. {
  92. await mediator.Send(new DeleteCoin.Command(ids), ct);
  93. TempData["SuccessMessage"] = $"{ids.Length}개 코인이 삭제되었습니다.";
  94. }
  95. catch (Exception e)
  96. {
  97. TempData["ErrorMessages"] = e.Message;
  98. }
  99. return RedirectToPage("/Crypto/List/Index", Query);
  100. }
  101. }
  102. }