#44 syncque api

This commit is contained in:
Hamid Reza Mohammadi 2020-11-26 11:41:06 +03:30
parent d7e4ebc760
commit f6696f129f
7 changed files with 100 additions and 46 deletions

View File

@ -600,6 +600,25 @@ namespace RMuseum.Controllers
}
/// <summary>
/// Synchronization Queue
/// </summary>
/// <returns></returns>
[HttpGet("syncqueue")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<RecitationViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
public async Task<IActionResult> GetSynchronizationQueue()
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = await _audioService.GetSynchronizationQueue(loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// constructor
/// </summary>

View File

@ -23,7 +23,7 @@
/// <summary>
/// sound files should be reuploaded (this means xml file is also needs to reuploaded)
/// </summary>
SoundFilesChanged = 4,
SoundOrXMLFilesChanged = 4,
/// <summary>
/// Xml file should be reuploaded

View File

@ -169,9 +169,9 @@ namespace RMuseum.Models.GanjoorAudio
public string LocalXmlFilePath { get; set; }
/// <summary>
/// Value is one or a combination of <see cref="RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
/// AudioSyncStatus
/// </summary>
public int AudioSyncStatus { get; set; }
public AudioSyncStatus AudioSyncStatus { get; set; }
/// <summary>
/// Review Status

View File

@ -53,26 +53,7 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels
PoemFullTitle = poem.FullTitle;
PoemFullUrl = poem.FullUrl;
}
List<AudioSyncStatus> lst = new List<AudioSyncStatus>();
foreach(AudioSyncStatus status in
new AudioSyncStatus[]
{
AudioSyncStatus.SynchronizedOrRejected,
AudioSyncStatus.NewItem,
AudioSyncStatus.MetadataChanged,
AudioSyncStatus.SoundFilesChanged,
AudioSyncStatus.Deleted
})
{
if(
src.AudioSyncStatus == (( (int)status )| src.AudioSyncStatus)
)
{
lst.Add(status);
}
}
AudioSyncStatusArray = lst.ToArray();
AudioSyncStatus = src.AudioSyncStatus;
ReviewMsg = src.ReviewMsg;
}
@ -240,7 +221,7 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels
/// <summary>
/// Value is one or a combination of <see cref="RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
/// </summary>
public AudioSyncStatus[] AudioSyncStatusArray { get; set; }
public AudioSyncStatus AudioSyncStatus { get; set; }
/// <summary>
/// Review Status

View File

@ -849,6 +849,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.GetSynchronizationQueue">
<summary>
Synchronization Queue
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.#ctor(RMuseum.Services.IRecitationService,RSecurityBackend.Services.IUserPermissionChecker,RSecurityBackend.Services.IAppUserService)">
<summary>
constructor
@ -1801,7 +1807,7 @@
meta data should be updated
</summary>
</member>
<member name="F:RMuseum.Models.GanjoorAudio.AudioSyncStatus.SoundFilesChanged">
<member name="F:RMuseum.Models.GanjoorAudio.AudioSyncStatus.SoundOrXMLFilesChanged">
<summary>
sound files should be reuploaded (this means xml file is also needs to reuploaded)
</summary>
@ -1976,7 +1982,7 @@
</member>
<member name="P:RMuseum.Models.GanjoorAudio.Recitation.AudioSyncStatus">
<summary>
Value is one or a combination of <see cref="T:RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
AudioSyncStatus
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.Recitation.ReviewStatus">
@ -2348,7 +2354,7 @@
XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationViewModel.AudioSyncStatusArray">
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationViewModel.AudioSyncStatus">
<summary>
Value is one or a combination of <see cref="T:RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
</summary>
@ -5173,6 +5179,13 @@
<param name="artistName"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.RecitationService.GetSynchronizationQueue(System.Guid)">
<summary>
Synchronization Queue
</summary>
<param name="filteredUserId"></param>
<returns></returns>
</member>
<member name="P:RMuseum.Services.Implementation.RecitationService.Configuration">
<summary>
Configuration
@ -5519,6 +5532,13 @@
<param name="artistName"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRecitationService.GetSynchronizationQueue(System.Guid)">
<summary>
Synchronization Queue
</summary>
<param name="filteredUserId"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.IRNotificationService">
<summary>
Internal messaging system interface

