using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Channel.GetByCode; public sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { if (string.IsNullOrWhiteSpace(request.Code)) { return Result.Failure(Error.NotFound("Channel.CodeRequired", "후원 코드를 입력해 주세요.")); } // 후원 코드 정규화 (uppercase). SearchForOrder 와 동일 규약. var normalized = request.Code.Trim().ToUpperInvariant(); var channel = await db.Channel.AsNoTracking() .Where(c => c.IsActive && c.MemberID != request.MemberID && c.DonationCode == normalized) .Select(c => new Response( c.ID, c.SID, c.Name, c.Handle, c.ThumbnailUrl, c.SubscriberCount, c.IsVerified, c.DonationCode )) .FirstOrDefaultAsync(ct); if (channel is null) { return Result.Failure(Error.NotFound("Channel.NotFound", "해당 후원 코드의 채널을 찾을 수 없습니다.")); } return Result.Success(channel); } }