diff --git a/RhSolutions.AddIn/Services/DatabaseClient.cs b/RhSolutions.AddIn/Services/DatabaseClient.cs index efcf607..28caa09 100644 --- a/RhSolutions.AddIn/Services/DatabaseClient.cs +++ b/RhSolutions.AddIn/Services/DatabaseClient.cs @@ -21,36 +21,62 @@ public class DatabaseClient : IDatabaseClient public async Task> GetProducts(string line) { string request; + IEnumerable products; if (ProductSku.TryParse(line, out var skus)) { - request = @"https://rh.cebotari.ru/api/products/" + skus.FirstOrDefault().ToString(); + ProductSku sku = skus.FirstOrDefault(); + request = @"https://rh.cebotari.ru/api/products/" + sku.ToString(); + + if (!_memoryCache.TryGetValue(sku, out products)) + { + var response = await _httpClient.GetAsync(request); + + try + { + response.EnsureSuccessStatusCode(); + string json = await response.Content.ReadAsStringAsync(); + products = JsonConvert.DeserializeObject>(json) ?? Enumerable.Empty(); + } + catch + { + StatusCode = response.StatusCode; + } + + var cacheEntryOptions = new MemoryCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(1)); + _memoryCache.Set(sku, products, cacheEntryOptions); + } } else { request = @"https://rh.cebotari.ru/api/search?query=" + line; - } - - if (!_memoryCache.TryGetValue(line, out IEnumerable products)) - { - var response = await _httpClient.GetAsync(request); - - try + + if (!_memoryCache.TryGetValue(line, out products)) { - response.EnsureSuccessStatusCode(); - string json = await response.Content.ReadAsStringAsync(); - products = JsonConvert.DeserializeObject>(json) ?? Enumerable.Empty(); - } - catch - { - StatusCode = response.StatusCode; - } + var response = await _httpClient.GetAsync(request); - var cacheEntryOptions = new MemoryCacheEntryOptions() - .SetSlidingExpiration(TimeSpan.FromHours(1)); - _memoryCache.Set(line, products, cacheEntryOptions); - } + try + { + response.EnsureSuccessStatusCode(); + string json = await response.Content.ReadAsStringAsync(); + products = JsonConvert.DeserializeObject>(json) ?? Enumerable.Empty(); + } + catch + { + StatusCode = response.StatusCode; + } + + var cacheEntryOptions = new MemoryCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(1)); + _memoryCache.Set(line, products, cacheEntryOptions); + if (products.Count() > 0) + { + _memoryCache.Set(products.First(), products, cacheEntryOptions); + } + } + } return products; }