using GanjooRazor.Utils; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RMuseum.Models.Ganjoor.ViewModels; using RMuseum.Models.GanjoorAudio.ViewModels; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace GanjooRazor.Pages { public class ReportRecitationModel : PageModel { /// /// HttpClient instance /// private readonly HttpClient _httpClient; /// /// configration file reader (appsettings.json) /// private readonly IConfiguration Configuration; /// /// recitation /// public PublicRecitationViewModel Recitation { get; set; } /// /// poem /// public GanjoorPoemCompleteViewModel Poem { get; set; } /// /// constructor /// /// /// public ReportRecitationModel(HttpClient httpClient, IConfiguration configuration) { _httpClient = httpClient; Configuration = configuration; } /// /// is logged on /// public bool LoggedIn { get; set; } /// /// Last Error /// public string LastError { get; set; } /// /// Post Success /// public bool PostSuccess { get; set; } /// /// Recitation Info /// public string RecitationInfo { get; set; } /// /// Couplets /// public Tuple[] Couplets { get; set; } /// /// api model /// [BindProperty] public RecitationErrorReportViewModel Report { get; set; } public async Task OnGetAsync() { if (bool.Parse(Configuration["MaintenanceMode"])) { return StatusCode(503); } PostSuccess = false; LastError = ""; LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]); RecitationInfo = ""; Report = new RecitationErrorReportViewModel() { ReasonText = "", NumberOfLinesAffected = 1, CoupletIndex = -1, }; if (!string.IsNullOrEmpty(Request.Query["a"])) { Report.RecitationId = int.Parse(Request.Query["a"]); var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/audio/published/{Report.RecitationId}"); if (!response.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } else { Recitation = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); RecitationInfo = $"{Recitation.AudioTitle} به خوانش {Recitation.AudioArtist}"; var pageUrlResponse = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={Recitation.PoemId}"); if (!pageUrlResponse.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); return Page(); } var pageUrl = JsonConvert.DeserializeObject(await pageUrlResponse.Content.ReadAsStringAsync()); var pageQuery = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}"); if (!pageQuery.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await pageQuery.Content.ReadAsStringAsync()); return Page(); } var pageInformation = JObject.Parse(await pageQuery.Content.ReadAsStringAsync()).ToObject(); Poem = pageInformation.Poem; int coupetIndex = -1; string coupletText = ""; List> couplets = new List>(); couplets.Add(new Tuple(-1, "*")); int verseIndex = 0; bool incompleteCouplet = false; while(verseIndex < pageInformation.Poem.Verses.Length) { switch(pageInformation.Poem.Verses[verseIndex].VersePosition) { case RMuseum.Models.Ganjoor.VersePosition.Comment: incompleteCouplet = false; if (!string.IsNullOrEmpty(coupletText)) { couplets.Add(new Tuple(coupetIndex, coupletText)); coupletText = ""; } break; case RMuseum.Models.Ganjoor.VersePosition.Paragraph: case RMuseum.Models.Ganjoor.VersePosition.Single: incompleteCouplet = false; if (!string.IsNullOrEmpty(coupletText)) { couplets.Add(new Tuple(coupetIndex, coupletText)); coupletText = ""; } coupetIndex++; couplets.Add(new Tuple(coupetIndex, pageInformation.Poem.Verses[verseIndex].Text)); break; case RMuseum.Models.Ganjoor.VersePosition.Right: case RMuseum.Models.Ganjoor.VersePosition.CenteredVerse1: incompleteCouplet = false; if (!string.IsNullOrEmpty(coupletText)) { couplets.Add(new Tuple(coupetIndex, coupletText)); } coupetIndex++; coupletText = pageInformation.Poem.Verses[verseIndex].Text; break; case RMuseum.Models.Ganjoor.VersePosition.Left: case RMuseum.Models.Ganjoor.VersePosition.CenteredVerse2: incompleteCouplet = true; coupletText += $" {pageInformation.Poem.Verses[verseIndex].Text}"; break; } verseIndex++; } /* foreach (var verse in pageInformation.Poem.Verses) { if(verse.CoupletIndex != null && verse.CoupletIndex != coupetIndex && verse.CoupletIndex >= 0) { if (!string.IsNullOrEmpty(coupletText)) couplets.Add(new Tuple(coupetIndex, coupletText)); coupetIndex = (int)verse.CoupletIndex; coupletText = ""; } if (!string.IsNullOrEmpty(coupletText)) coupletText += " "; coupletText += verse.Text; }*/ if (incompleteCouplet && !string.IsNullOrEmpty(coupletText)) couplets.Add(new Tuple(coupetIndex, coupletText)); Couplets = couplets.ToArray(); } } else { Report.RecitationId = 0; } return Page(); } public async Task OnPostAsync() { PostSuccess = false; LastError = ""; LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]); RecitationInfo = ""; if (string.IsNullOrEmpty(Report.ReasonText)) { LastError = "مشکل مشخص نشده است. "; return Page(); } Report.ReasonText = Report.ReasonText.Trim(); if (string.IsNullOrEmpty(Report.ReasonText)) { LastError = "مشکل مشخص نشده است. "; return Page(); } if (Report.NumberOfLinesAffected < 1) Report.NumberOfLinesAffected = 1; using (HttpClient _httpClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(_httpClient, Request, Response)) { var stringContent = new StringContent(JsonConvert.SerializeObject(Report), Encoding.UTF8, "application/json"); var methodUrl = $"{APIRoot.Url}/api/audio/errors/report"; var response = await _httpClient.PostAsync(methodUrl, stringContent); if (!response.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } else { PostSuccess = true; } } else { LastError = "لطفاً از دیوان خارج و مجددا به آن وارد شوید."; } } return Page(); } } }