diff --git a/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs b/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs index 485c05d..d6629d8 100644 --- a/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs +++ b/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs @@ -13,15 +13,21 @@ namespace GrossesMitainesAPI.Controllers; public class SearchController : Controller { private readonly ILogger _logger; private readonly InventoryContext _context; + private static List _searchCache = new(); + private static DateTime? _cacheDate; public SearchController(ILogger logger, InventoryContext context) { _logger = logger; _context = context; + if (_searchCache.Count == 0 || _cacheDate.HasValue && _cacheDate.Value.AddMinutes(5) < DateTime.Now) { + _searchCache = _context.Products.ToList(); + _cacheDate = DateTime.Now; + } } [EnableCors("_myAllowSpecificOrigins")] [HttpPost(Name = "Search")] - public IEnumerable Post(string query, bool? preview) { + public IEnumerable Post(string query, bool? preview, bool? deep) { const int PREVIEW = 3; List products = new(); @@ -29,21 +35,45 @@ public class SearchController : Controller { try { // Pour faire une liste priorisée. if (preview.HasValue && preview == true) - products = _context.Products.Where(x => x.Title.Contains(query)).Take(PREVIEW).ToList(); - else { - products = _context.Products.Where(x => x.Title.Replace(".", " ") - .Replace(",", " ") - .ToUpper() - .Contains(" " + query.ToUpper() + " ")) - .ToList(); + //products = _context.Products.Where(x => x.Title.Contains(query)).Take(PREVIEW).ToList(); + products = _searchCache.Where(x => x.Title.Contains(query)).Take(PREVIEW).ToList(); - foreach (Product prod in _context.Products.Where(x => x.Category.Contains(query)).ToList()) { - if (!products.Contains(prod)) - products.Add(prod); - } - foreach (Product prod in _context.Products.Where(x => x.Description.Contains(query)).ToList()) { - if (!products.Contains(prod)) - products.Add(prod); + else { + if (deep.HasValue && deep == true) { + List title = new(), desc = new(), cat = new(); + query = query.ToLower(); + + // foreach (Product prod in _context.Products.ToList()) { + foreach (Product prod in _searchCache) { + string sTitle = prod.Title.Replace(".", " ").Replace(",", " ").ToLower(), + sCat = prod.Category.Replace(".", " ").Replace(",", " ").ToLower(), + sDesc = prod.Description.Replace(".", " ").Replace(",", " ").ToLower(); + + if (sTitle.StartsWith(query)) + products.Add(prod); + else if (sTitle.Contains(" " + query + " ")) + title.Add(prod); + else if (sDesc.Contains(" " + query + " ")) + desc.Add(prod); + else if (sCat.Contains(" " + query + " ")) + cat.Add(prod); + } + products.AddRange(title); + products.AddRange(desc); + products.AddRange(cat); + + } else { + // products = _context.Products.Where(x => x.Title.Contains(query)).ToList(); + products = _searchCache.Where(x => x.Title.Contains(query)).ToList(); + + // foreach (Product prod in _context.Products.Where(x => x.Description.Contains(query)).ToList()) + foreach (Product prod in _searchCache.Where(x => x.Description.Contains(query)).ToList()) + if (!products.Contains(prod)) + products.Add(prod); + // foreach (Product prod in _context.Products.Where(x => x.Category.Contains(query)).ToList()) + foreach (Product prod in _searchCache.Where(x => x.Category.Contains(query)).ToList()) + if (!products.Contains(prod)) + products.Add(prod); } } } catch (Exception e) {