docs: #365 API for querying sections by language

This commit is contained in:
Hamid Reza Mohammadi 2023-02-16 21:17:14 +03:30
parent 73495a9329
commit 96890e36f6
4 changed files with 137 additions and 0 deletions

View File

@ -2247,6 +2247,31 @@ namespace RMuseum.Controllers
return Ok(pagedResult.Result.Items);
}
/// <summary>
/// language tagged poem sections
/// </summary>
/// <param name="paging"></param>
/// <param name="language">fa-IR, ar, ...</param>
/// <param name="poetId">0 means all poets</param>
/// <returns></returns>
[HttpGet]
[Route("sections/tagged/language")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<GanjoorPoemCompleteViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetLanguageTaggedPoemSections([FromQuery] PagingParameterModel paging, string language, int poetId = 0)
{
var pagedResult = await _ganjoorService.GetLanguageTaggedPoemSections(paging, language, poetId == 0 ? (int?)null : poetId);
if (!string.IsNullOrEmpty(pagedResult.ExceptionString))
return BadRequest(pagedResult.ExceptionString);
// Paging Header
HttpContext.Response.Headers.Add("paging-headers", JsonConvert.SerializeObject(pagedResult.Result.PagingMeta));
return Ok(pagedResult.Result.Items);
}
/// <summary>
/// search
/// </summary>

View File

@ -1529,6 +1529,15 @@
<param name="poetId">send 0 for all</param>
<returns>return value is not complete or valid for some parts, you should use only the valid parts!</returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.GetLanguageTaggedPoemSections(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Int32)">
<summary>
language tagged poem sections
</summary>
<param name="paging"></param>
<param name="language">fa-IR, ar, ...</param>
<param name="poetId">0 means all poets</param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.Search(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Int32,System.Int32)">
<summary>
search
@ -12564,6 +12573,15 @@
<param name="poetId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.GetLanguageTaggedPoemSections(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Nullable{System.Int32})">
<summary>
language tagged poem sections
</summary>
<param name="paging"></param>
<param name="language"></param>
<param name="poetId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.UpdatePageAsync(System.Int32,System.Guid,RMuseum.Models.Ganjoor.ViewModels.GanjoorModifyPageViewModel)">
<summary>
modify page
@ -15607,6 +15625,15 @@
<param name="poetId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetLanguageTaggedPoemSections(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Nullable{System.Int32})">
<summary>
language tagged poem sections
</summary>
<param name="paging"></param>
<param name="language"></param>
<param name="poetId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.Search(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Nullable{System.Int32},System.Nullable{System.Int32})">
<summary>
Search

View File

@ -451,6 +451,15 @@ namespace RMuseum.Services
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items)>> GetSimilarPoems(PagingParameterModel paging, string metre, string rhyme, int? poetId);
/// <summary>
/// language tagged poem sections
/// </summary>
/// <param name="paging"></param>
/// <param name="language"></param>
/// <param name="poetId"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items)>> GetLanguageTaggedPoemSections(PagingParameterModel paging, string language, int? poetId);
/// <summary>
/// modify page
/// </summary>

View File

@ -2331,6 +2331,82 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// language tagged poem sections
/// </summary>
/// <param name="paging"></param>
/// <param name="language"></param>
/// <param name="poetId"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items)>> GetLanguageTaggedPoemSections(PagingParameterModel paging, string language, int? poetId)
{
if(string.IsNullOrEmpty(language))
{
language = "fa-IR";
}
var source =
_context.GanjoorPoemSections.Include(s => s.Poem).Include(s => s.Poet).Include(s => s.GanjoorMetre)
.Where(s =>
(poetId == null || s.PoetId == poetId)
&&
((language == "fa-IR" && string.IsNullOrEmpty(s.Language)) || s.Language == language)
&&
s.SectionType == PoemSectionType.WholePoem
)
.OrderBy(p => p.Poet.BirthYearInLHijri).ThenBy(p => p.Poet.Nickname).ThenBy(p => p.Poem.Id)
.Select
(
section =>
new GanjoorPoemCompleteViewModel()
{
Id = section.Poem.Id,
Title = section.Poem.Title,
FullTitle = section.Poem.FullTitle,
FullUrl = section.CachedFirstCoupletIndex == 0 ? section.Poem.FullUrl : section.Poem.FullUrl + "#bn" + (section.CachedFirstCoupletIndex + 1).ToString(),
UrlSlug = section.Poem.UrlSlug,
HtmlText = section.HtmlText,
PlainText = section.PlainText,
MixedModeOrder = section.Poem.MixedModeOrder,
Published = section.Poem.Published,
Language = section.Poem.Language,
Category = new GanjoorPoetCompleteViewModel()
{
Poet = new GanjoorPoetViewModel()
{
Id = section.Poet.Id,
}
},
SectionIndex = section.Index
}
).AsNoTracking();
(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items) paginatedResult =
await QueryablePaginator<GanjoorPoemCompleteViewModel>.Paginate(source, paging);
Dictionary<int, GanjoorPoetCompleteViewModel> cachedPoets = new Dictionary<int, GanjoorPoetCompleteViewModel>();
foreach (var item in paginatedResult.Items)
{
if (cachedPoets.TryGetValue(item.Category.Poet.Id, out GanjoorPoetCompleteViewModel poet))
{
item.Category = poet;
}
else
{
poet = (await GetPoetById(item.Category.Poet.Id)).Result;
cachedPoets.Add(item.Category.Poet.Id, poet);
item.Category = poet;
}
}
return new RServiceResult<(PaginationMetadata PagingMeta, GanjoorPoemCompleteViewModel[] Items)>(paginatedResult);
}
/// <summary>