diff --git a/GanjooRazor/Pages/Index.cshtml.cs b/GanjooRazor/Pages/Index.cshtml.cs index 8e0946dd..133d3ead 100644 --- a/GanjooRazor/Pages/Index.cshtml.cs +++ b/GanjooRazor/Pages/Index.cshtml.cs @@ -12,10 +12,8 @@ using RMuseum.Models.Auth.Memory; using RMuseum.Models.Ganjoor; using RMuseum.Models.Ganjoor.ViewModels; using RMuseum.Models.GanjoorAudio.ViewModels; -using RMuseum.Services; using RSecurityBackend.Models.Auth.Memory; using RSecurityBackend.Models.Auth.ViewModels; -using RSecurityBackend.Services; using System; using System.Collections.Generic; using System.Linq; @@ -39,6 +37,9 @@ namespace GanjooRazor.Pages /// private readonly HttpClient _httpClient; + /// + /// memory cache + /// private readonly IMemoryCache _memoryCache; /// diff --git a/GanjooRazor/Pages/Search.cshtml b/GanjooRazor/Pages/Search.cshtml index b3afb6a3..4ee81977 100644 --- a/GanjooRazor/Pages/Search.cshtml +++ b/GanjooRazor/Pages/Search.cshtml @@ -122,29 +122,51 @@
 
- @foreach (var poem in Model.Poems) + @if (Model.Poems == null) { - -
-

- @poem.FullTitle -

-
 
-
- - @Html.Raw(poem.PlainText) - -

-
- متن کامل شعر را ببینید ... -

-
- - @("{poem.Category.Poet.Name}") - -
 
-
+
+

شعری با مشخصات مورد نظر شما پیدا نشد.

+

+ توصیه‌هایی برای دستیابی به نتیجه‌ی مطلوبتر در جستجو: +

+

+ الف) به جای جستجوی متن کامل یک بیت بهتر است حروف کلیدی آن را وارد کنید. از آنجا که اشعار به صورتهای مختلف در نسخه‌های متفاوت نقل شده‌اند ممکن است چیزی که شما در ذهن دارید با چیزی که در پایگاه ما ثبت شده متفاوت باشد. به عنوان نمونه مصرع «کشتی شکستگانیم ای باد شرطه برخیز» از حافظ در بعضی از نسخه‌ها به صورت «کشتی نشستگانیم ای باد شرطه برخیز» ضبط شده و شما با تایپ صورت صورت دوم آن را در گنجور نخواهید یافت. بهتر است برای یافتن این شعر کلماتی مانند کشتی و شرطه را جستجو کنیم. +

+

+ ب) کلماتی را که ممکن است به صورت جدا یا سر هم نوشته شوند در گام اول به صورت جدا امتحان کنید (می شود و نه میشود یا می‌شود). +

+

+ ج) در صورتی که نام شاعر را می‌دانید بهتر است از طریق لیست بازشوی جلوی جعبه‌ی جستجو نام او را انتخاب کنید. این توصیه برای زمانی مناسب است که جستجوی عبارت مورد نظر شما باعث می‌شود آثار شاعرانی که مورد نظر شما نیستند در صدر نتایج قرار گیرد و به این وسیله شما می‌خواهید به فهرست محدودتری از نتایج دست پیدا کنید. +

+

+ د) در صورتی که با فنون اولیه‌ی جستجو آشنا نیستید یا معمولاً جستجوهایتان به نتیجه‌ی مطلوب نمی‌رسد بد نیست نگاهی به این نوشته بیندازید. +

+
} + else + foreach (var poem in Model.Poems) + { + +
+

+ @poem.FullTitle +

+
 
+
+ + @Html.Raw(poem.PlainText) + +

+
+ متن کامل شعر را ببینید ... +

+
+ + @("{poem.Category.Poet.Name}") + +
 
+
+ }
 
