#5 audio narrations secure get api is ready
This commit is contained in:
parent
464f69feca
commit
80ccc62162
@ -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);
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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)
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<AudioSyncStatus> lst = new List<AudioSyncStatus>();
|
||||
foreach(AudioSyncStatus status in
|
||||
new AudioSyncStatus[]
|
||||
|
||||
@ -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
|
||||
@ -3199,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
|
||||
@ -3919,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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user