Index.cshtml.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using SharedKernel.Extensions;
  2. using SharedKernel.Helpers;
  3. using Application.Abstractions.Messaging;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Store.Game;
  9. public class IndexModel(IMediator mediator) : PageModel
  10. {
  11. [BindProperty(SupportsGet = true)]
  12. public QueryParams Query { get; set; } = new();
  13. public sealed class QueryParams
  14. {
  15. [Range(1, int.MaxValue)]
  16. [DisplayName("페이지 번호")]
  17. public int PageNum { get; set; } = 1;
  18. [Range(1, 100)]
  19. [DisplayName("페이지 목록 수")]
  20. public ushort PerPage { get; set; } = 20;
  21. [DisplayName("검색 조건")]
  22. [Range(1, 5, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
  23. public int? Search { get; set; }
  24. [DisplayName("검색어")]
  25. [MaxLength(100, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  26. public string? Keyword { get; set; }
  27. [DisplayName("시작일")]
  28. public string? StartAt { get; set; }
  29. [DisplayName("종료일")]
  30. public string? EndAt { get; set; }
  31. [DisplayName("활성화")]
  32. public int? IsActive { get; set; }
  33. }
  34. public int Total { get; set; }
  35. public List<(
  36. int Num,
  37. int ID,
  38. string? Code,
  39. string KorName,
  40. string? EngName,
  41. string Publisher,
  42. string? Thumbnail,
  43. decimal CommissionRate,
  44. string? Link,
  45. char IsActive,
  46. int Order,
  47. int ProductCount,
  48. string? UpdatedAt,
  49. string CreatedAt,
  50. string EditURL
  51. )> List { get; set; } = [];
  52. public Pagination? Pagination { get; set; }
  53. public async Task OnGetAsync(CancellationToken ct)
  54. {
  55. if (!ModelState.IsValid)
  56. {
  57. return;
  58. }
  59. // IsActive: 1=활성만, 2=비활성만, null=전체
  60. bool? isActive = Query.IsActive switch
  61. {
  62. 1 => true,
  63. 2 => false,
  64. _ => null
  65. };
  66. var result = await mediator.Send(new SearchGames.Query(
  67. Query.Search,
  68. Query.Keyword,
  69. Query.StartAt,
  70. Query.EndAt,
  71. isActive,
  72. Query.PageNum,
  73. Query.PerPage
  74. ), ct);
  75. Total = result.Total;
  76. var qs = Request.QueryString.ToString();
  77. List = [.. result.List.Select(c => (
  78. c.Num,
  79. c.ID,
  80. c.Code,
  81. c.KorName,
  82. c.EngName,
  83. c.Publisher,
  84. c.Thumbnail,
  85. c.CommissionRate,
  86. c.Link,
  87. c.IsActive ? 'Y' : 'N',
  88. c.Order,
  89. c.ProductCount,
  90. c.UpdatedAt.GetDateAt() ?? "-",
  91. c.CreatedAt.GetDateAt(),
  92. EditURL: $"/Store/Game/Edit/{c.ID}{qs}"
  93. ))];
  94. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  95. }
  96. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  97. {
  98. try
  99. {
  100. if (ids is null || ids.Length == 0)
  101. {
  102. throw new Exception("삭제할 항목을 선택해주세요.");
  103. }
  104. var result = await mediator.Send(new DeleteGame.Command(ids), ct);
  105. if (result.IsFailure)
  106. {
  107. throw new Exception(result.Error.Description);
  108. }
  109. TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
  110. }
  111. catch (Exception e)
  112. {
  113. TempData["ErrorMessages"] = e.Message;
  114. }
  115. return Redirect($"{Request.Path}{Request.QueryString}");
  116. }
  117. }