Merge pull request #6 from ganjoor/audioman

Audioman
This commit is contained in:
Hamid Reza Mohammadi 2020-08-30 17:15:51 +04:30 committed by GitHub
commit afa5e5025b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 558 additions and 17 deletions

View File

@ -1423,7 +1423,7 @@ namespace RMuseum.Controllers
loggedOnUserId,
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
RMuseumSecurableItem.NoteEntityShortName,
RMuseumSecurableItem.ModerateCommentsOperationShortName
RMuseumSecurableItem.ModerateOperationShortName
);
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
return BadRequest(canModerate.ExceptionString);
@ -1460,7 +1460,7 @@ namespace RMuseum.Controllers
loggedOnUserId,
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
RMuseumSecurableItem.NoteEntityShortName,
RMuseumSecurableItem.ModerateCommentsOperationShortName
RMuseumSecurableItem.ModerateOperationShortName
);
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
return BadRequest(canModerate.ExceptionString);

View File

@ -1,10 +1,14 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using RMuseum.Models.Auth.Memory;
using RMuseum.Models.GanjoorAudio;
using RMuseum.Models.GanjoorAudio.ViewModels;
using RMuseum.Services;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
@ -16,6 +20,53 @@ namespace RMuseum.Controllers
public class AudioNarrationController : Controller
{
/// <summary>
/// Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
/// </summary>
/// <param name="paging"></param>
/// <param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users narrations</param>
/// <param name="status">default: -1, unfiltered</param>
/// <returns></returns>
[HttpGet]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<PoemNarrationViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
public async Task<IActionResult> Get([FromQuery] PagingParameterModel paging, bool allUsers = false, AudioReviewStatus status = AudioReviewStatus.All )
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
Guid sessionId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value);
if (allUsers)
{
RServiceResult<bool>
canView =
await _userPermissionChecker.Check
(
loggedOnUserId,
sessionId,
RMuseumSecurableItem.AudioNarrationEntityShortName,
RMuseumSecurableItem.ModerateOperationShortName
);
if (!string.IsNullOrEmpty(canView.ExceptionString))
return BadRequest(canView.ExceptionString);
if (!canView.Result)
return StatusCode((int)HttpStatusCode.Forbidden);
}
var res = await _audioService.GetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status);
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>
/// imports data from ganjoor MySql database
/// </summary>

View File

@ -51,7 +51,7 @@ namespace RMuseum.Models.Auth.Memory
///<summary>
/// moderate
/// </summary>
public const string ModerateCommentsOperationShortName = "moderate";
public const string ModerateOperationShortName = "moderate";
///<summary>
/// review suggested ganjoor links
@ -108,7 +108,7 @@ namespace RMuseum.Models.Auth.Memory
Description = "یادداشتها",
Operations = new SecurableItemOperation[]
{
new SecurableItemOperation(ModerateCommentsOperationShortName, "بررسی", false)
new SecurableItemOperation(ModerateOperationShortName, "بررسی", false)
}
},
new SecurableItem()
@ -118,7 +118,7 @@ namespace RMuseum.Models.Auth.Memory
Operations = new SecurableItemOperation[]
{
new SecurableItemOperation(ImportOperationShortName, "ورود اطلاعات", false),
new SecurableItemOperation(ModerateCommentsOperationShortName, "بررسی", false)
new SecurableItemOperation(ModerateOperationShortName, "بررسی", false)
}
},

View File

@ -5,19 +5,27 @@
/// </summary>
public enum AudioReviewStatus
{
/// <summary>
/// All / Unfiltered (for queris)
/// </summary>
All = -1,
/// <summary>
/// Draft
/// </summary>
Draft = 0,
/// <summary>
/// pending for review
/// </summary>
Pending = 0,
Pending = 1,
/// <summary>
/// approved
/// </summary>
Approved = 1,
Approved = 2,
/// <summary>
/// Rejected
/// </summary>
Rejected = 2
Rejected = 3
}
}

View File

@ -89,6 +89,11 @@ namespace RMuseum.Models.GanjoorAudio
/// </remarks>
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
/// <summary>
/// XML url
/// </summary>
public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
/// <summary>
/// Audio Title
/// </summary>

