adding an anonymous api for retrieving published recitations

This commit is contained in:
Hamid Reza Mohammadi 2020-12-03 17:14:10 +03:30
parent f6899176bd
commit d274326a97
5 changed files with 294 additions and 6 deletions

View File

@ -23,6 +23,28 @@ namespace RMuseum.Controllers
[Route("api/audio")]
public class RecitationController : Controller
{
/// <summary>
/// returns paginated published recitations, ordered by publish date descending
/// </summary>
/// <param name="paging"></param>
/// <param name="searchTerm"></param>
/// <returns></returns>
[HttpGet("published")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<PublicRecitationViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPublished([FromQuery] PagingParameterModel paging, string searchTerm = "")
{
var res = await _audioService.GetPublishedRecitations(paging, searchTerm);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
// Paging Header
HttpContext.Response.Headers.Add("paging-headers", JsonConvert.SerializeObject(res.Result.PagingMeta));
return Ok(res.Result.Items);
}
/// <summary>
/// Gets audio narrations, user must have recitation::moderate permission to be able to see all users narrations
@ -61,7 +83,7 @@ namespace RMuseum.Controllers
return StatusCode((int)HttpStatusCode.Forbidden);
}
var res = await _audioService.GetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status, searchTerm);
var res = await _audioService.SecureGetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status, searchTerm);
if(!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
@ -152,7 +174,7 @@ namespace RMuseum.Controllers
/// <returns></returns>
[HttpGet("verses/{id}")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(RecitationVerseSync[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPoemNarrationVerseSyncArray(int id)
{

View File

@ -0,0 +1,91 @@
using System;
namespace RMuseum.Models.GanjoorAudio.ViewModels
{
/// <summary>
/// Public (no user specific data) for publish recitations
/// </summary>
public class PublicRecitationViewModel
{
/// <summary>
/// Audio Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// Ganjoor Post Id
/// </summary>
public int PoemId { get; set; }
/// <summary>
/// Poem Full Title
/// </summary>
public string PoemFullTitle { get; set; }
/// <summary>
/// Poem Full Url (without domain name)
/// </summary>
public string PoemFullUrl { get; set; }
// <summary>
/// Audio Title
/// </summary>
public string AudioTitle { get; set; }
/// <summary>
/// Audio Artist
/// </summary>
public string AudioArtist { get; set; }
/// <summary>
/// Audio Artist Url
/// </summary>
public string AudioArtistUrl { get; set; }
/// <summary>
/// Audio Source
/// </summary>
public string AudioSrc { get; set; }
/// <summary>
/// Audio Src Url
/// </summary>
public string AudioSrcUrl { get; set; }
/// <summary>
/// Legacy Audio Guid
/// </summary>
public Guid LegacyAudioGuid { get; set; }
/// <summary>
/// Audio File CheckSum
/// </summary>
public string Mp3FileCheckSum { get; set; }
/// <summary>
/// mp3 size in bytes
/// </summary>
public int Mp3SizeInBytes { get; set; }
/// <summary>
/// Publish Date
/// </summary>
public DateTime PublishDate { get; set; }
/// <summary>
/// File Last Updated
/// </summary>
public DateTime FileLastUpdated { get; set; }
/// <summary>
/// Mp3 Url
/// </summary>
public string Mp3Url { get; set; }
/// <summary>
/// Xml Url
/// </summary>
public string XmlText { get; set; }
}
}

View File

@ -719,6 +719,14 @@
</summary>
<param name="notificationService"></param>
</member>
<member name="M:RMuseum.Controllers.RecitationController.GetPublished(RSecurityBackend.Models.Generic.PagingParameterModel,System.String)">
<summary>
returns paginated published recitations, ordered by publish date descending
</summary>
<param name="paging"></param>
<param name="searchTerm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<summary>
Gets audio narrations, user must have recitation::moderate permission to be able to see all users narrations
@ -2150,6 +2158,87 @@
is default
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel">
<summary>
Public (no user specific data) for publish recitations
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.Id">
<summary>
Audio Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.PoemId">
<summary>
Ganjoor Post Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.PoemFullTitle">
<summary>
Poem Full Title
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.PoemFullUrl">
<summary>
Poem Full Url (without domain name)
</summary>
</member>
<!-- Badly formed XML comment ignored for member "P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.AudioTitle" -->
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.AudioArtist">
<summary>
Audio Artist
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.AudioArtistUrl">
<summary>
Audio Artist Url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.AudioSrc">
<summary>
Audio Source
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.AudioSrcUrl">
<summary>
Audio Src Url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.LegacyAudioGuid">
<summary>
Legacy Audio Guid
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.Mp3FileCheckSum">
<summary>
Audio File CheckSum
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.Mp3SizeInBytes">
<summary>
mp3 size in bytes
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.PublishDate">
<summary>
Publish Date
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.FileLastUpdated">
<summary>
File Last Updated
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.Mp3Url">
<summary>
Mp3 Url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PublicRecitationViewModel.XmlText">
<summary>
Xml Url
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationModerationResult">
<summary>
Moderation Result
@ -5219,7 +5308,7 @@
Audio Narration Service Implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<member name="M:RMuseum.Services.Implementationa.RecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<summary>
returns list of narrations
</summary>
@ -5229,6 +5318,14 @@
<param name="searchTerm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetPublishedRecitations(RSecurityBackend.Models.Generic.PagingParameterModel,System.String)">
<summary>
returns list of publish narrations
</summary>
<param name="paging"></param>
<param name="searchTerm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.Get(System.Int32)">
<summary>
return selected narration information
@ -5521,7 +5618,7 @@
Audio Narration Service
</summary>
</member>
<member name="M:RMuseum.Services.IRecitationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<member name="M:RMuseum.Services.IRecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<summary>
returns list of narrations
</summary>
@ -5531,6 +5628,14 @@
<param name="searchTerm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRecitationService.GetPublishedRecitations(RSecurityBackend.Models.Generic.PagingParameterModel,System.String)">
<summary>
returns list of publish narrations
</summary>
<param name="paging"></param>
<param name="searchTerm"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRecitationService.Get(System.Int32)">
<summary>
return selected narration information

View File

@ -22,7 +22,15 @@ namespace RMuseum.Services
/// <param name="status"></param>
/// <param name="searchTerm"></param>
/// <returns></returns>
public Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm);
public Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm);
/// <summary>
/// returns list of publish narrations
/// </summary>
/// <param name="paging"></param>
/// <param name="searchTerm"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, PublicRecitationViewModel[] Items)>> GetPublishedRecitations(PagingParameterModel paging, string searchTerm);
/// <summary>
/// return selected narration information

View File

@ -39,7 +39,7 @@ namespace RMuseum.Services.Implementationa
/// <param name="status"></param>
/// <param name="searchTerm"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm)
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm)
{
try
{
@ -70,6 +70,68 @@ namespace RMuseum.Services.Implementationa
}
}
/// <summary>
/// returns list of publish narrations
/// </summary>
/// <param name="paging"></param>
/// <param name="searchTerm"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, PublicRecitationViewModel[] Items)>> GetPublishedRecitations(PagingParameterModel paging, string searchTerm)
{
try
{
var source =
from audio in _context.Recitations
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
where
audio.ReviewStatus == AudioReviewStatus.Approved
&&
(
string.IsNullOrEmpty(searchTerm) ||
(
!string.IsNullOrEmpty(searchTerm)
&&
(
audio.AudioArtist.Contains(searchTerm)
||
audio.AudioTitle.Contains(searchTerm)
||
poem.FullTitle.Contains(searchTerm)
))
)
orderby audio.ReviewDate descending
select new PublicRecitationViewModel()
{
Id = audio.Id,
PoemId = audio.GanjoorPostId,
PoemFullTitle = poem.FullTitle,
PoemFullUrl = poem.FullUrl,
AudioTitle = audio.AudioTitle,
AudioArtist = audio.AudioArtist,
AudioArtistUrl = audio.AudioArtistUrl,
AudioSrc = audio.AudioSrc,
AudioSrcUrl = audio.AudioSrcUrl,
LegacyAudioGuid = audio.LegacyAudioGuid,
Mp3FileCheckSum = audio.Mp3FileCheckSum,
Mp3SizeInBytes = audio.Mp3SizeInBytes,
PublishDate = audio.ReviewDate,
FileLastUpdated = audio.FileLastUpdated,
Mp3Url = $"https://ganjgah.ir/api/audio/file/{audio.Id}.mp3",
XmlText = $"https://ganjgah.ir/api/audio/xml/{audio.Id}",
};
(PaginationMetadata PagingMeta, PublicRecitationViewModel[] Items) paginatedResult =
await QueryablePaginator<PublicRecitationViewModel>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, PublicRecitationViewModel[] Items)>(paginatedResult);
}
catch (Exception exp)
{
return new RServiceResult<(PaginationMetadata PagingMeta, PublicRecitationViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString());
}
}
/// <summary>
/// return selected narration information
/// </summary>