using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Admin.Developers.Accounts.ListDevelopers; internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var page = Math.Max(1, request.PageNum); var size = Math.Clamp(request.PerPage <= 0 ? 20 : request.PerPage, 1, 100); var keyword = request.Keyword?.Trim(); var query = db.Developer.AsQueryable(); if (request.ApprovalStatus.HasValue) { query = query.Where(c => c.ApprovalStatus == request.ApprovalStatus.Value); } if (request.KycStatus.HasValue) { query = query.Where(c => c.KycStatus == request.KycStatus.Value); } if (!string.IsNullOrEmpty(keyword)) { query = query.Where(c => c.CompanyName.Contains(keyword) || c.BusinessNumber.Contains(keyword) || c.CeoName.Contains(keyword) || c.ContactName.Contains(keyword) || (c.Member != null && c.Member.Email.Contains(keyword)) ); } var total = await query.CountAsync(ct); var list = await query .OrderByDescending(c => c.CreatedAt) .Skip((page - 1) * size) .Take(size) .Select(c => new DeveloperRow( c.ID, c.MemberID, c.Member!.Email, c.Member.Name, c.CompanyName, c.BusinessNumber, c.CeoName, c.ContactName, c.ContactPhone, c.KycStatus, c.KycVerifiedAt, c.ApprovalStatus, c.ApprovalReason, c.ApprovedAt, c.CreatedAt )) .ToListAsync(ct); return new Response(total, list); } }