diff --git a/RMuseum/Controllers/ArtifactController.cs b/RMuseum/Controllers/ArtifactController.cs
index 28463542..514250f4 100644
--- a/RMuseum/Controllers/ArtifactController.cs
+++ b/RMuseum/Controllers/ArtifactController.cs
@@ -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);
diff --git a/RMuseum/Controllers/AudioNarrationController.cs b/RMuseum/Controllers/AudioNarrationController.cs
index ca3448c8..b0012285 100644
--- a/RMuseum/Controllers/AudioNarrationController.cs
+++ b/RMuseum/Controllers/AudioNarrationController.cs
@@ -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
{
+ ///
+ /// Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
+ ///
+ ///
+ /// default: false, user must have narration::moderate permission to be able to see all users narrations
+ /// default: -1, unfiltered
+ ///
+ [HttpGet]
+ [Authorize]
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable))]
+ [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
+ [ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
+
+ public async Task 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
+ 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);
+ }
+
+
///
/// imports data from ganjoor MySql database
///
diff --git a/RMuseum/Models/Auth/Memory/RMuseumSecurableItem.cs b/RMuseum/Models/Auth/Memory/RMuseumSecurableItem.cs
index 62a7b425..81127224 100644
--- a/RMuseum/Models/Auth/Memory/RMuseumSecurableItem.cs
+++ b/RMuseum/Models/Auth/Memory/RMuseumSecurableItem.cs
@@ -51,7 +51,7 @@ namespace RMuseum.Models.Auth.Memory
///
/// moderate
///
- public const string ModerateCommentsOperationShortName = "moderate";
+ public const string ModerateOperationShortName = "moderate";
///
/// 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)
}
},
diff --git a/RMuseum/Models/GanjoorAudio/AudioReviewStatus.cs b/RMuseum/Models/GanjoorAudio/AudioReviewStatus.cs
index 16d730da..4df7a2cc 100644
--- a/RMuseum/Models/GanjoorAudio/AudioReviewStatus.cs
+++ b/RMuseum/Models/GanjoorAudio/AudioReviewStatus.cs
@@ -5,19 +5,27 @@
///
public enum AudioReviewStatus
{
+ ///
+ /// All / Unfiltered (for queris)
+ ///
+ All = -1,
+ ///
+ /// Draft
+ ///
+ Draft = 0,
///
/// pending for review
///
- Pending = 0,
+ Pending = 1,
///
/// approved
///
- Approved = 1,
+ Approved = 2,
///
/// Rejected
///
- Rejected = 2
+ Rejected = 3
}
}
diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
index 9721abb3..40d6288e 100644
--- a/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
+++ b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
@@ -34,6 +34,8 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels
LocalMp3FilePath = src.LocalMp3FilePath;
LocalXmlFilePath = src.LocalXmlFilePath;
ReviewStatus = src.ReviewStatus;
+ UploadDate = src.UploadDate;
+ ReviewDate = src.ReviewDate;
List lst = new List();
foreach(AudioSyncStatus status in
new AudioSyncStatus[]
diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index 80293aaf..d9821015 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -620,6 +620,15 @@
Captcha service
+
+
+ Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
+
+
+ default: false, user must have narration::moderate permission to be able to see all users narrations
+ default: -1, unfiltered
+
+
imports data from ganjoor MySql database
@@ -1404,7 +1413,7 @@
import
-
+
moderate
@@ -1534,6 +1543,16 @@
Audio Review Status
+
+
+ All / Unfiltered (for queris)
+
+
+
+
+ Draft
+
+
pending for review
@@ -3199,6 +3218,15 @@
Audio Narration Service
+
+
+ returns list of narrations
+
+
+ send Guid.Empty if you want all narrations
+
+
+
imports data from ganjoor MySql database
@@ -3919,6 +3947,15 @@
Audio Narration Service Implementation
+
+
+ returns list of narrations
+
+
+ send Guid.Empty if you want all narrations
+
+
+
imports data from ganjoor MySql database
diff --git a/RMuseum/Services/IAudioNarrationService.cs b/RMuseum/Services/IAudioNarrationService.cs
index 86286ee1..98687b32 100644
--- a/RMuseum/Services/IAudioNarrationService.cs
+++ b/RMuseum/Services/IAudioNarrationService.cs
@@ -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
///
public interface IAudioNarrationService
{
+ ///
+ /// returns list of narrations
+ ///
+ ///
+ /// send Guid.Empty if you want all narrations
+ ///
+ ///
+ public Task> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status);
+
///
/// imports data from ganjoor MySql database
///
diff --git a/RMuseum/Services/Implementation/AudioNarrationService.cs b/RMuseum/Services/Implementation/AudioNarrationService.cs
index 6172bc66..b7e7843c 100644
--- a/RMuseum/Services/Implementation/AudioNarrationService.cs
+++ b/RMuseum/Services/Implementation/AudioNarrationService.cs
@@ -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
{
+
///
/// Audio Narration Service Implementation
///
public class AudioNarrationService : IAudioNarrationService
{
+ ///
+ /// returns list of narrations
+ ///
+ ///
+ /// send Guid.Empty if you want all narrations
+ ///
+ ///
+ public async Task> 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.Paginate(source, paging);
+
+ List res = new List();
+ 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());
+ }
+ }
+
///
/// imports data from ganjoor MySql database
///
diff --git a/RSecurityBackend/Models/Generic/PagingParameterModel.cs b/RSecurityBackend/Models/Generic/PagingParameterModel.cs
index 12243baa..114c6b5c 100644
--- a/RSecurityBackend/Models/Generic/PagingParameterModel.cs
+++ b/RSecurityBackend/Models/Generic/PagingParameterModel.cs
@@ -14,17 +14,17 @@
const int MaxPageSize = 1000;
///
- /// page number
+ /// page number starting from 1
///
public int PageNumber { get; set; } = 1;
///
- /// actual page size
+ /// actual page size (-1 == all items)
///
private int _pageSize { get; set; } = -1;
///
- /// settable page size
+ /// settable page size (-1 == all items, 1000 maxpagesize)
///
public int PageSize
{
diff --git a/RSecurityBackend/RSecurityBackend.xml b/RSecurityBackend/RSecurityBackend.xml
index 7f5fbf08..1c6f20f6 100644
--- a/RSecurityBackend/RSecurityBackend.xml
+++ b/RSecurityBackend/RSecurityBackend.xml
@@ -1669,17 +1669,17 @@
- page number
+ page number starting from 1
- actual page size
+ actual page size (-1 == all items)
- settable page size
+ settable page size (-1 == all items, 1000 maxpagesize)