This commit is contained in:
Hamid Reza Mohammadi 2025-05-18 18:19:52 +03:30
commit a35a5f70f1
14 changed files with 6069 additions and 1539 deletions

View File

@ -1,263 +0,0 @@
@page
@model GanjooRazor.Areas.User.Pages.TranslateModel
@using DNTPersianUtils.Core
@{
Layout = "_UserPanelLayout";
ViewData["Title"] = "برگردان / نویسش";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
}
<h1>@ViewData["Title"]</h1>
<script>
$(document).ready(function () {
$('[contenteditable]').keypress(function (e) { return e.which != 13; });
});
</script>
@if (!string.IsNullOrEmpty(Model.FatalError))
{
<p>@Html.Raw(Model.FatalError)</p>
}
else
{
<select name="languages" id="languages">
@foreach (var language in Model.Languages)
{
@if (language.Id == Model.Translation.Language.Id)
{
<option value="@language.Id" selected>@language.Name</option>
}
else
{
<option value="@language.Id">@language.Name</option>
}
}
</select>
<script>
$('#languages').change(
function () {
var langId = $('#languages option:selected').val();
location.href = '/User/Translate?id=@Model.PageInformation.Id&lang=' + String(langId);
}
);
</script>
<p><a role="button" target="_blank" href="/User/Languages" class="actionlink">معرفی زبان‌ها و نویسش‌ها</a></p>
<select name="translations" id="translations">
@foreach (var translation in Model.Translations)
{
@if (Model.Translation != null && translation.Id == Model.Translation.Id)
{
<option value="@translation.Id" selected>@translation</option>
}
else
{
<option value="@translation.Id">@translation</option>
}
}
</select>
<script>
$('#translations').change(
function () {
var transId = $('#translations option:selected').val();
location.href = '/User/Translate?id=@Model.PageInformation.Id&t=' + String(transId);
}
);
</script>
<p><a role="button" target="_blank" href="@Model.PageInformation.FullUrl" class="actionlink">@Model.PageInformation.FullTitle</a></p>
@if (Model.PageInformation.Poem.Previous != null)
{
<p><a href="/User/Translate?id=@Model.PageInformation.Poem.Previous.Id">برگردان شعر قبل</a></p>
}
@if (Model.PageInformation.Poem.Next != null)
{
<p><a href="/User/Translate?id=@Model.PageInformation.Poem.Next.Id">برگردان شعر بعد</a></p>
}
<table>
<tr>
<td>
<p><strong>برگردان متن:</strong></p>
</td>
</tr>
<tr>
<td>
عنوان اصلی:
</td>
</tr>
<tr>
<td>
<p style="color:red" id="original-0">@Model.PageInformation.Poem.Title</p>
</td>
</tr>
<tr>
<td>
برگردان عنوان:
</td>
</tr>
<tr>
<td>
@if (Model.Translation.Language.RightToLeft)
{
<div type="text" id="id-0" name="id-0" contenteditable="true" style="background-color:white">@Model.Translation.Title</div>
}
else
{
<div type="text" id="id-0" name="id-0" contenteditable="true" style="background-color:white;direction:ltr">@Model.Translation.Title</div>
}
</td>
</tr>
@foreach (var verse in Model.Translation.TranslatedVerses)
{
<tr>
<td>
بیت @Model.GetVerseCoupletNumber(verse.Verse).ToPersianNumbers()
</td>
</tr>
<tr>
<td>
مصرع @verse.Verse.VOrder.ToPersianNumbers()
</td>
</tr>
<tr>
<td>
نوع: @Model.GetVersePosition(verse.Verse)
</td>
</tr>
<tr>
<td>
متن اصلی:
</td>
</tr>
<tr>
<td>
<p style="color:red" id="original-@($"{verse.Verse.VOrder}")">@verse.Verse.Text</p>
</td>
</tr>
<tr>
<td>
برگردان:
</td>
</tr>
<tr>
<td>
@if (Model.Translation.Language.RightToLeft)
{
<div id="id-@($"{verse.Verse.VOrder}")" name="name-@($"{verse.Verse.VOrder}")" contenteditable="true" style="background-color:white">@verse.TText</div>
}
else
{
<div id="id-@($"{verse.Verse.VOrder}")" name="name-@($"{verse.Verse.VOrder}")" contenteditable="true" style="background-color:white;direction:ltr">@verse.TText</div>
}
</td>
</tr>
}
<tr>
@if (Model.Translation.Published)
{
<td colspan="2">منتشر شده <input type="checkbox" name="published" id="published" checked /> </td>
}
else
{
<td colspan="2">منتشر شده <input type="checkbox" name="published" id="published" /> </td>
}
</tr>
<tr>
<td>
یادداشت این ویرایش:
</td>
</tr>
<tr>
<td>
<input type="text" id="description" name="description" value="@Model.Translation.Description" size="50" />
</td>
</tr>
<tr>
<td>
توسط:
</td>
</tr>
<tr>
<td>
@Model.Translation.ContributerName
</td>
</tr>
<tr>
<td>
<script>
function savePoemTranslation(id, verseCount, langid) {
var translations = [];
for (var i = 0; i <= verseCount; i++) {
var newElementName = '#id-' + i.toString();
translations.push(i.toString() + 'TextSeparator' + $(newElementName).text());
}
$('#savetranslation').hide();
$('#saving').text('در حال ذخیره ...');
var url = '?handler=SendPoemTranslation';
$.ajax({
type: "POST",
url: url,
data: {
poemid: id,
langid: langid,
translations: translations,
published: $('#published').is(":checked"),
note: $('#description').val()
},
success: function (transId) {
location.href = '/User/Translate?id=' + String(id)+'&t=' + String(transId);
},
error: function (e) {
if (e.responseText == null)
alert(e);
else
alert(e.responseText);
$('#savetranslation').show();
$('#saving').text('');
}
});
}
</script>
<a role="button" id="savetranslation" style="cursor:pointer;width:100%;color:white;background-color:green;display:block" onclick="savePoemTranslation(@Model.PageInformation.Poem.Id, @Model.PageInformation.Poem.Verses.Length, @Model.Translation.Language.Id)">ذخیره</a>
</td>
</tr>
<tr>
<td><p id="saving">&nbsp;</p></td>
</tr>
@if (Model.PageInformation.Poem.Previous != null)
{
<tr>
<td><a href="/User/Translate?id=@Model.PageInformation.Poem.Previous.Id">برگردان شعر قبل</a></td>
</tr>
}
@if (Model.PageInformation.Poem.Next != null)
{
<tr>
<td><a href="/User/Translate?id=@Model.PageInformation.Poem.Next.Id">برگردان شعر بعد</a></td>
</tr>
}
</table>
}

