using Netina.Domain.Dtos.ResponseDtos.Zarehbin; using Netina.Domain.Entities.ProductCategories; namespace Netina.Core.CoreServices; public class SearchService : ISearchService { private readonly IRepositoryWrapper _repositoryWrapper; public SearchService(IRepositoryWrapper repositoryWrapper) { _repositoryWrapper = repositoryWrapper; } public async Task SearchAsync(string name, CancellationToken cancellationToken = default) { var searchQuery = name; var products = await _repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery)) .Select(ProductMapper.ProjectToSDto) .ToListAsync(cancellationToken); var categories = await _repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name, searchQuery)) .Select(ProductCategoryMapper.ProjectToSDto) .ToListAsync(cancellationToken); return new SearchResponseDto { Products = products.Select(p => p.Adapt()).ToList(), Categories = categories.Select(c => c.Adapt()).ToList() }; } public async Task ThumbSearchAsync(string name, CancellationToken cancellationToken = default) { var searchQuery = name; var products = await _repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.PersianName, searchQuery)) .Take(8) .Select(ProductMapper.ProjectToSDto) .ToListAsync(cancellationToken); var categories = await _repositoryWrapper.SetRepository() .TableNoTracking .OrderByDescending(p => EF.Functions.TrigramsSimilarity(p.Name.ToLower().Trim(), searchQuery)) .Take(8) .Select(ProductCategoryMapper.ProjectToSDto) .ToListAsync(cancellationToken); return new SearchResponseDto { Products = products.Select(p => p.Adapt()).ToList(), Categories = categories.Select(c => c.Adapt()).ToList() }; } public Task ZarehbinAsync(int page, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } public Task ZarehbinAsync(Guid productId, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } }