diff --git a/GrossesMitaines/GrossesMitainesAPI/Controllers/InventoryController.cs b/GrossesMitaines/GrossesMitainesAPI/Controllers/InventoryController.cs index dc3be9a..6aafcb5 100644 --- a/GrossesMitaines/GrossesMitainesAPI/Controllers/InventoryController.cs +++ b/GrossesMitaines/GrossesMitainesAPI/Controllers/InventoryController.cs @@ -20,7 +20,7 @@ public class InventoryController : Controller { [EnableCors("_myAllowSpecificOrigins")] [HttpGet(Name = "Inventory")] // Pour faire des calls async par paquet de AMOUNT (5) (pour du loading en scrollant) - public IEnumerable Get(int? lastId, string? order, string? filterPrice, string? filterState) { + public IEnumerable Get(int? lastId, string? order, string? filterPrice, string? filterState, bool? all) { const int AMOUNT = 5; var ret = _context.Products.AsQueryable(); @@ -95,6 +95,8 @@ public class InventoryController : Controller { if (prod.Id == lastId) yup = true; } + else if (all.HasValue && all == true) + lst = ret.ToList(); else lst = ret.Take(AMOUNT).ToList(); return lst; diff --git a/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs b/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs index 3496ede..3292fcb 100644 --- a/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs +++ b/GrossesMitaines/GrossesMitainesAPI/Controllers/SearchController.cs @@ -13,27 +13,60 @@ 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; - HashSet products = new(); + List products = new(); query = query.Trim(); try { // Pour faire une liste priorisée. if (preview.HasValue && preview == true) - products = _context.Products.Where(x => x.Title.Contains(query)).Take(PREVIEW).ToHashSet(); + products = _searchCache.Where(x => x.Title.Contains(query)).Take(PREVIEW).ToList(); else { - products.Concat(_context.Products.Where(x => x.Title.Contains(query)).ToHashSet()); - products.Concat(_context.Products.Where(x => x.Category.Contains(query)).ToHashSet()); - products.Concat(_context.Products.Where(x => x.Description.Contains(query)).ToHashSet()); + if (deep.HasValue && deep == true) { + List title = new(), desc = new(), cat = new(); + query = query.ToLower(); + + 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 = _searchCache.Where(x => x.Title.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 _searchCache.Where(x => x.Category.Contains(query)).ToList()) + if (!products.Contains(prod)) + products.Add(prod); + } } } catch (Exception e) { _logger.LogError(8, e.Message);