using Netina.Domain.Entities.Brands; using Netina.Domain.Entities.Products; namespace Netina.Repository.Handlers.Brands; public class GetBrandsQueryHandler(IRepositoryWrapper repositoryWrapper, IMediator mediator) : IRequestHandler> { private readonly IMediator _mediator = mediator; public async Task> Handle(GetBrandsQuery request, CancellationToken cancellationToken) { IQueryable baseBrands; List brands = new List(); if (request.CategoryId != default) { //var products = await _mediator.Send(new GetProductsQuery(BrandIds: null,SpecialOffer: null, Page:0, SortBy: QuerySortBy.None,CategoryId: request.CategoryId, IsActive : null), // cancellationToken); var cats = await mediator.Send(new GetProductCategoryChildrenQuery(request.CategoryId), cancellationToken); var brandGrouped = await repositoryWrapper.SetRepository() .TableNoTracking .Where(p => cats.Contains(p.CategoryId)) .GroupBy(p=>p.BrandId) .ToListAsync(cancellationToken); foreach (var grouping in brandGrouped) { if (grouping.Key != default) { var brand = await repositoryWrapper.SetRepository() .TableNoTracking .Where(b => b.Id == grouping.Key) .Select(BrandMapper.ProjectToSDto) .FirstOrDefaultAsync(cancellationToken); if(brand!=null) brands.Add(brand); } } return brands; } if (request.BrandName != null) { baseBrands = repositoryWrapper.SetRepository() .TableNoTracking .Where(b => b.PersianName.Trim().Contains(request.BrandName.Trim())) .OrderByDescending(b => b.CreatedAt); } else { baseBrands = repositoryWrapper.SetRepository().TableNoTracking .OrderByDescending(b => b.CreatedAt); } if (request.Page != null) { brands = await baseBrands.Skip(request.Page.Value * 10).Take(10) .Select(BrandMapper.ProjectToSDto) .ToListAsync(cancellationToken); } else { brands = await baseBrands .Select(BrandMapper.ProjectToSDto) .ToListAsync(cancellationToken); } return brands; } }