View File

@ -1,331 +0,0 @@
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.Auth.Memory;
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 "نیمایی یا آزاد";
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>
/// get
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OnGetAsync()
{
if (string.IsNullOrEmpty(Request.Cookies["Token"]))
return Redirect("/");
FatalError = "";
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
await GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
if (!ViewData.ContainsKey($"{RMuseumSecurableItem.GanjoorEntityShortName}-{RMuseumSecurableItem.Translations}"))
{
FatalError = "حساب کاربری شما به این بخش دسترسی ندارد.";
return Page();
}
int poemId = int.Parse(Request.Query["id"]);
int transId = string.IsNullOrEmpty(Request.Query["t"]) ? -1 : int.Parse(Request.Query["t"]);
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(transId != -1)
{
Translation = translations.Where(t => t.Id == transId).Single();
langId = Translation.Language.Id;
}
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());
if(lang != null)
{
langId = lang.Id;
}
}
}
if (langId != -1 && Translation == null)
{
Translations = translations;
foreach (var translation in translations)
if (translation.ContributerId == UserInfo.Id && langId == translation.Language.Id)
{
Translation = translation;
break;
}
}
else if (translations.Length > 0 && Translation == null)
{
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;
}
}
HttpResponseMessage responseLanguages = await secureClient.GetAsync($"{APIRoot.Url}/api/translations/languages");
if (!responseLanguages.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await responseLanguages.Content.ReadAsStringAsync());
return Page();
}
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}");
if (!pageUrlResponse.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await pageUrlResponse.Content.ReadAsStringAsync());
return Page();
}
var pageUrl = JsonConvert.DeserializeObject<string>(await pageUrlResponse.Content.ReadAsStringAsync());
var pageQuery = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}");
if (!pageQuery.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await pageQuery.Content.ReadAsStringAsync());
return Page();
}
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 };
}
if(langId != -1)
{
Translations = translations.Where(t => t.Language.Id == langId).ToArray();
}
}
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)
{
if(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()));
}
Translation = JObject.Parse(await response.Content.ReadAsStringAsync()).ToObject<GanjoorPoemTranslationViewModel>();
return new OkObjectResult(Translation.Id);
}
else
{
return new BadRequestObjectResult("لطفاً از گنجور خارج و مجددا به آن وارد شوید.");
}
}
}
}
}

View File