diff --git a/GanjooRazor/Pages/Search.cshtml.cs b/GanjooRazor/Pages/Search.cshtml.cs index 3fe032b1..23a3c07b 100644 --- a/GanjooRazor/Pages/Search.cshtml.cs +++ b/GanjooRazor/Pages/Search.cshtml.cs @@ -11,7 +11,9 @@ using GanjooRazor.Utils; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using RMuseum.Models.Auth.Memory; using RMuseum.Models.Ganjoor.ViewModels; using RMuseum.Services; @@ -25,27 +27,24 @@ namespace GanjooRazor.Pages public class SearchModel : PageModel { - /// - /// ganjoor service - /// - private readonly IGanjoorService _ganjoorService; - /// /// HttpClient instance /// private readonly HttpClient _httpClient; - + /// + /// memory cache + /// + private readonly IMemoryCache _memoryCache; /// /// constructor /// - /// /// - public SearchModel(IGanjoorService ganjoorService, HttpClient httpClient) + public SearchModel(HttpClient httpClient, IMemoryCache memoryCache) { - _ganjoorService = ganjoorService; _httpClient = httpClient; + _memoryCache = memoryCache; } public List Poets { get; set; } @@ -67,12 +66,30 @@ namespace GanjooRazor.Pages private async Task preparePoets() { - Poets = new List((await _ganjoorService.GetPoets(true, false)).Result); + var cacheKey = $"/api/ganjoor/poets?includeBio=false"; + if (!_memoryCache.TryGetValue(cacheKey, out List poets)) + { + var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poets?includeBio=false"); + response.EnsureSuccessStatusCode(); + poets = JArray.Parse(await response.Content.ReadAsStringAsync()).ToObject>(); + _memoryCache.Set(cacheKey, poets); + } + + Poets = poets; } private async Task preparePoet() { - Poet = (await _ganjoorService.GetPoetById(PoetId)).Result; + var cacheKey = $"/api/ganjoor/poet/{PoetId}"; + if (!_memoryCache.TryGetValue(cacheKey, out GanjoorPoetCompleteViewModel poet)) + { + var poetResponse = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poet/{PoetId}"); + poetResponse.EnsureSuccessStatusCode(); + poet = JObject.Parse(await poetResponse.Content.ReadAsStringAsync()).ToObject(); + _memoryCache.Set(cacheKey, poet); + } + + Poet = poet; } public async Task OnGetAsync() @@ -111,21 +128,18 @@ namespace GanjooRazor.Pages pageNumber = int.Parse(Request.Query["page"]); } - var searchRes = await _ganjoorService.Search - ( - new PagingParameterModel() - { - PageNumber = pageNumber, - PageSize = 20 - }, - Query, - PoetId == 0 ? null : PoetId, - CatId == 0 ? null : CatId - ); + var searchQueryResponse = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poems/search?term={Query}&poetId={PoetId}&catId={CatId}&PageNumber={pageNumber}&PageSize=20"); + searchQueryResponse.EnsureSuccessStatusCode(); - Poems = searchRes.Result.Items == null ? new List() : new List(searchRes.Result.Items); - if (Poems != null) + Poems = JArray.Parse(await searchQueryResponse.Content.ReadAsStringAsync()).ToObject>(); + + if(Poems != null && Poems.Count == 0) + { + Poems = null; + } + + if(Poems != null) { // highlight searched word foreach (var poem in Poems) @@ -161,9 +175,17 @@ namespace GanjooRazor.Pages } - PagingToolsHtml = GeneratePagingBarHtml(searchRes.Result.PagingMeta, $"/search?s={Query}&author={PoetId}"); + string paginationMetadataJsonValue = searchQueryResponse.Headers.GetValues("paging-headers").FirstOrDefault(); + + if (!string.IsNullOrEmpty(paginationMetadataJsonValue)) + { + PaginationMetadata paginationMetadata = JsonConvert.DeserializeObject(paginationMetadataJsonValue); + PagingToolsHtml = GeneratePagingBarHtml(paginationMetadata, $"/search?s={Query}&author={PoetId}"); + } } + + return Page(); }