View File

@ -181,5 +181,12 @@ namespace RMuseum.Services
/// <param name="artistName"></param>
/// <returns></returns>
Task<RServiceResult<int>> MakeArtistRecitationsFirst(string artistName);
/// <summary>
/// Synchronization Queue
/// </summary>
/// <param name="filteredUserId"></param>
/// <returns></returns>
Task<RServiceResult<RecitationViewModel[]>> GetSynchronizationQueue(Guid filteredUserId);
}
}

View File

@ -116,7 +116,7 @@ namespace RMuseum.Services.Implementation
if (recitation.ReviewStatus == AudioReviewStatus.Approved)
{
recitation.AudioSyncStatus = (int)AudioSyncStatus.Deleted;
recitation.AudioSyncStatus = AudioSyncStatus.Deleted;
_context.Recitations.Update(recitation);
await _context.SaveChangesAsync();
@ -311,7 +311,7 @@ namespace RMuseum.Services.Implementation
if(narration.ReviewStatus == AudioReviewStatus.Approved)
{
narration.AudioSyncStatus = (int)AudioSyncStatus.MetadataChanged;
narration.AudioSyncStatus = AudioSyncStatus.MetadataChanged;
_context.Recitations.Update(narration);
await _context.SaveChangesAsync();
@ -366,7 +366,7 @@ namespace RMuseum.Services.Implementation
}
narration.AudioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected;
narration.AudioSyncStatus = AudioSyncStatus.SynchronizedOrRejected;
context.Recitations.Update(narration);
await context.SaveChangesAsync();
@ -413,9 +413,6 @@ namespace RMuseum.Services.Implementation
{
await src.FillAsync(srcData);
int audioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected;
foreach (DataRow row in srcData.Rows)
{
@ -435,7 +432,7 @@ namespace RMuseum.Services.Implementation
Mp3SizeInBytes = (int)row["audio_mp3bsize"],
OggSizeInBytes = (int)row["audio_oggbsize"],
UploadDate = (DateTime)row["audio_date"],
AudioSyncStatus = audioSyncStatus,
AudioSyncStatus = AudioSyncStatus.SynchronizedOrRejected,
ReviewStatus = AudioReviewStatus.Approved
};
newRecord.FileLastUpdated = newRecord.UploadDate;
@ -770,7 +767,7 @@ namespace RMuseum.Services.Implementation
existing.Mp3FileCheckSum = audio.FileCheckSum;
existing.Mp3SizeInBytes = mp3fileSize;
existing.FileLastUpdated = session.UploadEndTime;
existing.AudioSyncStatus = (int)AudioSyncStatus.SoundFilesChanged;
existing.AudioSyncStatus = AudioSyncStatus.SoundOrXMLFilesChanged;
context.Recitations.Update(existing);
@ -834,7 +831,7 @@ namespace RMuseum.Services.Implementation
FileLastUpdated = session.UploadEndTime,
LocalMp3FilePath = localMp3FilePath,
LocalXmlFilePath = localXmlFilePath,
AudioSyncStatus = (int)AudioSyncStatus.NewItem,
AudioSyncStatus = AudioSyncStatus.NewItem,
ReviewStatus = AudioReviewStatus.Draft
};
@ -944,7 +941,7 @@ namespace RMuseum.Services.Implementation
}
if (narration.ReviewStatus == AudioReviewStatus.Rejected)
{
narration.AudioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected;
narration.AudioSyncStatus = AudioSyncStatus.SynchronizedOrRejected;
File.Delete(narration.LocalMp3FilePath);
File.Delete(narration.LocalXmlFilePath);
}
@ -1013,7 +1010,7 @@ namespace RMuseum.Services.Implementation
private async Task _PublishNarration(Recitation narration, RecitationPublishingTracker tracker, RMuseumDbContext context)
{
bool replace = narration.AudioSyncStatus == (int)AudioSyncStatus.SoundFilesChanged;
bool replace = narration.AudioSyncStatus == AudioSyncStatus.SoundOrXMLFilesChanged;
using var client = new SftpClient
@ -1086,7 +1083,7 @@ namespace RMuseum.Services.Implementation
narration.AudioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected;
narration.AudioSyncStatus = AudioSyncStatus.SynchronizedOrRejected;
context.Recitations.Update(narration);
await context.SaveChangesAsync();
@ -1193,13 +1190,13 @@ namespace RMuseum.Services.Implementation
{
using (RMuseumDbContext context = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC
{
var list = await context.Recitations.Where(a => a.ReviewStatus == AudioReviewStatus.Approved && a.AudioSyncStatus != (int)AudioSyncStatus.SynchronizedOrRejected).ToListAsync();
var list = await context.Recitations.Where(a => a.ReviewStatus == AudioReviewStatus.Approved && a.AudioSyncStatus != AudioSyncStatus.SynchronizedOrRejected).ToListAsync();
foreach (Recitation narration in list)
{
switch(narration.AudioSyncStatus)
{
case (int)AudioSyncStatus.NewItem:
case (int)AudioSyncStatus.SoundFilesChanged:
case AudioSyncStatus.NewItem:
case AudioSyncStatus.SoundOrXMLFilesChanged:
{
RecitationPublishingTracker tracker = new RecitationPublishingTracker()
{
@ -1215,10 +1212,10 @@ namespace RMuseum.Services.Implementation
await _PublishNarration(narration, tracker, context);
}
break;
case (int)AudioSyncStatus.MetadataChanged:
case AudioSyncStatus.MetadataChanged:
await _UpdateRemoteRecitations(narration, context);
break;
case (int)AudioSyncStatus.Deleted:
case AudioSyncStatus.Deleted:
await _DeleteNarrationFromRemote(narration, context);
break;
}
@ -1639,7 +1636,7 @@ namespace RMuseum.Services.Implementation
foreach(Recitation other in otherRecitaions)
{
other.AudioOrder = other.AudioOrder + 1;
other.AudioSyncStatus = (int)AudioSyncStatus.MetadataChanged;
other.AudioSyncStatus = AudioSyncStatus.MetadataChanged;
_context.Recitations.Update(other);
await _context.SaveChangesAsync();
@ -1647,7 +1644,7 @@ namespace RMuseum.Services.Implementation
}
recitation.AudioOrder = 1;
recitation.AudioSyncStatus = (int)AudioSyncStatus.MetadataChanged;
recitation.AudioSyncStatus = AudioSyncStatus.MetadataChanged;
_context.Recitations.Update(recitation);
await _UpdateRemoteRecitations(recitation, _context);
@ -1662,6 +1659,36 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// Synchronization Queue
/// </summary>
/// <param name="filteredUserId"></param>
/// <returns></returns>
public async Task<RServiceResult<RecitationViewModel[]>> GetSynchronizationQueue(Guid filteredUserId)
{
try
{
var source =
from audio in _context.Recitations.Include(a => a.Owner)
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
where
(filteredUserId == Guid.Empty || audio.OwnerId == filteredUserId)
&&
audio.ReviewStatus == AudioReviewStatus.Approved
&&
audio.AudioSyncStatus != AudioSyncStatus.SynchronizedOrRejected
orderby audio.UploadDate descending
select new RecitationViewModel(audio, audio.Owner, poem);
return new RServiceResult<RecitationViewModel[]>(await source.ToArrayAsync());
}
catch (Exception exp)
{
return new RServiceResult<RecitationViewModel[]>(null, exp.ToString());
}
}
/// <summary>
/// Configuration
/// </summary>