Index.cshtml.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using SharedKernel.Helpers;
  2. using SharedKernel.Extensions;
  3. using Application.Abstractions.YouTube;
  4. using MediatR;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.RazorPages;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Channel.List
  10. {
  11. public class IndexModel(IMediator mediator, IYouTubeLiveStateStore liveStateStore) : PageModel
  12. {
  13. [BindProperty(SupportsGet = true)]
  14. public QueryParams Query { get; set; } = new();
  15. public sealed class QueryParams
  16. {
  17. public int? Search { get; set; }
  18. public string? Keyword { get; set; }
  19. public string? StartAt { get; set; }
  20. public string? EndAt { get; set; }
  21. public bool? IsVerified { get; set; }
  22. [Range(1, int.MaxValue)]
  23. [DisplayName("페이지 번호")]
  24. public int PageNum { get; set; } = 1;
  25. [Range(1, 100)]
  26. [DisplayName("페이지 목록 수")]
  27. public ushort PerPage { get; set; } = 20;
  28. }
  29. public int Total { get; set; } = 0;
  30. public List<(
  31. int Num,
  32. int ID,
  33. string SID,
  34. string Name,
  35. string? Handle,
  36. string YouTubeUrl,
  37. decimal PlatformFeeRate,
  38. char IsVerified,
  39. char IsActive,
  40. int MemberID,
  41. string? MemberName,
  42. string? MemberEmail,
  43. string? UpdatedAt,
  44. string CreatedAt
  45. )> List { get; set; } = [];
  46. public Pagination? Pagination { get; set; }
  47. /// <summary>현재 라이브 중인 채널 SID(=YouTube 채널 ID) 집합</summary>
  48. public HashSet<string> LiveChannelIds { get; set; } = [];
  49. public async Task OnGetAsync(CancellationToken ct)
  50. {
  51. if (!ModelState.IsValid)
  52. {
  53. return;
  54. }
  55. var result = await mediator.Send(new SearchChannels.Query(
  56. Query.Search,
  57. Query.Keyword,
  58. Query.IsVerified,
  59. Query.StartAt,
  60. Query.EndAt,
  61. Query.PageNum,
  62. Query.PerPage
  63. ), ct);
  64. Total = result.Total;
  65. List = [..result.List.Select(c => (
  66. c.Num,
  67. c.ID,
  68. c.SID,
  69. c.Name,
  70. c.Handle,
  71. c.YouTubeUrl,
  72. c.PlatformFeeRate,
  73. c.IsVerified ? 'Y' : 'N',
  74. c.IsActive ? 'Y' : 'N',
  75. c.MemberID,
  76. c.MemberName ?? "-",
  77. c.MemberEmail ?? "-",
  78. c.UpdatedAt.GetDateAt() ?? "-",
  79. c.CreatedAt.GetDateAt()
  80. ))];
  81. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  82. // Redis에서 현재 라이브 중인 채널 ID 조회 (API 호출 없음)
  83. var allLive = await liveStateStore.GetAllLiveAsync();
  84. LiveChannelIds = [..allLive.Select(l => l.ChannelId)];
  85. }
  86. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  87. {
  88. try
  89. {
  90. await mediator.Send(new DeleteChannel.Command(ids), ct);
  91. TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
  92. }
  93. catch (Exception e)
  94. {
  95. TempData["ErrorMessages"] = e.Message;
  96. }
  97. return RedirectToPage("/Channel/List/Index", Query);
  98. }
  99. }
  100. }