using Microsoft.EntityFrameworkCore; using Netina.Domain.CommandQueries.Queries; using Netina.Domain.Dtos.SmallDtos; using Netina.Domain.Entities.Brands; using Netina.Domain.Entities.Products; using Netina.Repository.Repositories.Base.Contracts; namespace Netina.Repository.Handlers.Brands; public class GetBrandsQueryHandler : IRequestHandler> { private readonly IRepositoryWrapper _repositoryWrapper; private readonly IMediator _mediator; public GetBrandsQueryHandler(IRepositoryWrapper repositoryWrapper,IMediator mediator) { _repositoryWrapper = repositoryWrapper; _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 brandGrouped = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(p => p.CategoryId == request.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; } }