diff --git a/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml b/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml index 16597cd8..7e7ceae5 100644 --- a/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml +++ b/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml @@ -73,6 +73,8 @@

ویرایش صفحهٔ متناظر

+

شروع تولید مجدد فهرست همهٔ زیربخشها

+

شروع قافیه‌یابی

diff --git a/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml.cs b/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml.cs index 584b25b9..16ee6cc4 100644 --- a/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml.cs +++ b/GanjooRazor/Areas/Admin/Pages/CatUtils.cshtml.cs @@ -144,6 +144,20 @@ namespace GanjooRazor.Areas.Admin.Pages return new OkObjectResult(false); } + public async Task OnPostStartGeneratingSubCatsTOCAsync(int id) + { + using (HttpClient secureClient = new HttpClient()) + { + if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) + { + HttpResponseMessage response = await secureClient.PutAsync($"{APIRoot.Url}/api/ganjoor/cat/subcats/startgentoc/{id}", null); + response.EnsureSuccessStatusCode(); + return new OkObjectResult(true); + } + } + return new OkObjectResult(false); + } + public async Task OnPostStartRhythmAnalysisAsync(int id, string rhythm) { using (HttpClient secureClient = new HttpClient()) diff --git a/GanjooRazor/Pages/Shared/_AdminLayout.cshtml b/GanjooRazor/Pages/Shared/_AdminLayout.cshtml index d0d66ebb..800de5e2 100644 --- a/GanjooRazor/Pages/Shared/_AdminLayout.cshtml +++ b/GanjooRazor/Pages/Shared/_AdminLayout.cshtml @@ -76,6 +76,28 @@ }); } + function startTocGenerationForSubCats(catId) { + if (!confirm('آیا از شروع کار تولید مجدد فهرست همهٔ زیربخشها اطمینان دارید؟')) + return; + + var url = '?handler=StartGeneratingSubCatsTOC'; + + $.ajax({ + type: "POST", + url: url, + data: { + id: catId + }, + error: function () { + alert('خطا رخ داد.') + }, + success: function () { + alert('کار تولید مجدد فهرست همهٔ زیربخشهای بخش شروع شد.') + }, + + }); + } + function tagCatWithRhymes(catId) { if (!confirm('آیا از شروع کار قافیه‌یابی اطمینان دارید؟')) return; diff --git a/RMuseum/Controllers/GanjoorController.cs b/RMuseum/Controllers/GanjoorController.cs index 7202e4f1..ea17eb13 100644 --- a/RMuseum/Controllers/GanjoorController.cs +++ b/RMuseum/Controllers/GanjoorController.cs @@ -489,6 +489,29 @@ namespace RMuseum.Controllers return Ok(res.Result); } + /// + /// start generating sub cats TOC + /// + /// + /// + + [HttpPut("cat/subcats/startgentoc/{id}")] + [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] + [ProducesResponseType((int)HttpStatusCode.OK)] + [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] + [ProducesResponseType((int)HttpStatusCode.NotFound)] + public IActionResult StartGeneratingSubCatsTOC(int id) + { + Guid userId = + new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); + var res = _ganjoorService.StartGeneratingSubCatsTOC(userId, id); + + if (!string.IsNullOrEmpty(res.ExceptionString)) + return BadRequest(res.ExceptionString); + + return Ok(); + } + /// /// page by url /// diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index c0ee4955..3194bc74 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -795,6 +795,13 @@ + + + start generating sub cats TOC + + + + page by url @@ -7573,6 +7580,14 @@ + + + start generating sub cats TOC + + + + + IArtifactService implementation @@ -8960,6 +8975,14 @@ + + + start generating sub cats TOC + + + + + generate category TOC diff --git a/RMuseum/Services/IGanjoorService.cs b/RMuseum/Services/IGanjoorService.cs index 8ee66cbc..6aad25c6 100644 --- a/RMuseum/Services/IGanjoorService.cs +++ b/RMuseum/Services/IGanjoorService.cs @@ -431,5 +431,13 @@ namespace RMuseum.Services /// /// Task> GenerateTableOfContents(int catId, GanjoorTOC options); + + /// + /// start generating sub cats TOC + /// + /// + /// + /// + RServiceResult StartGeneratingSubCatsTOC(Guid userId, int catId); } } diff --git a/RMuseum/Services/Implementation/GanjoorService.cs b/RMuseum/Services/Implementation/GanjoorService.cs index 31013476..aae6b2bc 100644 --- a/RMuseum/Services/Implementation/GanjoorService.cs +++ b/RMuseum/Services/Implementation/GanjoorService.cs @@ -21,6 +21,7 @@ using Microsoft.Extensions.Caching.Memory; using System.Net.Http; using System.Web; using RMuseum.Services.Implementation.ImportedFromDesktopGanjoor; +using RSecurityBackend.Models.Generic.Db; namespace RMuseum.Services.Implementation { @@ -3142,6 +3143,72 @@ namespace RMuseum.Services.Implementation } } + private async Task _GeneratingSubCatsTOC(Guid userId, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job, int catId) + { + foreach(var cat in await context.GanjoorCategories.AsNoTracking().Where(c => c.ParentId == catId).ToListAsync()) + { + await jobProgressServiceEF.UpdateJob(job.Id, cat.Id); + var page = await context.GanjoorPages.Where(p => p.FullUrl == cat.FullUrl).SingleAsync(); + + context.GanjoorPageSnapshots.Add + ( + new GanjoorPageSnapshot() + { + GanjoorPageId = page.Id, + MadeObsoleteByUserId = userId, + HtmlText = page.HtmlText, + Note = "تولید گروهی فهرستهای زیربخشها", + RecordDate = DateTime.Now + } + ); + + page.HtmlText = (await _GenerateTableOfContents(context, cat.Id, GanjoorTOC.TitlesAndFirstVerse)).Result; + context.GanjoorPages.Update(page); + await context.SaveChangesAsync(); + + await _GeneratingSubCatsTOC(userId, context, jobProgressServiceEF, job, cat.Id); + } + } + + /// + /// start generating sub cats TOC + /// + /// + /// + /// + public RServiceResult StartGeneratingSubCatsTOC(Guid userId, int catId) + { + try + { + _backgroundTaskQueue.QueueBackgroundWorkItem + ( + async token => + { + using (RMuseumDbContext context = new RMuseumDbContext(new DbContextOptions())) //this is long running job, so _context might be already been freed/collected by GC + { + LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context); + var job = (await jobProgressServiceEF.NewJob($"eneratingSubCatsTOC {catId}", "Query data")).Result; + try + { + await _GeneratingSubCatsTOC(userId, context, jobProgressServiceEF, job, catId); + await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true); + } + catch (Exception exp) + { + await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString()); + } + + } + }); + + return new RServiceResult(true); + } + catch (Exception exp) + { + return new RServiceResult(false, exp.ToString()); + } + } + /// /// generate category TOC /// @@ -3149,18 +3216,24 @@ namespace RMuseum.Services.Implementation /// /// public async Task> GenerateTableOfContents(int catId, GanjoorTOC options) + { + return await _GenerateTableOfContents(_context, catId, options); + } + + + private async Task> _GenerateTableOfContents(RMuseumDbContext context, int catId, GanjoorTOC options) { try { string html = ""; - var subCats = await _context.GanjoorCategories.Where(c => c.ParentId == catId).OrderBy(c => c.Id).AsNoTracking().ToArrayAsync(); + var subCats = await context.GanjoorCategories.Where(c => c.ParentId == catId).OrderBy(c => c.Id).AsNoTracking().ToArrayAsync(); foreach(var cat in subCats) { html += $"

