Index.cshtml.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using Application.Abstractions.Messaging;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.AspNetCore.Mvc.RazorPages;
  4. namespace Admin.Pages.Channel.YouTubePubSub;
  5. public class IndexModel(IMediator mediator) : PageModel
  6. {
  7. public GetYouTubePubSub.Response Data { get; set; } = new([], 0, 0, string.Empty);
  8. public GetYouTubeLiveStatus.Response LiveStatus { get; set; } = new([]);
  9. public GetYouTubeHealth.Response Health { get; set; } = new(
  10. false, null, false, null, string.Empty, 3,
  11. 0, 0, 0, 0, []);
  12. public async Task OnGetAsync(CancellationToken ct)
  13. {
  14. Data = await mediator.Send(new GetYouTubePubSub.Query(), ct);
  15. LiveStatus = await mediator.Send(new GetYouTubeLiveStatus.Query(), ct);
  16. Health = await mediator.Send(new GetYouTubeHealth.Query(), ct);
  17. }
  18. public async Task<IActionResult> OnPostResubscribeAsync(string youtubeChannelID, CancellationToken ct)
  19. {
  20. if (string.IsNullOrWhiteSpace(youtubeChannelID))
  21. {
  22. TempData["ErrorMessages"] = "YouTube Channel ID가 필요합니다.";
  23. return RedirectToPage("/Channel/YouTubePubSub/Index");
  24. }
  25. try
  26. {
  27. await mediator.Send(new ResubscribeYouTubePubSub.Command(youtubeChannelID), ct);
  28. TempData["SuccessMessage"] = $"{youtubeChannelID} 재구독 요청 완료.";
  29. }
  30. catch (Exception e)
  31. {
  32. TempData["ErrorMessages"] = e.Message;
  33. }
  34. return RedirectToPage("/Channel/YouTubePubSub/Index");
  35. }
  36. public async Task<IActionResult> OnPostUnsubscribeAsync(string youtubeChannelID, CancellationToken ct)
  37. {
  38. if (string.IsNullOrWhiteSpace(youtubeChannelID))
  39. {
  40. TempData["ErrorMessages"] = "YouTube Channel ID가 필요합니다.";
  41. return RedirectToPage("/Channel/YouTubePubSub/Index");
  42. }
  43. try
  44. {
  45. await mediator.Send(new UnsubscribeYouTubePubSub.Command(youtubeChannelID), ct);
  46. TempData["SuccessMessage"] = $"{youtubeChannelID} 구독 해지 요청 완료.";
  47. }
  48. catch (Exception e)
  49. {
  50. TempData["ErrorMessages"] = e.Message;
  51. }
  52. return RedirectToPage("/Channel/YouTubePubSub/Index");
  53. }
  54. public async Task<IActionResult> OnPostManualDetectAsync(string videoID, string youtubeChannelID, CancellationToken ct)
  55. {
  56. try
  57. {
  58. await mediator.Send(new ManualDetectYouTubeLive.Command(videoID, youtubeChannelID), ct);
  59. TempData["SuccessMessage"] = $"수동 감지 트리거 완료 — videoId={videoID}. 로그에서 라이브 판별 결과를 확인하세요.";
  60. }
  61. catch (Exception e)
  62. {
  63. TempData["ErrorMessages"] = e.Message;
  64. }
  65. return RedirectToPage("/Channel/YouTubePubSub/Index");
  66. }
  67. public async Task<IActionResult> OnPostForceLiveAsync(string videoID, string youtubeChannelID, string? title, CancellationToken ct)
  68. {
  69. try
  70. {
  71. var result = await mediator.Send(new ForceYouTubeLive.Command(youtubeChannelID, videoID, title), ct);
  72. if (result.IsFailure)
  73. {
  74. TempData["ErrorMessages"] = result.Error.Description;
  75. }
  76. else
  77. {
  78. TempData["SuccessMessage"] = $"라이브 강제 마킹 완료 — videoId={videoID} (quota 0). 사이드바 즉시 갱신.";
  79. }
  80. }
  81. catch (Exception e)
  82. {
  83. TempData["ErrorMessages"] = e.Message;
  84. }
  85. return RedirectToPage("/Channel/YouTubePubSub/Index");
  86. }
  87. public async Task<IActionResult> OnPostForceOfflineAsync(string youtubeChannelID, CancellationToken ct)
  88. {
  89. try
  90. {
  91. var result = await mediator.Send(new ForceYouTubeOffline.Command(youtubeChannelID), ct);
  92. if (result.IsFailure)
  93. {
  94. TempData["ErrorMessages"] = result.Error.Description;
  95. }
  96. else
  97. {
  98. TempData["SuccessMessage"] = $"라이브 강제 종료 완료 — channelId={youtubeChannelID} (quota 0).";
  99. }
  100. }
  101. catch (Exception e)
  102. {
  103. TempData["ErrorMessages"] = e.Message;
  104. }
  105. return RedirectToPage("/Channel/YouTubePubSub/Index");
  106. }
  107. public async Task<IActionResult> OnPostTestApiKeyAsync(CancellationToken ct)
  108. {
  109. try
  110. {
  111. var result = await mediator.Send(new TestYouTubeApiKey.Command(), ct);
  112. if (result.IsFailure)
  113. {
  114. TempData["ErrorMessages"] = result.Error.Description;
  115. }
  116. else if (result.Value.Ok)
  117. {
  118. TempData["SuccessMessage"] = $"API 키 정상 — 테스트 채널 '{result.Value.TestedChannelName}' 조회 성공 ({result.Value.ElapsedMs}ms).";
  119. }
  120. else
  121. {
  122. TempData["ErrorMessages"] = $"API 키 테스트 실패 ({result.Value.ElapsedMs}ms): {result.Value.ErrorMessage}";
  123. }
  124. }
  125. catch (Exception e)
  126. {
  127. TempData["ErrorMessages"] = e.Message;
  128. }
  129. return RedirectToPage("/Channel/YouTubePubSub/Index");
  130. }
  131. }