Index.cshtml.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. [DisplayName("거래쌍 구분")]
  29. public ushort Tab { get; set; } = 0;
  30. public bool? IsActive { get; set; }
  31. public bool? IsWarning { get; set; }
  32. public bool? IsNew { get; set; }
  33. public bool? IsDelisted { get; set; }
  34. }
  35. public int Total { get; set; }
  36. public List<(
  37. int Num,
  38. int ID,
  39. string Market,
  40. string Symbol,
  41. string KorName,
  42. string EngName,
  43. string? LogoImage,
  44. IReadOnlyList<string> CategoryNames,
  45. char IsActive,
  46. char IsWarning,
  47. char IsNew,
  48. char IsDelisted,
  49. string? UpdatedAt,
  50. string CreatedAt,
  51. string EditURL
  52. )> List { get; set; } = [];
  53. public int AllCount { get; set; }
  54. public int KrwCount { get; set; }
  55. public int BtcCount { get; set; }
  56. public int UsdtCount { get; set; }
  57. public Pagination? Pagination { get; set; }
  58. public async Task OnGetAsync(CancellationToken ct)
  59. {
  60. if (!ModelState.IsValid)
  61. {
  62. return;
  63. }
  64. var categories = await mediator.Send(new GetCryptoCategories.Query(), ct);
  65. Categories = [..categories.List.Select(c => new SelectListItem(c.Name, c.ID.ToString()))];
  66. var result = await mediator.Send(new SearchCoins.Query(
  67. Query.CategoryID,
  68. Query.Keyword,
  69. Query.IsActive,
  70. Query.IsWarning,
  71. Query.IsNew,
  72. Query.IsDelisted,
  73. Query.PageNum,
  74. Query.PerPage,
  75. Query.Tab
  76. ), ct);
  77. Total = result.Total;
  78. AllCount = result.AllCount;
  79. KrwCount = result.KrwCount;
  80. BtcCount = result.BtcCount;
  81. UsdtCount = result.UsdtCount;
  82. List = [..result.List.Select(c => (
  83. c.Num,
  84. c.ID,
  85. string.Join(", ", c.CoinMarkets.Select(x => x.Market)),
  86. c.Symbol,
  87. c.KorName,
  88. c.EngName,
  89. c.LogoImage,
  90. c.CategoryNames,
  91. c.IsActive ? 'Y' : 'N',
  92. c.IsWarning ? 'Y' : 'N',
  93. c.IsNew ? 'Y' : 'N',
  94. c.IsDelisted ? 'Y' : 'N',
  95. c.UpdatedAt.GetDateAt() ?? "-",
  96. c.CreatedAt.GetDateAt(),
  97. EditURL: $"/Crypto/List/Edit/{c.ID}{Request.QueryString}"
  98. ))];
  99. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  100. }
  101. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  102. {
  103. try
  104. {
  105. await mediator.Send(new DeleteCoin.Command(ids), ct);
  106. TempData["SuccessMessage"] = $"{ids.Length}개 코인이 삭제되었습니다.";
  107. }
  108. catch (Exception e)
  109. {
  110. TempData["ErrorMessages"] = e.Message;
  111. }
  112. return RedirectToPage("/Crypto/List/Index", Query);
  113. }
  114. public async Task<IActionResult> OnPostSyncAsync(CancellationToken ct)
  115. {
  116. try
  117. {
  118. var result = await mediator.Send(new SyncCoins.Command(), ct);
  119. TempData["SuccessMessage"] = $"동기화 완료: 신규 {result.Created}개, 갱신 {result.Updated}개, 상폐 {result.Delisted}개";
  120. }
  121. catch (Exception e)
  122. {
  123. TempData["ErrorMessages"] = e.Message;
  124. }
  125. return RedirectToPage("/Crypto/List/Index", Query);
  126. }
  127. }
  128. }