divan/GanjooRazor/Areas/User/Pages/Editor.cshtml.cs
2021-10-06 13:00:48 +03:30

230 lines
9.5 KiB
C#

using System.Collections.Generic;
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
{
[IgnoreAntiforgeryToken(Order = 1001)]
public class EditorModel : PageModel
{
/// <summary>
/// my last edit
/// </summary>
public GanjoorPoemCorrectionViewModel MyLastEdit { get; set; }
/// <summary>
/// page
/// </summary>
public GanjoorPageCompleteViewModel PageInformation { get; set; }
/// <summary>
/// rythms
/// </summary>
public GanjoorMetre[] Rhythms { get; set; }
/// <summary>
/// fatal error
/// </summary>
public string FatalError { get; set; }
public string GetVersePosition(GanjoorVerseViewModel verse)
{
switch(verse.VersePosition)
{
case VersePosition.Right:
return "مصرع اول";
case VersePosition.Left:
return "مصرع دوم";
case VersePosition.CenteredVerse1:
return "مصرع اول بند";
case VersePosition.CenteredVerse2:
return "مصرع دوم بند";
case VersePosition.Paragraph:
return "پاراگراف نثر";
case VersePosition.Single:
return "نیمایی یا آزاد";
case VersePosition.Comment:
return "توضیح";
}
return "نامعتبر";
}
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;
}
/// <summary>
/// can edit
/// </summary>
public bool CanEdit { get; set; }
/// <summary>
/// get
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OnGetAsync()
{
FatalError = "";
CanEdit = Request.Cookies["CanEdit"] == "True";
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
var editResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/correction/last/{Request.Query["id"]}");
editResponse.EnsureSuccessStatusCode();
MyLastEdit = JsonConvert.DeserializeObject<GanjoorPoemCorrectionViewModel>(await editResponse.Content.ReadAsStringAsync());
var rhythmResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/rhythms");
rhythmResponse.EnsureSuccessStatusCode();
Rhythms = JsonConvert.DeserializeObject<GanjoorMetre[]>(await rhythmResponse.Content.ReadAsStringAsync());
var pageUrlResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={Request.Query["id"]}");
pageUrlResponse.EnsureSuccessStatusCode();
var pageUrl = JsonConvert.DeserializeObject<string>(await pageUrlResponse.Content.ReadAsStringAsync());
var pageQuery = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}");
pageQuery.EnsureSuccessStatusCode();
PageInformation = JObject.Parse(await pageQuery.Content.ReadAsStringAsync()).ToObject<GanjoorPageCompleteViewModel>();
}
else
{
FatalError = "لطفا از گنجور خارج و مجددا به آن وارد شوید.";
}
}
return Page();
}
public async Task<IActionResult> OnPostDeletePoemCorrectionsAsync(int poemid)
{
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
HttpResponseMessage response = await secureClient.DeleteAsync(
$"{APIRoot.Url}/api/ganjoor/poem/correction/{poemid}");
response.EnsureSuccessStatusCode();
return new OkObjectResult(true);
}
}
return new BadRequestObjectResult("لطفا از گنجور خارج و مجددا به آن وارد شوید.");
}
public async Task<IActionResult> OnPostSendPoemCorrectionsAsync(int poemid, string[] verseOrderText, string rhythm, string note)
{
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
string title = null;
List<GanjoorVerseVOrderText> vOrderTexts = new List<GanjoorVerseVOrderText>();
foreach(string v in verseOrderText)
{
var vParts = v.Split("TextSeparator", System.StringSplitOptions.RemoveEmptyEntries);
int vOrder = int.Parse(vParts[0]);
if (vOrder == 0)
title = vParts[1];
else
{
vOrderTexts.Add
(
new GanjoorVerseVOrderText()
{
VORder = vOrder,
Text = vParts[1]
}
);
}
}
if (title == null && vOrderTexts.Count == 0 && rhythm == null)
return new BadRequestObjectResult("شما هیچ تغییری در متن نداده‌اید!");
GanjoorPoemCorrectionViewModel correction = new GanjoorPoemCorrectionViewModel()
{
PoemId = poemid,
Title = title,
VerseOrderText = vOrderTexts.ToArray(),
Rhythm = rhythm,
Note = note
};
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<string>(await response.Content.ReadAsStringAsync()));
}
return new OkObjectResult(true);
}
else
{
return new BadRequestObjectResult("لطفا از گنجور خارج و مجددا به آن وارد شوید.");
}
}
}
public async Task<IActionResult> OnPostBreakPoemAsync(int poemId, int vOrder)
{
using (HttpClient secureClient = new HttpClient())
{
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<string>(await response.Content.ReadAsStringAsync()));
}
return new OkObjectResult(JsonConvert.DeserializeObject<int>(await response.Content.ReadAsStringAsync()));
}
else
{
return new BadRequestObjectResult("لطفا از گنجور خارج و مجددا به آن وارد شوید.");
}
}
}
}
}