diff --git a/RMuseum/Controllers/RecitationController.cs b/RMuseum/Controllers/RecitationController.cs
index ff199264..f275a0fe 100644
--- a/RMuseum/Controllers/RecitationController.cs
+++ b/RMuseum/Controllers/RecitationController.cs
@@ -530,20 +530,32 @@ namespace RMuseum.Controllers
///
/// publishing tracker data
///
- /// TODO: Poem Narration Data is not purified yet (includes sensitive information), so it needs a very special permission
///
- ///
- ///
+ ///
///
[HttpGet("publishqueue")]
- [Authorize(Policy = RMuseumSecurableItem.AudioRecitationEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
+ [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 GetPublishingQueueStatus([FromQuery] PagingParameterModel paging, bool inProgress = true, bool finished = true)
+ public async Task GetPublishingQueueStatus([FromQuery] PagingParameterModel paging, bool unfinished)
{
- var res = await _audioService.GetPublishingQueueStatus(paging, inProgress, finished);
+ Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
+ Guid sessionId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value);
+ RServiceResult
+ canViewAll =
+ await _userPermissionChecker.Check
+ (
+ loggedOnUserId,
+ sessionId,
+ RMuseumSecurableItem.AudioRecitationEntityShortName,
+ RMuseumSecurableItem.ModerateOperationShortName
+ );
+ if (!string.IsNullOrEmpty(canViewAll.ExceptionString))
+ return BadRequest(canViewAll.ExceptionString);
+
+ var res = await _audioService.GetPublishingQueueStatus(paging, unfinished, canViewAll.Result ? Guid.Empty : loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
// Paging Header
diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/RecitationPublishingTrackerViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/RecitationPublishingTrackerViewModel.cs
new file mode 100644
index 00000000..afb31b9b
--- /dev/null
+++ b/RMuseum/Models/GanjoorAudio/ViewModels/RecitationPublishingTrackerViewModel.cs
@@ -0,0 +1,112 @@
+using RMuseum.Models.Ganjoor;
+using RSecurityBackend.Models.Auth.Db;
+using System;
+
+namespace RMuseum.Models.GanjoorAudio.ViewModels
+{
+ ///
+ /// RecitationPublishingTracker View Model
+ ///
+ public class RecitationPublishingTrackerViewModel
+ {
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ ///
+ public RecitationPublishingTrackerViewModel(RecitationPublishingTracker tracker, GanjoorPoem poem, RAppUser user, Recitation recitation)
+ {
+ UserEmail = user.Email;
+ PoemFullTitle = poem.FullTitle;
+ ArtistName = recitation.AudioArtist;
+ Operation = recitation.AudioSyncStatus == AudioSyncStatus.NewItem ? "جدید" :
+ recitation.AudioSyncStatus == AudioSyncStatus.SoundOrXMLFilesChanged ? "جایگزینی فایل" :
+ recitation.AudioSyncStatus == AudioSyncStatus.MetadataChanged ? "تغییر اطلاعات" :
+ recitation.AudioSyncStatus == AudioSyncStatus.Deleted ? "حذف" :
+ "نامشخص (انجام شده)";
+ InProgress = !tracker.Finished && string.IsNullOrEmpty(tracker.LastException);
+ XmlFileCopied = tracker.XmlFileCopied;
+ Mp3FileCopied = tracker.Mp3FileCopied;
+ FirstDbUpdated = tracker.FirstDbUpdated;
+ SecondDbUpdated = tracker.SecondDbUpdated;
+ Succeeded = tracker.Finished;
+ Error = !string.IsNullOrEmpty(tracker.LastException);
+ LastException = tracker.LastException;
+ StartDate = tracker.StartDate;
+ FinishDate = tracker.FinishDate;
+ }
+
+ ///
+ /// user email
+ ///
+ public string UserEmail { get; set; }
+
+ ///
+ /// Poem Full Title
+ ///
+ public string PoemFullTitle { get; set; }
+
+ ///
+ /// Artist Name
+ ///
+ public string ArtistName { get; set; }
+
+ ///
+ /// Operation
+ ///
+ public string Operation { get; set; }
+
+ ///
+ /// In Progress
+ ///
+ public bool InProgress { get; set; }
+
+ ///
+ /// XML File Copied
+ ///
+ public bool XmlFileCopied { get; set; }
+
+ ///
+ /// MP3 File Copied
+ ///
+ public bool Mp3FileCopied { get; set; }
+
+ ///
+ /// First MySql DB Updated
+ ///
+ public bool FirstDbUpdated { get; set; }
+
+ ///
+ /// Second DB Updated
+ ///
+ public bool SecondDbUpdated { get; set; }
+
+ ///
+ /// Succeeded
+ ///
+ public bool Succeeded { get; set; }
+
+ ///
+ /// Error
+ ///
+ public bool Error { get; set; }
+
+ ///
+ /// Exception
+ ///
+ public string LastException { get; set; }
+
+ ///
+ /// Start Date
+ ///
+ public DateTime StartDate { get; set; }
+
+ ///
+ /// Finish Date
+ ///
+ public DateTime FinishDate { get; set; }
+
+
+ }
+}
diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index 2b1d2cc3..9a3cc1db 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -825,14 +825,12 @@
-
+
publishing tracker data
- TODO: Poem Narration Data is not purified yet (includes sensitive information), so it needs a very special permission
-
-
+
@@ -2162,6 +2160,89 @@
Rejection Message
+
+
+ RecitationPublishingTracker View Model
+
+
+
+
+ Constructor
+
+
+
+
+
+
+
+ user email
+
+
+
+
+ Poem Full Title
+
+
+
+
+ Artist Name
+
+
+
+
+ Operation
+
+
+
+
+ In Progress
+
+
+
+
+ XML File Copied
+
+
+
+
+ MP3 File Copied
+
+
+
+
+ First MySql DB Updated
+
+
+
+
+ Second DB Updated
+
+
+
+
+ Succeeded
+
+
+
+
+ Error
+
+
+
+
+ Exception
+
+
+
+
+ Start Date
+
+
+
+
+ Finish Date
+
+
Verse Sync Range
@@ -5223,13 +5304,13 @@
if userId is empty all user uploads would be returned
-
+
publishing tracker data
-
-
+
+
@@ -5521,13 +5602,13 @@
retry publish unpublished narrations
-
+
publishing tracker data
-
-
+
+
diff --git a/RMuseum/Services/IRecitationService.cs b/RMuseum/Services/IRecitationService.cs
index 04bbd13e..c6000a32 100644
--- a/RMuseum/Services/IRecitationService.cs
+++ b/RMuseum/Services/IRecitationService.cs
@@ -170,10 +170,10 @@ namespace RMuseum.Services
/// publishing tracker data
///
///
- ///
- ///
+ ///
+ ///
///
- Task> GetPublishingQueueStatus(PagingParameterModel paging, bool inProgress, bool finished);
+ Task> GetPublishingQueueStatus(PagingParameterModel paging, bool unfinished, Guid filteredUserId);
///
/// move recitaions of an artist to the first position
diff --git a/RMuseum/Services/Implementation/RecitationService.cs b/RMuseum/Services/Implementation/RecitationService.cs
index de4099d9..ebc77f1d 100644
--- a/RMuseum/Services/Implementation/RecitationService.cs
+++ b/RMuseum/Services/Implementation/RecitationService.cs
@@ -1253,7 +1253,7 @@ namespace RMuseum.Services.Implementationa
if (_backgroundTaskQueue.Count > 0)
return;
- var unpublishedQueue = await _context.RecitationPublishingTrackers.Where(r => r.Finished == false).ToArrayAsync();
+ var unpublishedQueue = await _context.RecitationPublishingTrackers.ToArrayAsync();
if (unpublishedQueue.Length > 0)
{
_context.RecitationPublishingTrackers.RemoveRange(unpublishedQueue);
@@ -1622,32 +1622,35 @@ namespace RMuseum.Services.Implementationa
/// publishing tracker data
///
///
- ///
- ///
+ ///
+ ///
///
- public async Task> GetPublishingQueueStatus(PagingParameterModel paging, bool inProgress, bool finished)
+ public async Task> GetPublishingQueueStatus(PagingParameterModel paging, bool unfinished, Guid filteredUserId)
{
try
{
var source =
- from tracker in _context.RecitationPublishingTrackers
- .Include(t => t.PoemNarration)
- .Where(a =>
- (inProgress && !a.Finished)
- ||
- (finished && a.Finished)
- )
- .OrderByDescending(a => a.StartDate)
- select tracker;
+ from tracker in _context.RecitationPublishingTrackers
+ join recitation in _context.Recitations.Include(a => a.Owner)
+ on tracker.PoemNarrationId equals recitation.Id
+ join poem in _context.GanjoorPoems
+ on recitation.GanjoorPostId equals poem.Id
+ where
+ (filteredUserId == Guid.Empty || recitation.OwnerId == filteredUserId)
+ &&
+ (!unfinished || (unfinished && !tracker.Finished))
+ orderby tracker.StartDate descending
+ select new RecitationPublishingTrackerViewModel(tracker, poem, recitation.Owner, recitation);
- (PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items) paginatedResult =
- await QueryablePaginator.Paginate(source, paging);
- return new RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items)>(paginatedResult);
+ (PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items) paginatedResult =
+ await QueryablePaginator.Paginate(source, paging);
+
+ return new RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items)>(paginatedResult);
}
catch (Exception exp)
{
- return new RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items)>((PagingMeta: null, Items: null), exp.ToString());
+ return new RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString());
}
}