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()); } }