using MediatR; using Netina.Domain.Dtos.ResponseDtos.Torob; 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.ToLowerInvariant().Trim(); int minSimilarityThreshold = 20; var products = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(p => FuzzySharp.Fuzz.PartialRatio(p.PersianName.ToLowerInvariant().Trim(), searchQuery) >= minSimilarityThreshold) .Select(ProductMapper.ProjectToSDto) .ToListAsync(cancellationToken); var categories = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(p => FuzzySharp.Fuzz.PartialRatio(p.Name.ToLowerInvariant().Trim(), searchQuery) >= minSimilarityThreshold) .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.ToLowerInvariant().Trim(); int minSimilarityThreshold = 20; var products = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(p => FuzzySharp.Fuzz.PartialRatio(p.PersianName.ToLowerInvariant().Trim(), searchQuery) >= minSimilarityThreshold) .Take(8) .Select(ProductMapper.ProjectToSDto) .ToListAsync(cancellationToken); var categories = await _repositoryWrapper.SetRepository() .TableNoTracking .Where(p => FuzzySharp.Fuzz.PartialRatio(p.Name.ToLowerInvariant().Trim(), searchQuery) >= minSimilarityThreshold) .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(); } }