diff --git a/RMuseum/Controllers/GanjoorController.cs b/RMuseum/Controllers/GanjoorController.cs index f23a79e1..864f1d61 100644 --- a/RMuseum/Controllers/GanjoorController.cs +++ b/RMuseum/Controllers/GanjoorController.cs @@ -626,18 +626,18 @@ namespace RMuseum.Controllers } /// - /// convert old alphabetic TOCs to new ones + /// regenerate TOCs /// /// - [HttpPut("cat/toc/migrate")] + [HttpPut("cat/toc/regen")] [Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + SecurableItem.ModifyOperationShortName)] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] - public IActionResult StartRegeneratingOldAlphabeticTOCs() + public IActionResult StartRegeneratingTOCs() { Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); - var res = _ganjoorService.StartRegeneratingOldAlphabeticTOCs(userId); + var res = _ganjoorService.StartRegeneratingTOCs(userId); if (!string.IsNullOrEmpty(res.ExceptionString)) return BadRequest(res.ExceptionString); diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index 7445ffd6..76d2b5d7 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -1028,9 +1028,9 @@ - + - convert old alphabetic TOCs to new ones + regenerate TOCs @@ -11289,9 +11289,9 @@ - + - convert old alphabetic TOCs to new ones + regenerate TOCs @@ -13048,9 +13048,9 @@ - + - convert old alphabetic TOCs to new ones + regenerate TOCs diff --git a/RMuseum/Services/IGanjoorService.cs b/RMuseum/Services/IGanjoorService.cs index 5d3e7d53..ae5f59cd 100644 --- a/RMuseum/Services/IGanjoorService.cs +++ b/RMuseum/Services/IGanjoorService.cs @@ -849,10 +849,10 @@ namespace RMuseum.Services Task> SetCategoryLanguageTag(int catId, string language); /// - /// convert old alphabetic TOCs to new ones + /// regenerate TOCs /// /// /// - RServiceResult StartRegeneratingOldAlphabeticTOCs(Guid userId); + RServiceResult StartRegeneratingTOCs(Guid userId); } } diff --git a/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-TOC.cs b/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-TOC.cs index 2d2113f2..c741ca28 100644 --- a/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-TOC.cs +++ b/RMuseum/Services/Implementation/GanjoorService-Partials/GanjoorService-TOC.cs @@ -21,11 +21,11 @@ namespace RMuseum.Services.Implementation public partial class GanjoorService : IGanjoorService { /// - /// convert old alphabetic TOCs to new ones + /// regenerate TOCs /// /// /// - public RServiceResult StartRegeneratingOldAlphabeticTOCs(Guid userId) + public RServiceResult StartRegeneratingTOCs(Guid userId) { try { @@ -37,32 +37,32 @@ namespace RMuseum.Services.Implementation 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("RegeneratingOldAlphabeticTOCs", "Query data")).Result; + var job = (await jobProgressServiceEF.NewJob("StartRegeneratingTOCs", "Query data")).Result; try { + var cats = await context.GanjoorCategories.AsNoTracking().ToListAsync(); - var pages = await context.GanjoorPages.AsNoTracking().Where(p => p.CatId != null && p.GanjoorPageType == GanjoorPageType.CatPage && p.HtmlText.Contains("دسترسی سریع به حروف")).ToArrayAsync(); - - foreach (var page in pages) + foreach (var cat in cats) { - await jobProgressServiceEF.UpdateJob(job.Id, 0, page.FullTitle); - await _FindCategoryPoemsRhymesInternal((int)page.CatId, false); - GanjoorTOC options = GanjoorTOC.AlphabeticWithFirstCouplet; - if ( - new string[] - { - "غزلیات", "غزل", "غزل ها", "قصاید", "قصائد", "قصیده", "رباعیات", "رباعی", "رباعی ها" - }.Contains(page.Title) - ) - { - options = GanjoorTOC.AlphabeticWithFirstVerse; - } - await _DirectInsertGeneratedTableOfContents(context, (int)page.CatId, userId, options); + var page = + await context.GanjoorPages.AsNoTracking() + .Where(p => (p.GanjoorPageType == GanjoorPageType.PoetPage && p.PoetId == cat.PoetId) || (p.GanjoorPageType == GanjoorPageType.CatPage && p.CatId == cat.Id)).SingleAsync(); + + await jobProgressServiceEF.UpdateJob(job.Id, 0, page.FullTitle); + if(cat.TableOfContentsStyle == GanjoorTOC.Analyse) + { + var hasChild = await context.GanjoorCategories.AsNoTracking().Where(c => c.ParentId == cat.Id).AnyAsync(); + if (cat.ParentId == null || hasChild) + cat.TableOfContentsStyle = GanjoorTOC.OnlyTitles; + else + cat.TableOfContentsStyle = GanjoorTOC.TitlesAndFirstVerse; + var catToUpdate = await context.GanjoorCategories.Where(c => c.Id == cat.Id).SingleAsync(); + catToUpdate.TableOfContentsStyle = cat.TableOfContentsStyle; + context.Update(catToUpdate); + await context.SaveChangesAsync(); + } + await _DirectInsertGeneratedTableOfContents(context,cat.Id, userId, cat.TableOfContentsStyle); - var cat = await context.GanjoorCategories.Where(c => c.Id == (int)page.CatId).SingleAsync(); - cat.TableOfContentsStyle = options; - cat.CatType = GanjoorCatType.BookPart; - context.Update(cat); await context.SaveChangesAsync(); }