using Application.Abstractions.Messaging; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Admin.Pages.Channel.YouTubePubSub; public class IndexModel(IMediator mediator) : PageModel { public GetYouTubePubSub.Response Data { get; set; } = new([], 0, 0, string.Empty); public GetYouTubeLiveStatus.Response LiveStatus { get; set; } = new([]); public GetYouTubeHealth.Response Health { get; set; } = new( false, null, false, null, string.Empty, 3, 0, 0, 0, 0, []); public async Task OnGetAsync(CancellationToken ct) { Data = await mediator.Send(new GetYouTubePubSub.Query(), ct); LiveStatus = await mediator.Send(new GetYouTubeLiveStatus.Query(), ct); Health = await mediator.Send(new GetYouTubeHealth.Query(), ct); } public async Task OnPostResubscribeAsync(string youtubeChannelID, CancellationToken ct) { if (string.IsNullOrWhiteSpace(youtubeChannelID)) { TempData["ErrorMessages"] = "YouTube Channel ID가 필요합니다."; return RedirectToPage("/Channel/YouTubePubSub/Index"); } try { await mediator.Send(new ResubscribeYouTubePubSub.Command(youtubeChannelID), ct); TempData["SuccessMessage"] = $"{youtubeChannelID} 재구독 요청 완료."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } public async Task OnPostUnsubscribeAsync(string youtubeChannelID, CancellationToken ct) { if (string.IsNullOrWhiteSpace(youtubeChannelID)) { TempData["ErrorMessages"] = "YouTube Channel ID가 필요합니다."; return RedirectToPage("/Channel/YouTubePubSub/Index"); } try { await mediator.Send(new UnsubscribeYouTubePubSub.Command(youtubeChannelID), ct); TempData["SuccessMessage"] = $"{youtubeChannelID} 구독 해지 요청 완료."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } public async Task OnPostManualDetectAsync(string videoID, string youtubeChannelID, CancellationToken ct) { try { await mediator.Send(new ManualDetectYouTubeLive.Command(videoID, youtubeChannelID), ct); TempData["SuccessMessage"] = $"수동 감지 트리거 완료 — videoId={videoID}. 로그에서 라이브 판별 결과를 확인하세요."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } public async Task OnPostForceLiveAsync(string videoID, string youtubeChannelID, string? title, CancellationToken ct) { try { var result = await mediator.Send(new ForceYouTubeLive.Command(youtubeChannelID, videoID, title), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; } else { TempData["SuccessMessage"] = $"라이브 강제 마킹 완료 — videoId={videoID} (quota 0). 사이드바 즉시 갱신."; } } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } public async Task OnPostForceOfflineAsync(string youtubeChannelID, CancellationToken ct) { try { var result = await mediator.Send(new ForceYouTubeOffline.Command(youtubeChannelID), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; } else { TempData["SuccessMessage"] = $"라이브 강제 종료 완료 — channelId={youtubeChannelID} (quota 0)."; } } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } public async Task OnPostTestApiKeyAsync(CancellationToken ct) { try { var result = await mediator.Send(new TestYouTubeApiKey.Command(), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; } else if (result.Value.Ok) { TempData["SuccessMessage"] = $"API 키 정상 — 테스트 채널 '{result.Value.TestedChannelName}' 조회 성공 ({result.Value.ElapsedMs}ms)."; } else { TempData["ErrorMessages"] = $"API 키 테스트 실패 ({result.Value.ElapsedMs}ms): {result.Value.ErrorMessage}"; } } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Channel/YouTubePubSub/Index"); } }