// EN: Query to get merchant statistics for admin dashboard. // VI: Query để lấy thống kê merchant cho dashboard admin. using MediatR; using Microsoft.EntityFrameworkCore; using MerchantService.Domain.AggregatesModel.MerchantAggregate; using MerchantService.Domain.AggregatesModel.ShopAggregate; using MerchantService.Infrastructure; namespace MerchantService.API.Application.Queries.Admin; /// /// EN: Query to get merchant statistics (Admin only). /// VI: Query để lấy thống kê merchant (chỉ Admin). /// public record GetMerchantStatisticsQuery : IRequest; /// /// EN: Handler for GetMerchantStatisticsQuery. /// VI: Handler cho GetMerchantStatisticsQuery. /// public class GetMerchantStatisticsQueryHandler : IRequestHandler { private readonly MerchantServiceContext _context; public GetMerchantStatisticsQueryHandler(MerchantServiceContext context) { _context = context; } public async Task Handle( GetMerchantStatisticsQuery request, CancellationToken cancellationToken) { var merchantsQuery = _context.Merchants.Where(m => !m.IsDeleted); var totalMerchants = await merchantsQuery.CountAsync(cancellationToken); var pendingApproval = await merchantsQuery .CountAsync(m => m.StatusId == MerchantStatus.PendingApproval.Id, cancellationToken); var active = await merchantsQuery .CountAsync(m => m.StatusId == MerchantStatus.Active.Id, cancellationToken); var suspended = await merchantsQuery .CountAsync(m => m.StatusId == MerchantStatus.Suspended.Id, cancellationToken); var banned = await merchantsQuery .CountAsync(m => m.StatusId == MerchantStatus.Banned.Id, cancellationToken); var shopsQuery = _context.Shops.Where(s => !s.IsDeleted); var totalShops = await shopsQuery.CountAsync(cancellationToken); // EN: Active shops (published/active) // VI: Shops đang hoạt động var activeShops = await shopsQuery .CountAsync(s => s.StatusId == ShopStatus.Active.Id, cancellationToken); var totalStaff = await _context.MerchantStaff.CountAsync(cancellationToken); return new AdminMerchantStatisticsDto( totalMerchants, pendingApproval, active, suspended, banned, totalShops, activeShops, totalStaff); } }