using Application.Abstractions.Data; using Application.Abstractions.Messaging; using SharedKernel.Results; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.DonationRemote.GetCrews; internal sealed class Handler(IAppDbContext db) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var channel = await db.Channel.AsNoTracking() .Where(c => c.WidgetToken == request.WidgetToken && c.IsActive) .Select(c => new { c.ID, c.MemberID }) .FirstOrDefaultAsync(ct); if (channel is null) { return Result.Failure(Error.NotFound("Channel.NotFound", "채널을 찾을 수 없습니다.")); } if (channel.MemberID != request.RequesterMemberID) { return Result.Failure(Error.Forbidden("Remote.Forbidden", "권한이 없습니다.")); } var crews = await db.Crew.AsNoTracking() .Where(c => c.ChannelID == channel.ID && c.IsActive) .OrderByDescending(c => c.CreatedAt) .Select(c => new CrewItem( c.ID, c.Name, c.Description, c.MinAmount, c.Members.Count(m => m.IsActive) )) .ToListAsync(ct); return Result.Success(new Response(crews)); } }