diff --git a/src/FrontOffice.Main/ConfigureServices.cs b/src/FrontOffice.Main/ConfigureServices.cs index ba0b7fc..d42c2dd 100644 --- a/src/FrontOffice.Main/ConfigureServices.cs +++ b/src/FrontOffice.Main/ConfigureServices.cs @@ -75,6 +75,8 @@ public static class ConfigureServices services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); + // Products gRPC + services.AddScoped(CreateAuthenticatedClient); services.AddScoped(CreateAuthenticatedClient); return services; diff --git a/src/FrontOffice.Main/FrontOffice.Main.csproj b/src/FrontOffice.Main/FrontOffice.Main.csproj index 65a8f37..1172bdf 100644 --- a/src/FrontOffice.Main/FrontOffice.Main.csproj +++ b/src/FrontOffice.Main/FrontOffice.Main.csproj @@ -14,6 +14,7 @@ + diff --git a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor index d1269c8..d0bfdd3 100644 --- a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor +++ b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor @@ -33,11 +33,24 @@ else @_product.Description @FormatPrice(_product.Price) - - - افزودن به سبد - مشاهده سبد - + + + + + + افزودن به سبد + مشاهده سبد + + + + + + + + افزودن به سبد + مشاهده سبد + + diff --git a/src/FrontOffice.Main/Utilities/ProductService.cs b/src/FrontOffice.Main/Utilities/ProductService.cs index 37ac5e0..a406403 100644 --- a/src/FrontOffice.Main/Utilities/ProductService.cs +++ b/src/FrontOffice.Main/Utilities/ProductService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using FrontOffice.BFF.Products.Protobuf.Protos.Products; namespace FrontOffice.Main.Utilities; @@ -15,30 +16,76 @@ public class ProductService new(5, "فشارسنج دیجیتال", "فشارسنج بازویی دیجیتال با حافظه داخلی.", "/images/store/bp-monitor.jpg", 1259000) }; - private readonly ConcurrentDictionary _products = new(); + private readonly ConcurrentDictionary _cache = new(); + private readonly ProductsContract.ProductsContractClient _client; - public ProductService() + public ProductService(ProductsContract.ProductsContractClient client) { - foreach (var p in _seed) _products[p.Id] = p; + _client = client; + foreach (var p in _seed) _cache[p.Id] = p; } - public Task> GetProductsAsync(string? query = null) + public async Task> GetProductsAsync(string? query = null) { - IEnumerable list = _products.Values.OrderBy(p => p.Id); - if (!string.IsNullOrWhiteSpace(query)) + try { - query = query.Trim(); - list = list.Where(p => - p.Title.Contains(query, StringComparison.OrdinalIgnoreCase) || - p.Description.Contains(query, StringComparison.OrdinalIgnoreCase)); + var resp = await _client.GetAllProductsByFilterAsync(new GetAllProductsByFilterRequest + { + Filter = new GetAllProductsByFilterFilter + { + Title = query ?? string.Empty, + Description = query ?? string.Empty, + ShortInfomation = query ?? string.Empty, + FullInformation = query ?? string.Empty + } + }); + return MapAndCache(resp.Models); + } + catch + { + IEnumerable list = _cache.Values; + if (!string.IsNullOrWhiteSpace(query)) + { + var q = query.Trim(); + list = list.Where(p => p.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || p.Description.Contains(q, StringComparison.OrdinalIgnoreCase)); + } + return list.OrderBy(p => p.Id).ToList(); } - return Task.FromResult(list.ToList()); } - public Task GetByIdAsync(long id) + public async Task GetByIdAsync(long id) { - _products.TryGetValue(id, out var result); - return Task.FromResult(result); + if (_cache.TryGetValue(id, out var cached)) return cached; + + try + { + // No single-get endpoint exposed: fetch list and pick + var resp = await _client.GetAllProductsByFilterAsync(new GetAllProductsByFilterRequest { Filter = new GetAllProductsByFilterFilter() }); + var list = MapAndCache(resp.Models); + return list.FirstOrDefault(x => x.Id == id); + } + catch + { + _cache.TryGetValue(id, out var result); + return result; + } + } + + private List MapAndCache(Google.Protobuf.Collections.RepeatedField models) + { + var list = new List(); + foreach (var m in models) + { + var p = new Product( + Id: m.Id, + Title: m.Title ?? string.Empty, + Description: m.Description ?? string.Empty, + ImageUrl: string.IsNullOrWhiteSpace(m.ImagePath) ? string.Empty : UrlUtility.DownloadUrl + m.ImagePath, + Price: m.Price + ); + _cache[p.Id] = p; + list.Add(p); + } + return list; } } -