Handler.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Abstractions.YouTube;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Api.Channel.Get;
  7. public sealed class Handler(IAppDbContext db, IYouTubeLiveStateStore liveStateStore, IYouTubeChannelCache channelCache) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var channel = await db.Channel.AsNoTracking().FirstOrDefaultAsync(c => c.SID == request.ChannelSID && c.IsActive, ct);
  12. if (channel is null)
  13. {
  14. return Result.Failure<Response>(Error.NotFound("Channel.NotFound", "채널을 찾을 수 없습니다."));
  15. }
  16. var liveInfo = await liveStateStore.GetLiveAsync(channel.SID);
  17. var ytInfo = await channelCache.GetAsync(channel.SID);
  18. return new Response(
  19. channel.SID,
  20. channel.Name,
  21. channel.Handle,
  22. channel.YouTubeUrl,
  23. ytInfo?.ThumbnailUrl,
  24. ytInfo?.BannerUrl,
  25. ytInfo?.Description,
  26. ytInfo?.SubscriberCount ?? 0,
  27. ytInfo?.VideoCount ?? 0,
  28. channel.IsVerified,
  29. liveInfo is not null,
  30. liveInfo?.VideoId,
  31. liveInfo?.Title
  32. );
  33. }
  34. }