{cat.Title}

{Environment.NewLine}"; } - var poems = await _context.GanjoorPoems.Where(p => p.CatId == catId).OrderBy(p => p.Id).AsNoTracking().ToArrayAsync(); + var poems = await context.GanjoorPoems.Where(p => p.CatId == catId).OrderBy(p => p.Id).AsNoTracking().ToArrayAsync(); if(poems.Length > 0) { @@ -3191,7 +3264,7 @@ namespace RMuseum.Services.Implementation { html += $"

فهرست شعرها به ترتیب آخر حرف قافیه گردآوری شده است. برای پیدا کردن یک شعر کافی است حرف آخر قافیهٔ آن را در نظر بگیرید تا بتوانید آن را پیدا کنید.

{Environment.NewLine}"; var randomPoem = taggedPoems[new Random(DateTime.Now.Millisecond).Next(taggedPoems.Length)]; - var randomPoemVerses = await _context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == randomPoem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); + var randomPoemVerses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == randomPoem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); if(randomPoemVerses.Length > 2) { html += $"

مثلاً برای پیدا کردن شعری که مصرع {randomPoemVerses[1].Text} مصرع دوم یکی از بیتهای آن است باید شعرهایی را نگاه کنید که آخر حرف قافیهٔ آنها «{randomPoem.RhymeLetters.Substring(randomPoem.RhymeLetters.Length - 1)}» است.

{Environment.NewLine}"; @@ -3254,7 +3327,7 @@ namespace RMuseum.Services.Implementation html += $"

{poem.Title}"; - var verses = await _context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == poem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); + var verses = await context.GanjoorVerses.AsNoTracking().Where(p => p.PoemId == poem.Id).OrderBy(v => v.VOrder).ToArrayAsync(); if(verses.Length > 0) { @@ -3317,7 +3390,7 @@ namespace RMuseum.Services.Implementation } - html += $"

"; + html += $"

{Environment.NewLine}"; }