@ -1,129 +0,0 @@
@page
@model GanjooRazor.Pages.TransModel
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="fa-IR" dir="rtl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex, nofollow" />
<title>
گنجور » برگردان‌ها و نویس‌های شعر
</title>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;500;700&display=swap" rel="stylesheet">
<link href="~/css/p8.css?version=81" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
</head>
<body>
<div style="width:95%;max-width:500px;min-width:380px;margin:auto">
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
{
<p>@Model.ErrorMessage</p>
}
else
{
@if (Model.Poem.Previous != null)
{
<p><a href="/Trans?p=@Model.Poem.Previous.Id&lang=@Model.LanguageId">شعر قبل</a></p>
}
@if (Model.Poem.Next != null)
{
<p><a href="/Trans?p=@Model.Poem.Next.Id&lang=@Model.LanguageId">شعر بعد</a></p>
}
if (Model.Languages.Length == 0)
{
<p>
هنوز برای این شعر هیچ برگردان یا نویسشی ارائه یا منتشر نشده است.
</p>
@if (Model.CanTranslate)
{
<a role="button" target="_blank" style="text-decoration: none; cursor: pointer; width: 100%; color: white; background-color: #300; display: block; text-align: center; border-color: #300 " href="/User/Translate?id=@Model.PoemId">من اضافه کنم</a>
}
}
else
{
<select name="languages" id="languages">
@foreach (var language in Model.Languages)
{
if (Model.LanguageId == language.Id)
{
<option value="@language.Id" selected>@language.NativeName</option>
}
else
{
<option value="@language.Id">@language.NativeName</option>
}
}
</select>
<script>
$('#languages').change(
function() {
var langId = $('#languages option:selected').val();
location.href = '/Trans?p=@Model.PoemId&lang=' + String(langId);
}
);
</script>
if (Model.Translation == null)
{
<p>
هنوز برای این شعر هیچ برگردان یا نویسشی با این زبان ارائه یا منتشر نشده است.
</p>
}
else
{
<p><a role="button" target="_blank" href="@Model.Poem.FullUrl" class="actionlink">@Model.Poem.FullTitle</a></p>
@if (!string.IsNullOrEmpty(Model.Translation.Title))
{
<div class="commentquote">@Model.Translation.Title</div>
}
@foreach (var verse in Model.Translation.TranslatedVerses)
{
if (!string.IsNullOrEmpty(verse.TText))
{
<p>@verse.Verse.Text</p>
<div class="commentquote">@verse.TText</div>
}
}
@if (Model.Poem.Previous != null)
{
<p><a href="/Trans?p=@Model.Poem.Previous.Id&lang=@Model.LanguageId">شعر قبل</a></p>
}
@if (Model.Poem.Next != null)
{
<p><a href="/Trans?p=@Model.Poem.Next.Id&lang=@Model.LanguageId">شعر بعد</a></p>
}
}
@if (Model.CanTranslate)
{
<a role="button" target="_blank" style="text-decoration: none; cursor: pointer; width: 100%; color: white; background-color: #300; display: block; text-align: center; border-color: #300 " href="/User/Translate?id=@Model.PoemId&lang=@Model.LanguageId">من ترجمه کنم</a>
}
}
}
</div>
@if (ViewData["TrackingScript"] != null && !string.IsNullOrEmpty(ViewData["TrackingScript"].ToString()))
{
@Html.Raw(ViewData["TrackingScript"])
}
</body>
</html>

View File

@ -1,138 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using GanjooRazor.Utils;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using RMuseum.Models.Auth.Memory;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
namespace GanjooRazor.Pages
{
public class TransModel : PageModel
{
/// <summary>
/// HttpClient instance
/// </summary>
private readonly HttpClient _httpClient;
/// <summary>
/// configration file reader (appsettings.json)
/// </summary>
private readonly IConfiguration Configuration;
/// <summary>
/// constructor
/// </summary>
/// <param name="httpClient"></param>
/// <param name="configuration"></param>
public TransModel(HttpClient httpClient, IConfiguration configuration)
{
_httpClient = httpClient;
Configuration = configuration;
}
/// <summary>
/// poem
/// </summary>
public GanjoorPoemCompleteViewModel Poem { get; set; }
public GanjoorLanguage[] Languages { get; set; }
public GanjoorPoemTranslationViewModel[] Translations { get; set; }
public GanjoorPoemTranslationViewModel Translation { get; set; }
public string ErrorMessage { get; set; }
public int PoemId { get; set; }
/// <summary>
/// is logged on
/// </summary>
public bool CanTranslate { get; set; }
public int LanguageId { get; set; }
public async Task<IActionResult> OnGetAsync()
{
if (bool.Parse(Configuration["MaintenanceMode"]))
{
return StatusCode(503);
}
ErrorMessage = "";
CanTranslate = false;
if (!string.IsNullOrEmpty(Request.Cookies["Token"]))
{
await GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
if (ViewData.ContainsKey($"{RMuseumSecurableItem.GanjoorEntityShortName}-{RMuseumSecurableItem.Translations}"))
{
CanTranslate = true;
}
}
PoemId = int.Parse(Request.Query["p"]);
ViewData["TrackingScript"] = Configuration["TrackingScript"] != null && string.IsNullOrEmpty(Request.Cookies["Token"]) ? Configuration["TrackingScript"].Replace("loggedon", "") : Configuration["TrackingScript"];
HttpResponseMessage responseLanguages = await _httpClient.GetAsync($"{APIRoot.Url}/api/translations/languages");
if (!responseLanguages.IsSuccessStatusCode)
{
ErrorMessage = JsonConvert.DeserializeObject<string>(await responseLanguages.Content.ReadAsStringAsync());
return Page();
}
var allLanguages = JsonConvert.DeserializeObject<GanjoorLanguage[]>(await responseLanguages.Content.ReadAsStringAsync());
HttpResponseMessage response = await _httpClient.GetAsync($"{APIRoot.Url}/api/translations/poem/{PoemId}/published");
if (!response.IsSuccessStatusCode)
{
ErrorMessage = JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync());
return Page();
}
Translations = JsonConvert.DeserializeObject<GanjoorPoemTranslationViewModel[]>(await response.Content.ReadAsStringAsync());
LanguageId = string.IsNullOrEmpty(Request.Query["lang"]) ? -1 : int.Parse(Request.Query["lang"]);
List<GanjoorLanguage> poemLanguages = new List<GanjoorLanguage>();
foreach (var lang in allLanguages)
{
if (Translations.Where(t => t.Language.Id == lang.Id).FirstOrDefault() != null)
{
poemLanguages.Add(lang);
}
}
if (LanguageId != -1)
if (!poemLanguages.Where(l => l.Id == LanguageId).Any())
{
poemLanguages.Add(allLanguages.Where(l => l.Id == LanguageId).Single());
}
Languages = poemLanguages.ToArray();
if (LanguageId != -1)
Translations = Translations.Where(t => t.Language.Id == LanguageId).ToArray();
Translation = Translations.Length > 0 ? Translations[0] : null;
if (Translation != null)
LanguageId = Translation.Language.Id;
var responsePoem = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/{PoemId}?verseDetails=true&catInfo=true&rhymes=false&recitations=false&images=false&songs=false&comments=false&navigation=true");
if (!responsePoem.IsSuccessStatusCode)
{
ErrorMessage = JsonConvert.DeserializeObject<string>(await responsePoem.Content.ReadAsStringAsync());
return Page();
}
Poem = JsonConvert.DeserializeObject<GanjoorPoemCompleteViewModel>(await responsePoem.Content.ReadAsStringAsync());
return Page();
}
}
}

