divan/GanjooRazor/Areas/User/Pages/Translate.cshtml.cs
2021-09-16 19:01:37 +04:30

293 lines
12 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Net;
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;
using RSecurityBackend.Models.Auth.ViewModels;
namespace GanjooRazor.Areas.User.Pages
{
[IgnoreAntiforgeryToken(Order = 1001)]
public class TranslateModel : PageModel
{
/// <summary>
/// page
/// </summary>
public GanjoorPageCompleteViewModel PageInformation { get; set; }
/// <summary>
/// translations
/// </summary>
public GanjoorLanguage[] Languages { get; set; }
/// <summary>
/// translations
/// </summary>
public GanjoorPoemTranslationViewModel[] Translations { get; set; }
/// <summary>
/// translation
/// </summary>
public GanjoorPoemTranslationViewModel Translation { get; set; }
/// <summary>
/// user info
/// </summary>
public PublicRAppUser UserInfo { 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 "نیمایی یا آزاد";
}
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>
/// get
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OnGetAsync()
{
FatalError = "";
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
int poemId = int.Parse(Request.Query["id"]);
int langId = string.IsNullOrEmpty(Request.Query["lang"]) ? -1 : int.Parse(Request.Query["lang"]);
HttpResponseMessage response = await secureClient.GetAsync($"{APIRoot.Url}/api/translations/poem/{poemId}/language/{langId}");
if (!response.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync());
return Page();
}
var translations = JsonConvert.DeserializeObject<GanjoorPoemTranslationViewModel[]>(await response.Content.ReadAsStringAsync());
var userInfoResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/users/{Request.Cookies["UserId"]}");
if (!response.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync());
return Page();
}
UserInfo = JsonConvert.DeserializeObject<PublicRAppUser>(await userInfoResponse.Content.ReadAsStringAsync());
if (langId == -1)
{
var lastLangResp = await secureClient.GetAsync($"{APIRoot.Url}/api/translations/user/lastlanguage");
if (response.StatusCode != HttpStatusCode.NotFound)
{
var lang = JsonConvert.DeserializeObject<GanjoorLanguage>(await lastLangResp.Content.ReadAsStringAsync());
langId = lang.Id;
}
}
if (langId != -1)
{
Translations = translations;
foreach (var translation in translations)
if (translation.ContributerId == UserInfo.Id && langId == translation.Language.Id)
{
Translation = translation;
break;
}
}
else if (translations.Length > 0)
{
foreach (var translation in translations)
if (translation.ContributerId == UserInfo.Id)
{
Translation = translation;
langId = Translation.Language.Id;
break;
}
if (langId == -1)
{
Translation = translations[0];
langId = Translation.Language.Id;
}
Translations = translations.Where(t => t.Language.Id == langId).ToArray();
}
HttpResponseMessage responseLanguages = await secureClient.GetAsync($"{APIRoot.Url}/api/translations/languages");
if (!responseLanguages.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await responseLanguages.Content.ReadAsStringAsync());
return Page();
}
responseLanguages.EnsureSuccessStatusCode();
Languages = JsonConvert.DeserializeObject<GanjoorLanguage[]>(await responseLanguages.Content.ReadAsStringAsync());
if(Languages.Length == 0)
{
FatalError = "<a role=\"button\" target=\"_blank\" href=\"/User/Languages\" class=\"actionlink\">معرفی زبان‌ها و نویسش‌ها</a>";
return Page();
}
if (langId == -1)
{
langId = Languages[0].Id;
}
var pageUrlResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={poemId}");
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>();
if(Translation == null)
{
Translation = new GanjoorPoemTranslationViewModel()
{
Language = Languages.Where(l => l.Id == langId).Single(),
PoemId = PageInformation.Id,
Title = "",
Published = false,
Description = "",
ContributerName = UserInfo.NickName == null ? UserInfo.Id.ToString() : UserInfo.NickName,
TranslatedVerses = PageInformation.Poem.Verses.Select(v =>
new GanjoorVerseTranslationViewModel()
{
Verse = v,
TText = ""
}
).ToArray()
};
Translations = new GanjoorPoemTranslationViewModel[] { Translation };
}
}
else
{
FatalError = "لطفا از گنجور خارج و مجددا به آن وارد شوید.";
}
}
return Page();
}
public async Task<IActionResult> OnPostSendPoemTranslationAsync(int poemid, int langid, string[] translations, bool published, string note)
{
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
string title = null;
List<GanjoorVerseTranslationViewModel> verses = new List<GanjoorVerseTranslationViewModel>();
foreach (string v in translations)
{
var vParts = v.Split("TextSeparator", System.StringSplitOptions.RemoveEmptyEntries);
int vOrder = int.Parse(vParts[0]);
if (vOrder == 0 && vParts.Length > 1)
title = vParts[1];
else
{
verses.Add
(
new GanjoorVerseTranslationViewModel()
{
Verse = new GanjoorVerseViewModel() { VOrder = vOrder },
TText = vParts.Length > 1 ? vParts[1] : null
}
);;
}
}
if (string.IsNullOrEmpty(title) && verses.Where(v => !string.IsNullOrEmpty(v.TText) ).FirstOrDefault() == null)
return new BadRequestObjectResult("شما هیچ متنی را وارد نکرده‌اید!");
var translation = new GanjoorPoemTranslationViewModel()
{
Language = new GanjoorLanguage() { Id = langid },
PoemId = poemid,
Title = title,
Published = published,
Description = note,
TranslatedVerses = verses.ToArray()
};
HttpResponseMessage response = await secureClient.PostAsync(
$"{APIRoot.Url}/api/translations",
new StringContent(JsonConvert.SerializeObject(translation),
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("لطفا از گنجور خارج و مجددا به آن وارد شوید.");
}
}
}
}
}