using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using GanjooRazor.Utils; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RMuseum.Models.Ganjoor; using RMuseum.Models.Ganjoor.ViewModels; namespace GanjooRazor.Areas.User.Pages { public class EditorModel : PageModel { /// /// my last edit /// public GanjoorPoemCorrectionViewModel MyLastEdit { get; set; } /// /// camelCase JSON of MyLastEdit.GeoDateTags, pre-serialized here (rather than inline in the .cshtml /// script block) so the Razor page doesn't embed a C# object-initializer (with its own braces) inside /// a JS statement - that combination was tripping the editor's JS/TS syntax check (TS1109) even though /// it compiled and ran fine. /// public string MyLastEditGeoDateTagsJson => JsonConvert.SerializeObject( MyLastEdit?.GeoDateTags ?? Array.Empty(), new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } ); /// /// page /// public GanjoorPageCompleteViewModel PageInformation { get; set; } /// /// couplets (for the geo/date tag suggestion couplet-selection dropdown), same shape as SuggestQuoted's /// public Tuple[] Couplets { get; set; } /// /// rhythms alphabetically /// public GanjoorMetre[] RhythmsAlphabetically { get; set; } /// /// rhythms by frequency /// public GanjoorMetre[] RhythmsByVerseCount { get; set; } public bool CanAssignRhythms { get; set; } /// /// fatal error /// public string FatalError { get; set; } public string GetVersePosition(GanjoorVerseViewModel verse) { return VersePositionHelper.GetVersePositionString(verse.VersePosition); } public int GetVerseCoupletNumber(GanjoorVerseViewModel verse) { int n = 1; VersePosition pre = VersePosition.Right; foreach (var v in PageInformation.Poem.Verses) { if (v.Id == verse.Id) { if (pre == VersePosition.CenteredVerse1 && v.VersePosition != VersePosition.CenteredVerse2) n++; return n; } if (v.VersePosition == VersePosition.Left || v.VersePosition == VersePosition.CenteredVerse2 || v.VersePosition == VersePosition.Single || v.VersePosition == VersePosition.Paragraph) n++; else if (pre == VersePosition.CenteredVerse1) n++; pre = v.VersePosition; } return -1; } public PoemRelatedImage TextSourceImage { get; set; } public GanjoorMetre GanjoorMetre1 { get; set; } public GanjoorMetre GanjoorMetre2 { get; set; } public string RhymeLetters { get; set; } /// /// valid for whole poem sections /// public GanjoorPoemFormat? PoemFormat { get; set; } /// /// can edit /// public bool CanEdit { get; set; } /// /// show admin ops /// public bool ShowAdminOps { get; set; } /// /// locations /// public List Locations { get; set; } /// /// camelCase JSON of Locations (id/name/latitude/longitude only), used client-side to warn /// about a new-location suggestion that's actually already in the catalog (same/near /// coordinates) or shares a name with a different, already-catalogued place. Pre-serialized /// here rather than inline in the .cshtml script block for the same reason as /// MyLastEditGeoDateTagsJson - avoids embedding a C# object initializer inside a JS statement. /// public string AllLocationsJson => JsonConvert.SerializeObject( (Locations ?? new List()).Select(l => new { l.Id, l.Name, l.Latitude, l.Longitude }), new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } ); /// /// poem geo date tags /// public PoemGeoDateTag[] PoemGeoDateTags { get; set; } public GanjoorLanguage[] Languages { get; set; } private async Task ReadLanguagesAsync(HttpClient secureClient) { HttpResponseMessage response = await secureClient.GetAsync($"{APIRoot.Url}/api/translations/languages"); if (!response.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); return; } Languages = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } /// /// groups verses into couplets - same logic as SuggestQuoted.cshtml.cs's GetCouplets, duplicated here /// rather than shared, so this page doesn't take on a cross-file dependency on that one /// /// /// private Tuple[] GetCouplets(GanjoorVerseViewModel[] verses) { int coupetIndex = -1; string coupletText = ""; List> couplets = new List>(); int verseIndex = 0; bool incompleteCouplet = false; while (verseIndex < verses.Length) { switch (verses[verseIndex].VersePosition) { case VersePosition.Comment: incompleteCouplet = false; break; case VersePosition.Paragraph: case VersePosition.Single: incompleteCouplet = false; if (!string.IsNullOrEmpty(coupletText)) { couplets.Add(new Tuple(coupetIndex, coupletText)); coupletText = ""; } coupetIndex++; couplets.Add(new Tuple(coupetIndex, verses[verseIndex].Text)); break; case VersePosition.Right: case VersePosition.CenteredVerse1: incompleteCouplet = false; if (!string.IsNullOrEmpty(coupletText)) { couplets.Add(new Tuple(coupetIndex, coupletText)); } coupetIndex++; coupletText = verses[verseIndex].Text; break; case VersePosition.Left: case VersePosition.CenteredVerse2: incompleteCouplet = true; coupletText += $" - {verses[verseIndex].Text}"; break; } verseIndex++; } if (incompleteCouplet && !string.IsNullOrEmpty(coupletText)) couplets.Add(new Tuple(coupetIndex, coupletText)); return couplets.ToArray(); } /// /// get /// /// public async Task OnGetAsync() { if (string.IsNullOrEmpty(Request.Cookies["Token"])) return Redirect("/login"); FatalError = ""; CanEdit = Request.Cookies["CanEdit"] == "True"; // set before any of the early "API call failed" returns below, so the view - which // reads Model.Couplets unconditionally near the top of its script block, before the // FatalError check further down - never sees a null and throws ArgumentNullException // out of Couplets.ToDictionary(...) on a failed request Couplets = Array.Empty>(); ShowAdminOps = CanEdit && Request.Query["admin"] == "1"; using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { var editResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/correction/last/{Request.Query["id"]}"); if (!editResponse.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await editResponse.Content.ReadAsStringAsync()); return Page(); } MyLastEdit = JsonConvert.DeserializeObject(await editResponse.Content.ReadAsStringAsync()); var rhythmResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/rhythms?sortOnVerseCount=true"); if (!rhythmResponse.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await rhythmResponse.Content.ReadAsStringAsync()); return Page(); } RhythmsByVerseCount = JsonConvert.DeserializeObject(await rhythmResponse.Content.ReadAsStringAsync()); List rhythmsByVerseCount = new List(RhythmsByVerseCount); rhythmsByVerseCount.Sort((a, b) => a.Rhythm.CompareTo(b.Rhythm)); rhythmsByVerseCount.Insert(0, new GanjoorMetre() { Rhythm = "null" } ); rhythmsByVerseCount.Insert(0, new GanjoorMetre() { Rhythm = "" } ); RhythmsAlphabetically = rhythmsByVerseCount.ToArray(); var pageUrlResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={Request.Query["id"]}"); if (!pageUrlResponse.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); return Page(); } var pageUrl = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); var pageQuery = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}"); if (!pageQuery.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await pageQuery.Content.ReadAsStringAsync()); return Page(); } PageInformation = JObject.Parse(await pageQuery.Content.ReadAsStringAsync()).ToObject(); Couplets = GetCouplets(PageInformation.Poem.Verses); if (PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && !string.IsNullOrEmpty(s.RhymeLetters)).Any()) { RhymeLetters = PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && !string.IsNullOrEmpty(s.RhymeLetters)).OrderBy(s => s.VerseType).First().RhymeLetters; } if (PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.GanjoorMetre != null).Any()) { GanjoorMetre1 = PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.GanjoorMetre != null).OrderBy(s => s.VerseType).First().GanjoorMetre; if (PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.GanjoorMetre != null).Count() > 1) { GanjoorMetre2 = PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.GanjoorMetre != null).OrderBy(s => s.VerseType).ToList()[1].GanjoorMetre; } } if (PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.PoemFormat != null).Any()) { PoemFormat = PageInformation.Poem.Sections.Where(s => s.SectionType == PoemSectionType.WholePoem && s.PoemFormat != null).OrderBy(s => s.VerseType).First().PoemFormat; } else { PoemFormat = GanjoorPoemFormat.Unknown; } if (PageInformation.Poem.Images.Where(i => i.IsTextOriginalSource).Any()) { TextSourceImage = PageInformation.Poem.Images.Where(i => i.IsTextOriginalSource).First(); } CanAssignRhythms = true; if (PageInformation.Poem.Verses.Any(v => v.VersePosition == VersePosition.Paragraph)) { CanAssignRhythms = false; } else if (PageInformation.Poem.Sections.Count(s => s.SectionType == PoemSectionType.WholePoem && s.VerseType == VersePoemSectionType.First) > 1) { CanAssignRhythms = false; } else if (PageInformation.Poem.Sections.Length == 0) { CanAssignRhythms = false; } await ReadLanguagesAsync(secureClient); // Locations and PoemGeoDateTags are needed by both the admin direct-edit // table (still gated by ShowAdminOps in the .cshtml) and the regular // contributor-facing suggestion UI, so this fetch is no longer admin-only var responseLocations = await secureClient.GetAsync($"{APIRoot.Url}/api/locations"); if (!responseLocations.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await responseLocations.Content.ReadAsStringAsync()); return Page(); } Locations = new List(); Locations.Add ( new GanjoorGeoLocation() { Id = 0, Latitude = 0, Longitude = 0, Name = "" } ); Locations.AddRange(JsonConvert.DeserializeObject(await responseLocations.Content.ReadAsStringAsync())); var tagsResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/{PageInformation.Id}/geotag"); if (!tagsResponse.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await tagsResponse.Content.ReadAsStringAsync()); return Page(); } PoemGeoDateTags = JsonConvert.DeserializeObject(await tagsResponse.Content.ReadAsStringAsync()); } else { FatalError = "لطفاً از گنجور خارج و مجددا به آن وارد شوید."; } } return Page(); } public async Task OnPostDeletePoemCorrectionsAsync(int poemid) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.DeleteAsync( $"{APIRoot.Url}/api/ganjoor/poem/correction/{poemid}"); if (!response.IsSuccessStatusCode) { string rawError = await response.Content.ReadAsStringAsync(); string errorMessage; try { // normal case: API returns the error as a JSON-encoded string errorMessage = JsonConvert.DeserializeObject(rawError); } catch (JsonException) { // API (or a proxy in front of it) returned something that isn't a // JSON string - e.g. an HTML error page - so don't let that throw // an unhandled exception here; fall back to a generic message. errorMessage = "خطایی در سرور رخ داد. لطفاً بعداً دوباره تلاش کنید."; } return BadRequest(errorMessage); } return new OkObjectResult(true); } } return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } public class PoemCorrectionStructure { public int poemid { get; set; } public string[] verseOrderText { get; set; } public int[] verseOrderMarkedForDelete { get; set; } public string[] versePositions { get; set; } public string rhythm { get; set; } public string rhythm2 { get; set; } public string rhyme { get; set; } public string format { get; set; } public string[] verseOrderSummaries { get; set; } public string[] verseLanguages { get; set; } public string note { get; set; } public bool hideMyName { get; set; } public RMuseum.Models.Ganjoor.GanjoorPoemGeoDateTagCorrection[] geoDateTags { get; set; } } public async Task OnPostSendPoemCorrectionsAsync([FromBody] PoemCorrectionStructure pcs) { try { if (pcs == null) { return new BadRequestObjectResult("خطای پیش‌بینی نشده: لطفاً نشانی این شعر را به ganjoor@ganjoor.net ارسال بفرمایید تا بررسی بیشتری انجام شود."); } using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { var pageUrlResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={pcs.poemid}"); if (!pageUrlResponse.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); return new BadRequestObjectResult(FatalError); } var pageUrl = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); var pageQuery = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}"); if (!pageQuery.IsSuccessStatusCode) { FatalError = JsonConvert.DeserializeObject(await pageQuery.Content.ReadAsStringAsync()); return new BadRequestObjectResult(FatalError); } var pageInformation = JObject.Parse(await pageQuery.Content.ReadAsStringAsync()).ToObject(); string title = null; List vOrderTexts = new List(); List versePositions = new List(); foreach (var versePosition in pcs.versePositions) { if (versePosition != null) { versePositions.Add((VersePosition)Enum.Parse(typeof(VersePosition), versePosition)); } } foreach (string v in pcs.verseOrderText) { var vParts = v.Split("TextSeparator", StringSplitOptions.RemoveEmptyEntries); int vOrder = int.Parse(vParts[0]); if (vOrder == 0) title = vParts[1].Replace("ۀ", "هٔ").Replace("ك", "ک"); else { int? langaugeId = null; if (pcs.verseLanguages[vOrder] != null && !(int.Parse(pcs.verseLanguages[vOrder]) == 1 && pageInformation.Poem.Verses.First(v => v.VOrder == vOrder).LanguageId == null)) { langaugeId = int.Parse(pcs.verseLanguages[vOrder]); } var verse = pageInformation.Poem.Verses.Where(verse => verse.VOrder == vOrder).FirstOrDefault(); if (verse == null) { continue; } string verseText = vParts.Length < 2 || verse.Text == vParts[1] ? null : vParts[1].Replace("ۀ", "هٔ").Replace("ك", "ک"); VersePosition? versePos = pageInformation.Poem.Verses.First(v => v.VOrder == vOrder).VersePosition == versePositions[vOrder - 1] ? null : versePositions[vOrder - 1]; bool markedForDelete = pcs.verseOrderMarkedForDelete.Any(v => v == vOrder); if (verseText != null || markedForDelete || versePos != null || langaugeId != null) { vOrderTexts.Add ( new GanjoorVerseVOrderText() { VORder = vOrder, Text = verseText, MarkForDelete = markedForDelete, VersePosition = versePos, LanguageId = langaugeId, } ); } } } string poemSummary = null; foreach (string v in pcs.verseOrderSummaries) { var vParts = v.Split("TextSeparator", System.StringSplitOptions.RemoveEmptyEntries); int vOrder = int.Parse(vParts[0]); if (vOrder == 0) { poemSummary = vParts.Length > 1 ? vParts[1].Replace("ۀ", "هٔ").Replace("ك", "ک") : ""; if (poemSummary.Contains("هوش مصنوعی")) { return new BadRequestObjectResult("لطفاً در صورت ویرایش خروجی‌های هوش مصنوعی عبارت هوش مصنوعی را از متن برگردان یا خلاصه حذف کنید."); } } else { if (vOrderTexts.Where(t => t.VORder == vOrder).Any()) { var existingEntryCoupletSummary = vParts.Length > 1 ? vParts[1].Replace("ۀ", "هٔ").Replace("ك", "ک") : ""; if (existingEntryCoupletSummary.Contains("هوش مصنوعی")) { return new BadRequestObjectResult("لطفاً در صورت ویرایش خروجی‌های هوش مصنوعی عبارت هوش مصنوعی را از متن برگردان یا خلاصه حذف کنید."); } vOrderTexts.First(t => t.VORder == vOrder).CoupletSummary = existingEntryCoupletSummary; } else { var coupletSummary = vParts.Length > 1 ? vParts[1].Replace("ۀ", "هٔ").Replace("ك", "ک") : ""; if(coupletSummary.Contains("هوش مصنوعی")) { return new BadRequestObjectResult("لطفاً در صورت ویرایش خروجی‌های هوش مصنوعی عبارت هوش مصنوعی را از متن برگردان یا خلاصه حذف کنید."); } vOrderTexts.Add ( new GanjoorVerseVOrderText() { VORder = vOrder, Text = null, MarkForDelete = false, VersePosition = null, CoupletSummary = coupletSummary, } ); } } } if (title == null && poemSummary == null && vOrderTexts.Count == 0 && pcs.rhythm == null && pcs.rhythm2 == null && pcs.rhyme == null && pcs.format == null && (pcs.geoDateTags == null || pcs.geoDateTags.Length == 0)) return new BadRequestObjectResult("شما هیچ تغییری در اطلاعات نداده‌اید!"); if (pcs.rhythm == "null") pcs.rhythm = ""; if (pcs.rhythm2 == "null") pcs.rhythm2 = ""; if (pcs.rhythm2 != null) { if (pcs.rhythm == pcs.rhythm2) return new BadRequestObjectResult("وزن اول و دوم یکسانند!"); } GanjoorPoemCorrectionViewModel correction = new GanjoorPoemCorrectionViewModel() { PoemId = pcs.poemid, Title = title, VerseOrderText = vOrderTexts.ToArray(), Rhythm = pcs.rhythm, Rhythm2 = pcs.rhythm2, RhymeLetters = pcs.rhyme, PoemFormat = string.IsNullOrEmpty(pcs.format) ? (GanjoorPoemFormat?)null : (GanjoorPoemFormat)Enum.Parse(typeof(GanjoorPoemFormat), pcs.format), PoemSummary = poemSummary, Note = pcs.note, HideMyName = pcs.hideMyName, GeoDateTags = pcs.geoDateTags }; HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/poem/correction", new StringContent(JsonConvert.SerializeObject(correction), Encoding.UTF8, "application/json")); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkObjectResult(true); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } catch (Exception exp) { return new BadRequestObjectResult(exp.ToString()); } } public async Task OnPostBreakPoemAsync(int poemId, int vOrder) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/poem/break", new StringContent(JsonConvert.SerializeObject ( new PoemVerseOrder() { PoemId = poemId, VOrder = vOrder } ), Encoding.UTF8, "application/json")); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnPostUpdateRelatedSectionsAsync(int meterId, string rhyme) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/sections/updaterelated?metreId={meterId}&rhyme={rhyme}", null ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnPostRefillCoupletIndicesAsync(int id) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/refillcoupletindices/{id}", null ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnPostRegeneratePoemSectionsAsync(int id) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/poem/{id}/sections/regenerate", null ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnGetComputeRhymeAsync(int id) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { var response = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/analysisrhyme/{id}"); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } var rhyme = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); return new OkObjectResult(rhyme.Rhyme); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnPostNewGeoDateTagAsync(int poemId, int locationId, string year, int month, string day, bool verifiedDate, bool ignoreInCategory) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PostAsync( $"{APIRoot.Url}/api/ganjoor/poem/geotag", new StringContent(JsonConvert.SerializeObject( new PoemGeoDateTag() { PoemId = poemId, LocationId = locationId == 0 ? null : locationId, LunarYear = string.IsNullOrEmpty(year) ? null : int.Parse(year), LunarMonth = month == 0 ? null : month, LunarDay = string.IsNullOrEmpty(day) ? null : int.Parse(day), VerifiedDate = verifiedDate, IgnoreInCategory = ignoreInCategory, } ), Encoding.UTF8, "application/json") ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnDeleteGeoDateTagAsync(int id) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.DeleteAsync( $"{APIRoot.Url}/api/ganjoor/poem/geotag/{id}" ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } public async Task OnPostSaveMetaAsync(int poemId, bool noindex, string redirectfromurl, int mixedmodeorder) { using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { HttpResponseMessage response = await secureClient.PutAsync( $"{APIRoot.Url}/api/ganjoor/poem/adminedit/{poemId}", new StringContent(JsonConvert.SerializeObject( new GanjoorModifyPageViewModel() { NoIndex = noindex, RedirectFromFullUrl = redirectfromurl, MixedModeOrder = mixedmodeorder, } ), Encoding.UTF8, "application/json") ); if (!response.IsSuccessStatusCode) { return new BadRequestObjectResult(JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())); } return new OkResult(); } else { return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید."); } } } } }