merge
This commit is contained in:
commit
a35a5f70f1
@ -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"> </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>
|
||||
|
||||
}
|
||||
@ -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("لطفاً از گنجور خارج و مجددا به آن وارد شوید.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
5955
RMuseum/Migrations/20250504083938_RemTrans.Designer.cs
generated
Normal file
5955
RMuseum/Migrations/20250504083938_RemTrans.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
113
RMuseum/Migrations/20250504083938_RemTrans.cs
Normal file
113
RMuseum/Migrations/20250504083938_RemTrans.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user