View File

@ -108,143 +108,6 @@ namespace RMuseum.Controllers
return Ok(res.Result);
}
/// <summary>
/// get published poem translations
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("poem/{id}/published")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPoemTranslationViewModel[]))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPublishedTranslationsAsync(int id)
{
var res = await _translationService.GetPoemTranslationsAsync(-1, id, true, false);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// get published poem translation in a specific language
/// </summary>
/// <param name="id"></param>
/// <param name="lang"></param>
/// <returns></returns>
[HttpGet("poem/{id}/language/{lang}/published")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPoemTranslationViewModel))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPublishedTranslationAsync(int id, int lang)
{
var res = await _translationService.GetPoemTranslationsAsync(lang, id, true, false);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// get all translations of a poem in a specific language
/// </summary>
/// <param name="id"></param>
/// <param name="lang">send -1 for all languages</param>
/// <returns></returns>
[HttpGet("poem/{id}/language/{lang}")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Translations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPoemTranslationViewModel[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPoemTranslationsAsync(int id, int lang)
{
var res = await _translationService.GetPoemTranslationsAsync(lang, id, false, true);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// last language user has contributed in its translation
/// </summary>
/// <returns></returns>
[HttpGet("user/lastlanguage")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Translations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorLanguage))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetLastUserContributedLanguage()
{
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _translationService.GetLastUserContributedLanguage(userId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
if (res.Result == null)
return NotFound();
return Ok(res.Result);
}
/// <summary>
/// add translation for a poem (please specify verses VORder, Id is not processed)
/// </summary>
/// <param name="translation"></param>
/// <returns></returns>
[HttpPost]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Translations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public async Task<IActionResult> AddOrUpdatePoemTranslation([FromBody] GanjoorPoemTranslationViewModel translation)
{
if (ReadOnlyMode)
return BadRequest("سایت به دلایل فنی مثل انتقال سرور موقتاً در حالت فقط خواندنی قرار دارد. لطفاً ساعاتی دیگر مجدداً تلاش کنید.");
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _translationService.AddPoemTranslation(userId, translation);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// get all poem translations (for export utility)
/// </summary>
/// <param name="paging"></param>
/// <param name="lang"></param>
/// <returns></returns>
[HttpGet("all/{lang}")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Translations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPoemTranslationViewModel[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetAllPoemsTranslations([FromQuery] PagingParameterModel paging, int lang)
{
var res = await _translationService.GetAllPoemsTranslations(paging, lang);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
// Paging Header
HttpContext.Response.Headers.Append("paging-headers", JsonConvert.SerializeObject(res.Result.PagingMeta));
return Ok(res.Result.Translations);
}
/// <summary>
/// get translation by id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.Translations)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorPoemTranslationViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPoemTranslationById(int id)
{
var res = await _translationService.GetPoemTranslationById(id);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// readonly mode
/// </summary>

View File

@ -442,11 +442,6 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<GanjoorLanguage> GanjoorLanguages { get; set; }
/// <summary>
/// poem translations
/// </summary>
public DbSet<GanjoorPoemTranslation> GanjoorPoemTranslations { get; set; }
/// <summary>
/// ganjoor bookmarks
/// </summary>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,113 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace RMuseum.Migrations
{
/// <inheritdoc />
public partial class RemTrans : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "GanjoorVerseTranslation");
migrationBuilder.DropTable(
name: "GanjoorPoemTranslations");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "GanjoorPoemTranslations",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
LanguageId = table.Column<int>(type: "int", nullable: false),
PoemId = table.Column<int>(type: "int", nullable: false),
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
DateTime = table.Column<DateTime>(type: "datetime2", nullable: false),
Description = table.Column<string>(type: "nvarchar(max)", nullable: true),
Published = table.Column<bool>(type: "bit", nullable: false),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_GanjoorPoemTranslations", x => x.Id);
table.ForeignKey(
name: "FK_GanjoorPoemTranslations_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_GanjoorPoemTranslations_GanjoorLanguages_LanguageId",
column: x => x.LanguageId,
principalTable: "GanjoorLanguages",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_GanjoorPoemTranslations_GanjoorPoems_PoemId",
column: x => x.PoemId,
principalTable: "GanjoorPoems",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "GanjoorVerseTranslation",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
VerseId = table.Column<int>(type: "int", nullable: false),
GanjoorPoemTranslationId = table.Column<int>(type: "int", nullable: true),
TText = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_GanjoorVerseTranslation", x => x.Id);
table.ForeignKey(
name: "FK_GanjoorVerseTranslation_GanjoorPoemTranslations_GanjoorPoemTranslationId",
column: x => x.GanjoorPoemTranslationId,
principalTable: "GanjoorPoemTranslations",
principalColumn: "Id");
table.ForeignKey(
name: "FK_GanjoorVerseTranslation_GanjoorVerses_VerseId",
column: x => x.VerseId,
principalTable: "GanjoorVerses",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_GanjoorPoemTranslations_LanguageId",
table: "GanjoorPoemTranslations",
column: "LanguageId");
migrationBuilder.CreateIndex(
name: "IX_GanjoorPoemTranslations_PoemId",
table: "GanjoorPoemTranslations",
column: "PoemId");
migrationBuilder.CreateIndex(
name: "IX_GanjoorPoemTranslations_UserId",
table: "GanjoorPoemTranslations",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_GanjoorVerseTranslation_GanjoorPoemTranslationId",
table: "GanjoorVerseTranslation",
column: "GanjoorPoemTranslationId");
migrationBuilder.CreateIndex(
name: "IX_GanjoorVerseTranslation_VerseId",
table: "GanjoorVerseTranslation",
column: "VerseId");
}
}
}

View File

@ -1819,46 +1819,6 @@ namespace RMuseum.Migrations
b.ToTable("GanjoorPoemSectionCorrections");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoemTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<DateTime>("DateTime")
.HasColumnType("datetime2");
b.Property<string>("Description")
.HasColumnType("nvarchar(max)");
b.Property<int>("LanguageId")
.HasColumnType("int");
b.Property<int>("PoemId")
.HasColumnType("int");
b.Property<bool>("Published")
.HasColumnType("bit");
b.Property<string>("Title")
.HasColumnType("nvarchar(max)");
b.Property<Guid>("UserId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("LanguageId");
b.HasIndex("PoemId");
b.HasIndex("UserId");
b.ToTable("GanjoorPoemTranslations");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoet", b =>
{
b.Property<int>("Id")
@ -2433,32 +2393,6 @@ namespace RMuseum.Migrations
b.ToTable("GanjoorVerseNumbers");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerseTranslation", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int?>("GanjoorPoemTranslationId")
.HasColumnType("int");
b.Property<string>("TText")
.HasColumnType("nvarchar(max)");
b.Property<int>("VerseId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("GanjoorPoemTranslationId");
b.HasIndex("VerseId");
b.ToTable("GanjoorVerseTranslation");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerseVOrderText", b =>
{
b.Property<int>("Id")
@ -5126,33 +5060,6 @@ namespace RMuseum.Migrations
b.Navigation("User");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoemTranslation", b =>
{
b.HasOne("RMuseum.Models.Ganjoor.GanjoorLanguage", "Language")
.WithMany()
.HasForeignKey("LanguageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("RMuseum.Models.Ganjoor.GanjoorPoem", "Poem")
.WithMany()
.HasForeignKey("PoemId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("RSecurityBackend.Models.Auth.Db.RAppUser", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Language");
b.Navigation("Poem");
b.Navigation("User");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoet", b =>
{
b.HasOne("RMuseum.Models.Ganjoor.GanjoorGeoLocation", "BirthLocation")
@ -5349,21 +5256,6 @@ namespace RMuseum.Migrations
b.Navigation("Numbering");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerseTranslation", b =>
{
b.HasOne("RMuseum.Models.Ganjoor.GanjoorPoemTranslation", null)
.WithMany("Verses")
.HasForeignKey("GanjoorPoemTranslationId");
b.HasOne("RMuseum.Models.Ganjoor.GanjoorVerse", "Verse")
.WithMany()
.HasForeignKey("VerseId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Verse");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorVerseVOrderText", b =>
{
b.HasOne("RMuseum.Models.Ganjoor.GanjoorPoemCorrection", null)
@ -5994,11 +5886,6 @@ namespace RMuseum.Migrations
b.Navigation("VerseOrderText");
});
modelBuilder.Entity("RMuseum.Models.Ganjoor.GanjoorPoemTranslation", b =>
{
b.Navigation("Verses");
});
modelBuilder.Entity("RMuseum.Models.MusicCatalogue.GanjoorAlbum", b =>
{
b.Navigation("Tracks");

View File

@ -3432,57 +3432,6 @@
<param name="lang"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetPublishedTranslationsAsync(System.Int32)">
<summary>
get published poem translations
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetPublishedTranslationAsync(System.Int32,System.Int32)">
<summary>
get published poem translation in a specific language
</summary>
<param name="id"></param>
<param name="lang"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetPoemTranslationsAsync(System.Int32,System.Int32)">
<summary>
get all translations of a poem in a specific language
</summary>
<param name="id"></param>
<param name="lang">send -1 for all languages</param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetLastUserContributedLanguage">
<summary>
last language user has contributed in its translation
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.AddOrUpdatePoemTranslation(RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<summary>
add translation for a poem (please specify verses VORder, Id is not processed)
</summary>
<param name="translation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetAllPoemsTranslations(RSecurityBackend.Models.Generic.PagingParameterModel,System.Int32)">
<summary>
get all poem translations (for export utility)
</summary>
<param name="paging"></param>
<param name="lang"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.TranslationController.GetPoemTranslationById(System.Int32)">
<summary>
get translation by id
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="P:RMuseum.Controllers.TranslationController.ReadOnlyMode">
<summary>
readonly mode
@ -3745,11 +3694,6 @@
languages for translation
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.GanjoorPoemTranslations">
<summary>
poem translations
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.GanjoorUserBookmarks">
<summary>
ganjoor bookmarks
@ -18266,46 +18210,6 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.AddPoemTranslation(System.Guid,RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<summary>
add or update poem translation
</summary>
<param name="translation"></param>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.GetPoemTranslationsAsync(System.Int32,System.Int32,System.Boolean,System.Boolean)">
<summary>
get translation
</summary>
<param name="langId">-1 all languages</param>
<param name="poemId"></param>
<param name="onlyPublished"></param>
<param name="includeUserInfo"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.GetLastUserContributedLanguage(System.Guid)">
<summary>
get last language the user contributed to its translation
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.GetPoemTranslationById(System.Int32)">
<summary>
get translation by id
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorTranslationService.GetAllPoemsTranslations(RSecurityBackend.Models.Generic.PagingParameterModel,System.Int32)">
<summary>
get all poem translations (for export utility)
</summary>
<param name="paging"></param>
<param name="langId"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.IGeoLocationService">
<summary>
geo location service
@ -21937,46 +21841,6 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.AddPoemTranslation(System.Guid,RMuseum.Models.Ganjoor.ViewModels.GanjoorPoemTranslationViewModel)">
<summary>
add or update poem translation
</summary>
<param name="userId"></param>
<param name="translation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.GetLastUserContributedLanguage(System.Guid)">
<summary>
get last language the user contributed to its translation
</summary>
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.GetAllPoemsTranslations(RSecurityBackend.Models.Generic.PagingParameterModel,System.Int32)">
<summary>
get all poem translations (for export utility)
</summary>
<param name="paging"></param>
<param name="langId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.GetPoemTranslationById(System.Int32)">
<summary>
get translation by id
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorTranslationService.GetPoemTranslationsAsync(System.Int32,System.Int32,System.Boolean,System.Boolean)">
<summary>
get translation
</summary>
<param name="langId"></param>
<param name="poemId"></param>
<param name="onlyPublished"></param>
<param name="includeUserInfo"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.GanjoorTranslationService._context">
<summary>
Database Context

View File

@ -47,47 +47,5 @@ namespace RMuseum.Services
/// </summary>
/// <returns></returns>
Task<RServiceResult<GanjoorLanguage[]>> GetLanguagesAsync();
/// <summary>
/// add or update poem translation
/// </summary>
/// <param name="translation"></param>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorPoemTranslationViewModel>> AddPoemTranslation(Guid userId, GanjoorPoemTranslationViewModel translation);
/// <summary>
/// get translation
/// </summary>
/// <param name="langId">-1 all languages</param>
/// <param name="poemId"></param>
/// <param name="onlyPublished"></param>
/// <param name="includeUserInfo"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorPoemTranslationViewModel[]>> GetPoemTranslationsAsync(int langId, int poemId, bool onlyPublished, bool includeUserInfo);
/// <summary>
/// get last language the user contributed to its translation
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorLanguage>> GetLastUserContributedLanguage(Guid userId);
/// <summary>
/// get translation by id
/// </summary>
///<param name="id"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorPoemTranslationViewModel>> GetPoemTranslationById(int id);
/// <summary>
/// get all poem translations (for export utility)
/// </summary>
/// <param name="paging"></param>
/// <param name="langId"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemTranslationViewModel[] Translations)>> GetAllPoemsTranslations(PagingParameterModel paging, int langId);
}
}

View File

@ -396,12 +396,6 @@ namespace RMuseum.Services.Implementation
context.UpdateRange(snapshots);
await context.SaveChangesAsync();
var translations = await context.GanjoorPoemTranslations.Where(t => t.UserId == userId).ToListAsync();
foreach (var translation in translations)
translation.UserId = deletedUserId;
context.UpdateRange(translations);
await context.SaveChangesAsync();
var suggestedPoetNotes = await context.GanjoorPoetSuggestedSpecLines.Where(s => s.SuggestedById == userId).ToListAsync();
foreach (var suggestedPoetNote in suggestedPoetNotes)
suggestedPoetNote.SuggestedById = deletedUserId;

View File

@ -2,7 +2,6 @@
using RMuseum.DbContext;
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using RMuseum.Models.PDFLibrary;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services.Implementation;
using System;
@ -87,9 +86,6 @@ namespace RMuseum.Services.Implementation
if (lang == null)
return new RServiceResult<bool>(false, "اطلاعات زبان یافت نشد.");
var translations = await _context.GanjoorPoemTranslations.Include(t => t.Verses).Where(l => l.LanguageId == id).ToListAsync();
_context.RemoveRange(translations);
_context.Remove(lang);
await _context.SaveChangesAsync();
@ -134,240 +130,6 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// add or update poem translation
/// </summary>
/// <param name="userId"></param>
/// <param name="translation"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorPoemTranslationViewModel>> AddPoemTranslation(Guid userId, GanjoorPoemTranslationViewModel translation)
{
try
{
if (translation.Published)
{
var oldPublished = await _context.GanjoorPoemTranslations.Include(t => t.Language).Where(t => t.Language.Id == translation.Language.Id && t.PoemId == translation.PoemId && t.Published == true).ToListAsync();
foreach (var item in oldPublished)
{
item.Published = false;
_context.GanjoorPoemTranslations.Update(item);
}
}
var dbTranslation = new GanjoorPoemTranslation()
{
LanguageId = translation.Language.Id,
PoemId = translation.PoemId,
Title = translation.Title,
Published = translation.Published,
Verses = new List<GanjoorVerseTranslation>(),
UserId = userId,
DateTime = DateTime.Now
};
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == translation.PoemId).ToListAsync();
foreach (var translatedVerse in translation.TranslatedVerses)
{
var verse = verses.Where(v => v.VOrder == translatedVerse.Verse.VOrder).Single();
dbTranslation.Verses
.Add(
new GanjoorVerseTranslation()
{
VerseId = verse.Id,
TText = translatedVerse.TText
});
}
_context.GanjoorPoemTranslations.Add(dbTranslation);
await _context.SaveChangesAsync();
translation.Id = dbTranslation.Id;
return new RServiceResult<GanjoorPoemTranslationViewModel>(translation);
}
catch (Exception exp)
{
return new RServiceResult<GanjoorPoemTranslationViewModel>(null, exp.ToString());
}
}
/// <summary>
/// get last language the user contributed to its translation
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorLanguage>> GetLastUserContributedLanguage(Guid userId)
{
var dbTranslation = await _context.GanjoorPoemTranslations.Where(t => t.UserId == userId).OrderByDescending(t => t.Id).FirstOrDefaultAsync();
if (dbTranslation == null)
return new RServiceResult<GanjoorLanguage>(null);
return await GetLanguageAsync(dbTranslation.LanguageId);
}
/// <summary>
/// get all poem translations (for export utility)
/// </summary>
/// <param name="paging"></param>
/// <param name="langId"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemTranslationViewModel[] Translations)>> GetAllPoemsTranslations(PagingParameterModel paging, int langId)
{
try
{
var source = _context.GanjoorPoemTranslations.AsNoTracking()
.Where(t => t.LanguageId == langId)
.Include(t => t.Language).Include(t => t.User)
.OrderBy(t => t.Id)
.Select(
dbTranslation =>
new GanjoorPoemTranslationViewModel()
{
Id = dbTranslation.Id,
Language = dbTranslation.Language,
PoemId = dbTranslation.PoemId,
Title = dbTranslation == null ? null : dbTranslation.Title,
Description = dbTranslation.Description,
Published = dbTranslation.Published,
ContributerName = string.IsNullOrEmpty(dbTranslation.User.NickName) ? dbTranslation.User.Id.ToString() : dbTranslation.User.NickName,
ContributerId = dbTranslation.UserId,
DateTime = dbTranslation.DateTime,
})
.AsQueryable();
return new RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemTranslationViewModel[] Translations)>
(await QueryablePaginator<GanjoorPoemTranslationViewModel>.Paginate(source, paging));
}
catch (Exception exp)
{
return new RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemTranslationViewModel[] Translations)>((null, null), exp.ToString());
}
}
/// <summary>
/// get translation by id
/// </summary>
///<param name="id"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorPoemTranslationViewModel>> GetPoemTranslationById(int id)
{
try
{
var dbTranslation = await _context.GanjoorPoemTranslations.Include(t => t.Verses).Where(t => t.Id == id).Include(t => t.Language).Include(t => t.User).OrderByDescending(t => t.Id).SingleAsync();
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == dbTranslation.PoemId).ToListAsync();
var verseIds = verses.Select(v => v.Id).ToList();
return new RServiceResult<GanjoorPoemTranslationViewModel>
(
new GanjoorPoemTranslationViewModel()
{
Id = dbTranslation.Id,
Language = dbTranslation.Language,
PoemId = dbTranslation.PoemId,
Title = dbTranslation == null ? null : dbTranslation.Title,
Description = dbTranslation.Description,
Published = dbTranslation.Published,
ContributerName = string.IsNullOrEmpty(dbTranslation.User.NickName) ? dbTranslation.User.Id.ToString() : dbTranslation.User.NickName,
ContributerId = dbTranslation.UserId,
DateTime = dbTranslation.DateTime,
TranslatedVerses = dbTranslation.Verses.Select(v =>
new GanjoorVerseTranslationViewModel()
{
Verse = verses.Where(pv => pv.Id == v.VerseId)
.Select(pv =>
new GanjoorVerseViewModel()
{
Id = pv.Id,
VersePosition = pv.VersePosition,
CoupletIndex = pv.CoupletIndex,
VOrder = pv.VOrder,
Text = pv.Text,
SectionIndex1 = pv.SectionIndex1,
SectionIndex2 = pv.SectionIndex2,
SectionIndex3 = pv.SectionIndex3,
SectionIndex4 = pv.SectionIndex4,
}
).Single(),
TText = v.TText
}
).ToArray()
}
);
}
catch (Exception exp)
{
return new RServiceResult<GanjoorPoemTranslationViewModel>(null, exp.ToString());
}
}
/// <summary>
/// get translation
/// </summary>
/// <param name="langId"></param>
/// <param name="poemId"></param>
/// <param name="onlyPublished"></param>
/// <param name="includeUserInfo"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorPoemTranslationViewModel[]>> GetPoemTranslationsAsync(int langId, int poemId, bool onlyPublished, bool includeUserInfo)
{
try
{
var dbTranslations = await _context.GanjoorPoemTranslations.Include(t => t.Verses).Where(t => t.PoemId == poemId && (langId == -1 || t.LanguageId == langId) && (onlyPublished == false || t.Published == true)).Include(t => t.Language).Include(t => t.User).OrderByDescending(t => t.Id).ToArrayAsync();
List<GanjoorPoemTranslationViewModel> res = new List<GanjoorPoemTranslationViewModel>();
if (dbTranslations.Length > 0)
{
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == poemId).ToListAsync();
var verseIds = verses.Select(v => v.Id).ToList();
foreach (var dbTranslation in dbTranslations)
{
res.Add(
new GanjoorPoemTranslationViewModel()
{
Id = dbTranslation.Id,
Language = dbTranslation.Language,
PoemId = poemId,
Title = dbTranslation == null ? null : dbTranslation.Title,
Description = dbTranslation.Description,
Published = dbTranslation.Published,
ContributerName = includeUserInfo ? string.IsNullOrEmpty(dbTranslation.User.NickName) ? dbTranslation.User.Id.ToString() : dbTranslation.User.NickName : null,
ContributerId = includeUserInfo ? dbTranslation.UserId : Guid.Empty,
DateTime = dbTranslation.DateTime,
TranslatedVerses = dbTranslation.Verses.Select(v =>
new GanjoorVerseTranslationViewModel()
{
Verse = verses.Where(pv => pv.Id == v.VerseId)
.Select(pv =>
new GanjoorVerseViewModel()
{
Id = pv.Id,
VersePosition = pv.VersePosition,
CoupletIndex = pv.CoupletIndex,
VOrder = pv.VOrder,
Text = pv.Text,
SectionIndex1 = pv.SectionIndex1,
SectionIndex2 = pv.SectionIndex2,
SectionIndex3 = pv.SectionIndex3,
SectionIndex4 = pv.SectionIndex4,
}
).Single(),
TText = v.TText
}
).ToArray()
}
);
}
}
return new RServiceResult<GanjoorPoemTranslationViewModel[]>(res.ToArray());
}
catch (Exception exp)
{
return new RServiceResult<GanjoorPoemTranslationViewModel[]>(null, exp.ToString());
}
}
/// <summary>
/// Database Context
/// </summary>

View File

@ -967,7 +967,7 @@ namespace RMuseum.Services.Implementationa
}
Random rnd = new Random(DateTime.Now.Millisecond);
string fileNameWithoutExtension = $"{audio.PoemId}-{defProfile.FileSuffixWithoutDash}-{rnd.Next()}";
string fileNameWithoutExtension = $"{audio.PoemId}-{defProfile.FileSuffixWithoutDash}-{DateTime.Now.Millisecond}";
int tmp = 1;
while
(