using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using DNTPersianUtils.Core; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RMuseum.Models.Auth.ViewModel; using RMuseum.Models.Ganjoor.ViewModels; using RMuseum.Services.Implementation; using RSecurityBackend.Models.Auth.Memory; using RSecurityBackend.Models.Generic; namespace GanjooRazor.Pages { [IgnoreAntiforgeryToken(Order = 1001)] public class HashiehaModel : LoginPartialEnabledPageModel { /// /// memory cache /// private readonly IMemoryCache _memoryCache; /// /// configration file reader (appsettings.json) /// private readonly IConfiguration Configuration; /// /// constructor /// /// /// /// public HashiehaModel(HttpClient httpClient, IMemoryCache memoryCache, IConfiguration configuration) : base(httpClient) { _memoryCache = memoryCache; Configuration = configuration; } /// /// aggressive cache /// public bool AggressiveCacheEnabled { get { try { return bool.Parse(Configuration["AggressiveCacheEnabled"]); } catch { return false; } } } public List Poets { get; set; } public int PoetId { get; set; } public GanjoorPoetCompleteViewModel Poet { get; set; } public string PagingToolsHtml { get; set; } public string LastError { get; set; } private async Task preparePoets() { var cacheKey = $"/api/ganjoor/poets"; if (!_memoryCache.TryGetValue(cacheKey, out List poets)) { var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poets"); if (!response.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); return false; } poets = JArray.Parse(await response.Content.ReadAsStringAsync()).ToObject>(); if (AggressiveCacheEnabled) { _memoryCache.Set(cacheKey, poets, TimeSpan.FromHours(1)); } } Poets = poets; return true; } private async Task preparePoet() { var cacheKey = $"/api/ganjoor/poet/{PoetId}"; if (!_memoryCache.TryGetValue(cacheKey, out GanjoorPoetCompleteViewModel poet)) { var poetResponse = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poet/{PoetId}"); if (!poetResponse.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await poetResponse.Content.ReadAsStringAsync()); return false; } poet = JObject.Parse(await poetResponse.Content.ReadAsStringAsync()).ToObject(); if (AggressiveCacheEnabled) { _memoryCache.Set(cacheKey, poet, TimeSpan.FromHours(1)); } } Poet = poet; return true; } public List Comments { get; set; } public async Task OnGetPoetInformationAsync(int id) { if (id == 0) return new OkObjectResult(null); var cacheKey = $"/api/ganjoor/poet/{id}"; if (!_memoryCache.TryGetValue(cacheKey, out GanjoorPoetCompleteViewModel poet)) { var poetResponse = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poet/{id}"); if (!poetResponse.IsSuccessStatusCode) { return BadRequest(JsonConvert.DeserializeObject(await poetResponse.Content.ReadAsStringAsync())); } poet = JObject.Parse(await poetResponse.Content.ReadAsStringAsync()).ToObject(); if (AggressiveCacheEnabled) { _memoryCache.Set(cacheKey, poet, TimeSpan.FromHours(1)); } } return new OkObjectResult(poet); } public GanjoorUserPublicProfile Profile { get; set; } public UserContributionsViewModel Contributions { get; set; } public string Title { get; set; } public string HomeLink { get; set; } public bool CanAdministerUsers { get; set; } public string Query { get; set; } public async Task OnGetAsync() { if (bool.Parse(Configuration["MaintenanceMode"])) { return StatusCode(503); } LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]); PoetId = string.IsNullOrEmpty(Request.Query["a"]) ? 0 : int.Parse(Request.Query["a"]); ViewData["TrackingScript"] = Configuration["TrackingScript"] != null && string.IsNullOrEmpty(Request.Cookies["Token"]) ? Configuration["TrackingScript"].Replace("loggedon", "") : Configuration["TrackingScript"]; //todo: use html master layout or make it partial // 1. poets if (false == (await preparePoets())) return Page(); if (PoetId != 0) { if (false == (await preparePoet())) return Page(); } // 2. search comments int pageNumber = 1; if (!string.IsNullOrEmpty(Request.Query["page"])) { pageNumber = int.Parse(Request.Query["page"]); } Query = Request.Query["w"]; var filterUserId = Request.Query["userid"]; string url = $"{APIRoot.Url}/api/ganjoor/comments?PageNumber={pageNumber}&PageSize=20"; Title = "حاشیه‌ها"; HomeLink = "/hashieha"; if (!string.IsNullOrEmpty(filterUserId)) { var responseUserProfile = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/user/profile/{filterUserId}"); if (!responseUserProfile.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await responseUserProfile.Content.ReadAsStringAsync()); return Page(); } Profile = JsonConvert.DeserializeObject(await responseUserProfile.Content.ReadAsStringAsync()); var responseContributions = await _httpClient.GetAsync($"{APIRoot.Url}/api/contributions/{filterUserId}"); if (!responseContributions.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await responseContributions.Content.ReadAsStringAsync()); return Page(); } Contributions = JsonConvert.DeserializeObject(await responseContributions.Content.ReadAsStringAsync()); ViewData["Title"] = $"گنجور » حاشیه‌گذاری‌های {Profile.NickName}"; Title = $"حاشیه‌گذاری‌های {Profile.NickName}"; HomeLink = $"/hashieha?userid={filterUserId}"; if (!string.IsNullOrEmpty(Request.Cookies["Token"])) { using (HttpClient secureClient = new HttpClient()) { secureClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Request.Cookies["Token"]); var res = await secureClient.GetAsync($"{APIRoot.Url}/api/users/securableitems"); if (res.IsSuccessStatusCode) { SecurableItem[] secuarbleItems = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync()); var userSecurableItem = secuarbleItems.Where(s => s.ShortName == SecurableItem.UserEntityShortName).FirstOrDefault(); if (userSecurableItem != null) { var administerOperation = userSecurableItem.Operations.Where(o => o.ShortName == SecurableItem.Administer).FirstOrDefault(); if (administerOperation != null) { CanAdministerUsers = administerOperation.Status; } } } } } url += $"&filterUserId={filterUserId}"; } if(!string.IsNullOrEmpty(Query)) { Query = Query.ApplyCorrectYeKe().Trim(); bool quotes = Query.IndexOf("\"") != -1; Query = LanguageUtils.MakeTextSearchable(Query); //replace zwnj with space if (quotes) Query = $"\"{Query}\""; url += $"&term={Query}"; } var response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); return Page(); } Comments = JArray.Parse(await response.Content.ReadAsStringAsync()).ToObject>(); string paginnationMetadata = response.Headers.GetValues("paging-headers").FirstOrDefault(); PaginationMetadata paginationMetadata = JsonConvert.DeserializeObject(paginnationMetadata); string htmlText = ""; if (paginationMetadata.totalPages > 1) { if (pageNumber > 1) ViewData["Title"] += $" - صفحهٔ {pageNumber.ToPersianNumbers()}"; htmlText = $"
{Environment.NewLine}"; string queryFilterUserId = string.IsNullOrEmpty(filterUserId) ? "" : $"&userid={filterUserId}"; if (!string.IsNullOrEmpty(Query)) { queryFilterUserId += $"&w={WebUtility.UrlEncode(Query)}"; } if (paginationMetadata.currentPage > 3) { htmlText += $"
۱
…"; } for (int i = paginationMetadata.currentPage - 2; i <= (paginationMetadata.currentPage + 2); i++) { if (i >= 1 && i <= paginationMetadata.totalPages) { if (i == paginationMetadata.currentPage) { htmlText += $"
{i.ToPersianNumbers()}
{Environment.NewLine}"; } else { htmlText += $"
{i.ToPersianNumbers()}
{Environment.NewLine}"; } } } if (paginationMetadata.totalPages > (paginationMetadata.currentPage + 2)) { htmlText += $"…
{paginationMetadata.totalPages.ToPersianNumbers()}
{Environment.NewLine}"; } htmlText += $"
{Environment.NewLine}"; } ViewData["Title"] = $"گنجور » {Title}"; PagingToolsHtml = htmlText; return Page(); } } }