using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.V1.Channels.GetByCode; internal sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { if (string.IsNullOrWhiteSpace(request.Code)) { return Result.Failure(Error.Problem("Channel.CodeRequired", "후원 코드는 필수입니다.")); } var code = request.Code.Trim().ToUpperInvariant(); var channel = await db.Channel .AsNoTracking() .Where(c => c.DonationCode == code) .Select(c => new { c.SID, c.Name, c.IsActive, MemberGone = c.Member.IsWithdraw || c.Member.DeletedAt != null }) .FirstOrDefaultAsync(ct); if (channel is null) { return Result.Failure(Error.NotFound("Channel.NotFound", "해당 후원 코드의 채널을 찾을 수 없습니다.")); } return Result.Success(new Response( channel.SID, channel.Name, code, channel.IsActive && !channel.MemberGone )); } }