tajik backend fixes

This commit is contained in:
Hamid Reza Mohammadi 2026-08-07 17:02:54 +03:30
parent a6e7d4f4e6
commit cefc6a767f
4 changed files with 90 additions and 2 deletions

View File

@ -4524,6 +4524,27 @@ namespace RMuseum.Controllers
return BadRequest(res.ExceptionString);
}
/// <summary>
/// re-runs the Tajik poet/category HTML generators for every already-imported poet and
/// category page, overwriting their stored TajikHtmlText. Needed one-time after changing
/// either generator function (e.g. adding poem excerpts to the table of contents), since
/// the normal SQLite import skips pages that already exist and never refreshes them.
/// </summary>
/// <returns></returns>
[HttpPut]
[Route("tajik/regenerate-html")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> RegenerateTajikCatAndPoetHtmlTextAsync()
{
RServiceResult<bool> res =
await _ganjoorService.RegenerateTajikCatAndPoetHtmlTextAsync();
if (res.Result)
return Ok();
return BadRequest(res.ExceptionString);
}
/// <summary>
/// tajik poets
/// </summary>

View File

@ -1582,6 +1582,14 @@ namespace RMuseum.Services
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items)>> SearchTajikAsync(PagingParameterModel paging, string term, int? poetId, int? catId);
/// <summary>
/// re-runs the Tajik poet/category HTML generators for every already-imported poet and
/// category page, overwriting their stored TajikHtmlText - needed one-time after changing
/// either generator function, since the normal SQLite import skips pages that already exist
/// </summary>
/// <returns></returns>
Task<RServiceResult<bool>> RegenerateTajikCatAndPoetHtmlTextAsync();
/// <summary>

View File

@ -144,6 +144,17 @@ namespace RMuseum.Services.Implementation
verse.Text = tajikVerses.Where(v => v.VOrder == verse.VOrder).Single().TajikText;
}
if (page.Poem.Recitations != null)
{
// no TajikRecitations table exists - this audio metadata has no real Tajik
// translation source anywhere, so transliteration is the only option
foreach (var recitation in page.Poem.Recitations)
{
recitation.AudioTitle = LanguageUtils.TransliteratePersianToTajik(recitation.AudioTitle);
recitation.AudioArtist = LanguageUtils.TransliteratePersianToTajik(recitation.AudioArtist);
}
}
if(page.Poem.Next != null)
{
var nextPoem = await _context.TajikPoems.AsNoTracking().Where(p => p.Id == page.Poem.Next.Id).SingleOrDefaultAsync();
@ -195,6 +206,46 @@ namespace RMuseum.Services.Implementation
return firstLine.Length > 80 ? firstLine.Substring(0, 80) + "…" : firstLine;
}
/// <summary>
/// re-runs PrepareTajikPoetHtmlTextAsync / PrepareTajikCatHtmlTextAsync for every poet and
/// category page that already has a stored TajikPages row, overwriting TajikHtmlText with
/// freshly generated output. Needed one-time after changing either generator function
/// (e.g. adding poem excerpts to the table of contents), because the normal SQLite import
/// (GanjoorService-TajikSQLiteImport.cs) explicitly skips pages that already exist and so
/// never refreshes previously generated HTML on its own.
/// </summary>
public async Task<RServiceResult<bool>> RegenerateTajikCatAndPoetHtmlTextAsync()
{
try
{
var tajikPoets = await _context.TajikPoets.AsNoTracking().ToListAsync();
foreach (var tajikPoet in tajikPoets)
{
var poetPage = await _context.GanjoorPages.AsNoTracking().Where(p => p.GanjoorPageType == GanjoorPageType.PoetPage && p.PoetId == tajikPoet.Id).SingleOrDefaultAsync();
if (poetPage == null) continue;
var tajikPage = await _context.TajikPages.Where(p => p.Id == poetPage.Id).SingleOrDefaultAsync();
if (tajikPage == null) continue;
tajikPage.TajikHtmlText = await PrepareTajikPoetHtmlTextAsync(_context, tajikPoet);
}
await _context.SaveChangesAsync();
var tajikCats = await _context.TajikCats.AsNoTracking().ToListAsync();
foreach (var tajikCat in tajikCats)
{
var tajikPage = await _context.TajikPages.Where(p => p.Id == tajikCat.Id).SingleOrDefaultAsync();
if (tajikPage == null) continue;
tajikPage.TajikHtmlText = await PrepareTajikCatHtmlTextAsync(_context, tajikCat);
}
await _context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>

View File

@ -43,7 +43,11 @@ namespace RMuseum.Services.Implementation
var tajikPoem = tajikPoems.Where(p => p.Id == catPoem.Id).SingleOrDefault();
if(tajikPoem != null)
{
html += $"<p><a href=\"{catPoem.FullUrl}\">{LanguageUtils.CleanTextForTransileration(tajikPoem.TajikTitle)}</a></p>";
string excerpt = ExtractExcerpt(tajikPoem.TajikPlainText);
string title = LanguageUtils.CleanTextForTransileration(tajikPoem.TajikTitle);
html += string.IsNullOrEmpty(excerpt)
? $"<p><a href=\"{catPoem.FullUrl}\">{title}</a></p>"
: $"<p><a href=\"{catPoem.FullUrl}\">{title}</a>: {excerpt}</p>";
}
}
@ -76,7 +80,11 @@ namespace RMuseum.Services.Implementation
var tajikPoem = tajikPoems.Where(p => p.Id == catPoem.Id).SingleOrDefault();
if(tajikPoem != null)
{
html += $"<p><a href=\"{catPoem.FullUrl}\">{LanguageUtils.CleanTextForTransileration(tajikPoem.TajikTitle)}</a></p>";
string excerpt = ExtractExcerpt(tajikPoem.TajikPlainText);
string title = LanguageUtils.CleanTextForTransileration(tajikPoem.TajikTitle);
html += string.IsNullOrEmpty(excerpt)
? $"<p><a href=\"{catPoem.FullUrl}\">{title}</a></p>"
: $"<p><a href=\"{catPoem.FullUrl}\">{title}</a>: {excerpt}</p>";
}
}
return html;