View File

@ -0,0 +1,216 @@
using RSecurityBackend.Models.Auth.ViewModels;
using System;
using System.Collections.Generic;
namespace RMuseum.Models.GanjoorAudio.ViewModels
{
/// <summary>
/// Poem Narration view model
/// </summary>
public class PoemNarrationViewModel
{
/// <summary>
/// constructor
/// </summary>
/// <param name="src"></param>
public PoemNarrationViewModel(PoemNarration src)
{
Id = src.Id;
Owner = new PublicRAppUser(src.Owner);
GanjoorAudioId = src.GanjoorAudioId;
GanjoorPostId = src.GanjoorPostId;
AudioOrder = src.AudioOrder;
FileNameWithoutExtension = src.FileNameWithoutExtension;
SoundFilesFolder = src.SoundFilesFolder;
AudioTitle = src.AudioTitle;
AudioArtist = src.AudioArtist;
AudioArtistUrl = src.AudioArtistUrl;
AudioSrc = src.AudioSrc;
AudioSrcUrl = src.AudioSrcUrl;
LegacyAudioGuid = src.LegacyAudioGuid;
Mp3FileCheckSum = src.Mp3FileCheckSum;
Mp3SizeInBytes = src.Mp3SizeInBytes;
OggSizeInBytes = src.OggSizeInBytes;
LocalMp3FilePath = src.LocalMp3FilePath;
LocalXmlFilePath = src.LocalXmlFilePath;
ReviewStatus = src.ReviewStatus;
UploadDate = src.UploadDate;
ReviewDate = src.ReviewDate;
List<AudioSyncStatus> lst = new List<AudioSyncStatus>();
foreach(AudioSyncStatus status in
new AudioSyncStatus[]
{
AudioSyncStatus.SynchronizedOrRejected,
AudioSyncStatus.NewItem,
AudioSyncStatus.MetadataChanged,
AudioSyncStatus.SoundFilesChanged,
AudioSyncStatus.XmlFileChanged,
AudioSyncStatus.Deleted
})
{
if(
src.AudioSyncStatus == (( (int)status )| src.AudioSyncStatus)
)
{
lst.Add(status);
}
}
AudioSyncStatusArray = lst.ToArray();
}
/// <summary>
/// Id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Owner User
/// </summary>
public PublicRAppUser Owner { get; set; }
/// <summary>
/// Final data is actually exported to a MySQL database which this auto increment field is its key
/// </summary>
public int GanjoorAudioId { get; set; }
/// <summary>
/// Ganjoor Post Id
/// </summary>
public int GanjoorPostId { get; set; }
/// <summary>
/// This determines where an audio is displayed between a list of sounds related to a specfic poem
/// </summary>
public int AudioOrder { get; set; }
/// <summary>
/// Using this field content you would determine xml, mp3 and ogg file names
/// </summary>
public string FileNameWithoutExtension { get; set; }
/// <summary>
/// combining this with <see cref="FileNameWithoutExtension"/> + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
/// </summary>
/// <sample>
/// "a2"
/// </sample>
/// <remarks>
/// We had previously used different pathes because when a directory became overcrowded our connection time would increase unbearably due to IRAN internet problems, so it is sensible to store it per record and not as a global option value
/// </remarks>
public string SoundFilesFolder { get; set; }
/// <summary>
/// MP3 File Path
/// </summary>
public string RemoteMp3FilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
/// <summary>
/// MP3 url
/// </summary>
public string Mp3Url { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
/// <summary>
/// OGG File Path
/// </summary>
public string RemoteOggFilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
/// <summary>
/// OGG url
/// </summary>
public string OggUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
/// <summary>
/// This is also a legacy field
/// </summary>
/// <sample>
/// "/i/a2/x"
/// </sample>
/// <remarks>
/// XML Schema is defined based on Desktop Ganjoor (https://github.com/ganjoor/ganjoor) code, for
/// more information take a look at this code:
/// https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
/// </remarks>
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
/// <summary>
/// XML url
/// </summary>
public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
/// <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>
/// ogg size in bytes
/// </summary>
public int OggSizeInBytes { get; set; }
/// <summary>
/// Upload Date
/// </summary>
public DateTime UploadDate { get; set; }
/// <summary>
/// Review Date (Approve or Reject)
/// </summary>
public DateTime ReviewDate { get; set; }
/// <summary>
/// MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
/// </summary>
public string LocalMp3FilePath { get; set; }
/// <summary>
/// XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
/// </summary>
public string LocalXmlFilePath { get; set; }
/// <summary>
/// Value is one or a combination of <see cref="RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
/// </summary>
public AudioSyncStatus[] AudioSyncStatusArray { get; set; }
/// <summary>
/// Review Status
/// </summary>
public AudioReviewStatus ReviewStatus { get; set; }
}
}

View File

@ -620,6 +620,15 @@
Captcha service
</summary>
</member>
<member name="M:RMuseum.Controllers.AudioNarrationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
<summary>
Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
</summary>
<param name="paging"></param>
<param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users narrations</param>
<param name="status">default: -1, unfiltered</param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.AudioNarrationController.MysqlonetimeImport">
<summary>
imports data from ganjoor MySql database
@ -1404,7 +1413,7 @@
import
</summary>
</member>
<member name="F:RMuseum.Models.Auth.Memory.RMuseumSecurableItem.ModerateCommentsOperationShortName">
<member name="F:RMuseum.Models.Auth.Memory.RMuseumSecurableItem.ModerateOperationShortName">
<summary>
moderate
</summary>
@ -1534,6 +1543,16 @@
Audio Review Status
</summary>
</member>
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.All">
<summary>
All / Unfiltered (for queris)
</summary>
</member>
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.Draft">
<summary>
Draft
</summary>
</member>
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.Pending">
<summary>
pending for review
@ -1668,6 +1687,11 @@
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
</remarks>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.PoemNarration.XMLUrl">
<summary>
XML url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.PoemNarration.AudioTitle">
<summary>
Audio Title
@ -1743,6 +1767,171 @@
Review Status
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel">
<summary>
Poem Narration view model
</summary>
</member>
<member name="M:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.#ctor(RMuseum.Models.GanjoorAudio.PoemNarration)">
<summary>
constructor
</summary>
<param name="src"></param>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Owner">
<summary>
Owner User
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.GanjoorAudioId">
<summary>
Final data is actually exported to a MySQL database which this auto increment field is its key
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.GanjoorPostId">
<summary>
Ganjoor Post Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioOrder">
<summary>
This determines where an audio is displayed between a list of sounds related to a specfic poem
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.FileNameWithoutExtension">
<summary>
Using this field content you would determine xml, mp3 and ogg file names
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.SoundFilesFolder">
<summary>
combining this with <see cref="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.FileNameWithoutExtension"/> + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
</summary>
<sample>
"a2"
</sample>
<remarks>
We had previously used different pathes because when a directory became overcrowded our connection time would increase unbearably due to IRAN internet problems, so it is sensible to store it per record and not as a global option value
</remarks>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteMp3FilePath">
<summary>
MP3 File Path
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3Url">
<summary>
MP3 url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteOggFilePath">
<summary>
OGG File Path
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.OggUrl">
<summary>
OGG url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteXMLFilePath">
<summary>
This is also a legacy field
</summary>
<sample>
"/i/a2/x"
</sample>
<remarks>
XML Schema is defined based on Desktop Ganjoor (https://github.com/ganjoor/ganjoor) code, for
more information take a look at this code:
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
</remarks>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.XMLUrl">
<summary>
XML url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioTitle">
<summary>
Audio Title
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioArtist">
<summary>
Audio Artist
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioArtistUrl">
<summary>
Audio Artist Url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSrc">
<summary>
Audio Source
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSrcUrl">
<summary>
Audio Src Url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LegacyAudioGuid">
<summary>
Legacy Audio Guid
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3FileCheckSum">
<summary>
Audio File CheckSum
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3SizeInBytes">
<summary>
mp3 size in bytes
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.OggSizeInBytes">
<summary>
ogg size in bytes
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.UploadDate">
<summary>
Upload Date
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.ReviewDate">
<summary>
Review Date (Approve or Reject)
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LocalMp3FilePath">
<summary>
MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LocalXmlFilePath">
<summary>
XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSyncStatusArray">
<summary>
Value is one or a combination of <see cref="T:RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.ReviewStatus">
<summary>
Review Status
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorIntegration.GanjoorLink">
<summary>
ganjoor link for artifacts and items
@ -3029,6 +3218,15 @@
Audio Narration Service
</summary>
</member>
<member name="M:RMuseum.Services.IAudioNarrationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
<summary>
returns list of narrations
</summary>
<param name="paging"></param>
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IAudioNarrationService.OneTimeImport(System.Guid)">
<summary>
imports data from ganjoor MySql database
@ -3749,6 +3947,15 @@
Audio Narration Service Implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
<summary>
returns list of narrations
</summary>
<param name="paging"></param>
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
<param name="status"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.OneTimeImport(System.Guid)">
<summary>
imports data from ganjoor MySql database

View File

@ -1,4 +1,6 @@
using RSecurityBackend.Models.Generic;
using RMuseum.Models.GanjoorAudio;
using RMuseum.Models.GanjoorAudio.ViewModels;
using RSecurityBackend.Models.Generic;
using System;
using System.Threading.Tasks;
@ -9,6 +11,15 @@ namespace RMuseum.Services
/// </summary>
public interface IAudioNarrationService
{
/// <summary>
/// returns list of narrations
/// </summary>
/// <param name="paging"></param>
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
/// <param name="status"></param>
/// <returns></returns>
public Task<RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status);
/// <summary>
/// imports data from ganjoor MySql database
/// </summary>

View File

@ -3,21 +3,64 @@ using Microsoft.Extensions.Configuration;
using MySql.Data.MySqlClient;
using RMuseum.DbContext;
using RMuseum.Models.GanjoorAudio;
using RMuseum.Models.GanjoorAudio.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Security.Policy;
using System.Threading.Tasks;
namespace RMuseum.Services.Implementation
{
/// <summary>
/// Audio Narration Service Implementation
/// </summary>
public class AudioNarrationService : IAudioNarrationService
{
/// <summary>
/// returns list of narrations
/// </summary>
/// <param name="paging"></param>
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
/// <param name="status"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status)
{
try
{
var source =
_context.AudioFiles
.Include(a => a.Owner)
.Where(a =>
(filteredUserId == Guid.Empty || a.OwnerId == filteredUserId)
&&
(status == AudioReviewStatus.All || a.ReviewStatus == status)
)
.OrderBy(a => a.UploadDate)
.AsQueryable();
(PaginationMetadata PagingMeta, PoemNarration[] Items) paginatedResult =
await QueryablePaginator<PoemNarration>.Paginate(source, paging);
List<PoemNarrationViewModel> res = new List<PoemNarrationViewModel>();
foreach(PoemNarration audio in paginatedResult.Items)
{
res.Add(new PoemNarrationViewModel(audio));
}
return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((paginatedResult.PagingMeta, res.ToArray()));
}
catch (Exception exp)
{
return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString());
}
}
/// <summary>
/// imports data from ganjoor MySql database
/// </summary>

View File

@ -14,17 +14,17 @@
const int MaxPageSize = 1000;
/// <summary>
/// page number
/// page number starting from 1
/// </summary>
public int PageNumber { get; set; } = 1;
/// <summary>
/// actual page size
/// actual page size (-1 == all items)
/// </summary>
private int _pageSize { get; set; } = -1;
/// <summary>
/// settable page size
/// settable page size (-1 == all items, 1000 maxpagesize)
/// </summary>
public int PageSize
{

View File

@ -1669,17 +1669,17 @@
</member>
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageNumber">
<summary>
page number
page number starting from 1
</summary>
</member>
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel._pageSize">
<summary>
actual page size
actual page size (-1 == all items)
</summary>
</member>
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageSize">
<summary>
settable page size
settable page size (-1 == all items, 1000 maxpagesize)
</summary>
</member>
<member name="T:RSecurityBackend.Models.Generic.RServiceResult`1">