// EN: Query to get merchant details for admin. // VI: Query để lấy chi tiết merchant cho admin. using MediatR; using Microsoft.EntityFrameworkCore; using MerchantService.Domain.Exceptions; using MerchantService.Infrastructure; namespace MerchantService.API.Application.Queries.Admin; /// /// EN: Query to get detailed merchant information (Admin only). /// VI: Query để lấy thông tin chi tiết merchant (chỉ Admin). /// public record GetMerchantDetailQuery(Guid MerchantId) : IRequest; /// /// EN: Handler for GetMerchantDetailQuery. /// VI: Handler cho GetMerchantDetailQuery. /// public class GetMerchantDetailQueryHandler : IRequestHandler { private readonly MerchantServiceContext _context; public GetMerchantDetailQueryHandler(MerchantServiceContext context) { _context = context; } public async Task Handle( GetMerchantDetailQuery request, CancellationToken cancellationToken) { var merchant = await _context.Merchants .AsNoTracking() .Where(m => m.Id == request.MerchantId && !EF.Property(m, "_isDeleted")) .FirstOrDefaultAsync(cancellationToken) ?? throw new DomainException($"Merchant {request.MerchantId} not found"); var shopsCount = await _context.Shops .CountAsync(s => s.MerchantId == request.MerchantId && !EF.Property(s, "_isDeleted"), cancellationToken); var staffCount = await _context.MerchantStaff .CountAsync(s => s.MerchantId == request.MerchantId, cancellationToken); var businessInfo = merchant.BusinessInfo != null ? new AdminBusinessInfoDto( merchant.BusinessInfo.TaxId, merchant.BusinessInfo.BusinessLicenseNumber, merchant.BusinessInfo.CompanyRegistrationNumber, null, null, null) : null; var settlementConfig = merchant.SettlementConfig != null ? new AdminSettlementConfigDto( merchant.SettlementConfig.CommissionRate, merchant.SettlementConfig.SettlementCycleId.ToString(), merchant.SettlementConfig.BankAccount?.ToString()) : null; return new AdminMerchantDetailDto( merchant.Id, merchant.UserId, merchant.BusinessName, merchant.Type.Name, merchant.Status.Name, merchant.VerificationStatus.Name, businessInfo, settlementConfig, shopsCount, staffCount, merchant.CreatedAt, merchant.UpdatedAt, merchant.VerifiedAt, merchant.VerifiedBy); } }