more usable tracking data for remote synchronization process

This commit is contained in:
Hamid Reza Mohammadi 2020-11-27 11:59:12 +03:30
parent f09801fd0a
commit 83bb61f9c4
5 changed files with 244 additions and 36 deletions

View File

@ -530,20 +530,32 @@ namespace RMuseum.Controllers
/// <summary>
/// publishing tracker data
/// </summary>
/// <remarks>TODO: Poem Narration Data is not purified yet (includes sensitive information), so it needs a very special permission</remarks>
/// <param name="paging"></param>
/// <param name="inProgress"></param>
/// <param name="finished"></param>
/// <param name="unfinished"></param>
/// <returns></returns>
[HttpGet("publishqueue")]
[Authorize(Policy = RMuseumSecurableItem.AudioRecitationEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<RecitationPublishingTracker>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
public async Task<IActionResult> GetPublishingQueueStatus([FromQuery] PagingParameterModel paging, bool inProgress = true, bool finished = true)
public async Task<IActionResult> 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<bool>
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

View File

@ -0,0 +1,112 @@
using RMuseum.Models.Ganjoor;
using RSecurityBackend.Models.Auth.Db;
using System;
namespace RMuseum.Models.GanjoorAudio.ViewModels
{
/// <summary>
/// RecitationPublishingTracker View Model
/// </summary>
public class RecitationPublishingTrackerViewModel
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="tracker"></param>
/// <param name="poem"></param>
/// <param name="user"></param>
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;
}
/// <summary>
/// user email
/// </summary>
public string UserEmail { get; set; }
/// <summary>
/// Poem Full Title
/// </summary>
public string PoemFullTitle { get; set; }
/// <summary>
/// Artist Name
/// </summary>
public string ArtistName { get; set; }
/// <summary>
/// Operation
/// </summary>
public string Operation { get; set; }
/// <summary>
/// In Progress
/// </summary>
public bool InProgress { get; set; }
/// <summary>
/// XML File Copied
/// </summary>
public bool XmlFileCopied { get; set; }
/// <summary>
/// MP3 File Copied
/// </summary>
public bool Mp3FileCopied { get; set; }
/// <summary>
/// First MySql DB Updated
/// </summary>
public bool FirstDbUpdated { get; set; }
/// <summary>
/// Second DB Updated
/// </summary>
public bool SecondDbUpdated { get; set; }
/// <summary>
/// Succeeded
/// </summary>
public bool Succeeded { get; set; }
/// <summary>
/// Error
/// </summary>
public bool Error { get; set; }
/// <summary>
/// Exception
/// </summary>
public string LastException { get; set; }
/// <summary>
/// Start Date
/// </summary>
public DateTime StartDate { get; set; }
/// <summary>
/// Finish Date
/// </summary>
public DateTime FinishDate { get; set; }
}
}

View File

@ -825,14 +825,12 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Boolean)">
<member name="M:RMuseum.Controllers.RecitationController.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean)">
<summary>
publishing tracker data
</summary>
<remarks>TODO: Poem Narration Data is not purified yet (includes sensitive information), so it needs a very special permission</remarks>
<param name="paging"></param>
<param name="inProgress"></param>
<param name="finished"></param>
<param name="unfinished"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.TransferRecitationsOwnership(System.String,System.String)">
@ -2162,6 +2160,89 @@
Rejection Message
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel">
<summary>
RecitationPublishingTracker View Model
</summary>
</member>
<member name="M:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.#ctor(RMuseum.Models.GanjoorAudio.RecitationPublishingTracker,RMuseum.Models.Ganjoor.GanjoorPoem,RSecurityBackend.Models.Auth.Db.RAppUser,RMuseum.Models.GanjoorAudio.Recitation)">
<summary>
Constructor
</summary>
<param name="tracker"></param>
<param name="poem"></param>
<param name="user"></param>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.UserEmail">
<summary>
user email
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.PoemFullTitle">
<summary>
Poem Full Title
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.ArtistName">
<summary>
Artist Name
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.Operation">
<summary>
Operation
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.InProgress">
<summary>
In Progress
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.XmlFileCopied">
<summary>
XML File Copied
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.Mp3FileCopied">
<summary>
MP3 File Copied
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.FirstDbUpdated">
<summary>
First MySql DB Updated
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.SecondDbUpdated">
<summary>
Second DB Updated
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.Succeeded">
<summary>
Succeeded
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.Error">
<summary>
Error
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.LastException">
<summary>
Exception
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.StartDate">
<summary>
Start Date
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationPublishingTrackerViewModel.FinishDate">
<summary>
Finish Date
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.RecitationVerseSync">
<summary>
Verse Sync Range
@ -5223,13 +5304,13 @@
<param name="userId">if userId is empty all user uploads would be returned</param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Boolean)">
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Guid)">
<summary>
publishing tracker data
</summary>
<param name="paging"></param>
<param name="inProgress"></param>
<param name="finished"></param>
<param name="unfinished"></param>
<param name="filteredUserId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.TransferRecitationsOwnership(System.Guid,System.Guid,System.String)">
@ -5521,13 +5602,13 @@
retry publish unpublished narrations
</summary>
</member>
<member name="M:RMuseum.Services.IRecitationService.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Boolean)">
<member name="M:RMuseum.Services.IRecitationService.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Guid)">
<summary>
publishing tracker data
</summary>
<param name="paging"></param>
<param name="inProgress"></param>
<param name="finished"></param>
<param name="unfinished"></param>
<param name="filteredUserId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRecitationService.MakeArtistRecitationsFirst(System.String)">

View File

@ -170,10 +170,10 @@ namespace RMuseum.Services
/// publishing tracker data
/// </summary>
/// <param name="paging"></param>
/// <param name="inProgress"></param>
/// <param name="finished"></param>
/// <param name="unfinished"></param>
/// <param name="filteredUserId"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items)>> GetPublishingQueueStatus(PagingParameterModel paging, bool inProgress, bool finished);
Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items)>> GetPublishingQueueStatus(PagingParameterModel paging, bool unfinished, Guid filteredUserId);
/// <summary>
/// move recitaions of an artist to the first position

View File

@ -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
/// </summary>
/// <param name="paging"></param>
/// <param name="inProgress"></param>
/// <param name="finished"></param>
/// <param name="unfinished"></param>
/// <param name="filteredUserId"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items)>> GetPublishingQueueStatus(PagingParameterModel paging, bool inProgress, bool finished)
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items)>> 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<RecitationPublishingTracker>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, RecitationPublishingTracker[] Items)>(paginatedResult);
(PaginationMetadata PagingMeta, RecitationPublishingTrackerViewModel[] Items) paginatedResult =
await QueryablePaginator<RecitationPublishingTrackerViewModel>.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());
}
}