From f6696f129f72e3e3fd6af8d0823e105c96426a4e Mon Sep 17 00:00:00 2001 From: Hamid Reza Mohammadi Date: Thu, 26 Nov 2020 11:41:06 +0330 Subject: [PATCH] #44 syncque api --- RMuseum/Controllers/RecitationController.cs | 19 ++++++ .../Models/GanjoorAudio/AudioSyncStatus.cs | 2 +- RMuseum/Models/GanjoorAudio/Recitation.cs | 4 +- .../ViewModels/RecitationViewModel.cs | 23 +------ RMuseum/RMuseum.xml | 26 +++++++- RMuseum/Services/IRecitationService.cs | 7 ++ .../Implementation/RecitationService.cs | 65 +++++++++++++------ 7 files changed, 100 insertions(+), 46 deletions(-) diff --git a/RMuseum/Controllers/RecitationController.cs b/RMuseum/Controllers/RecitationController.cs index a6f5505f..c77ccabe 100644 --- a/RMuseum/Controllers/RecitationController.cs +++ b/RMuseum/Controllers/RecitationController.cs @@ -600,6 +600,25 @@ namespace RMuseum.Controllers } + /// + /// Synchronization Queue + /// + /// + [HttpGet("syncqueue")] + [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 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); + } + /// /// constructor /// diff --git a/RMuseum/Models/GanjoorAudio/AudioSyncStatus.cs b/RMuseum/Models/GanjoorAudio/AudioSyncStatus.cs index 237c9696..da478c6b 100644 --- a/RMuseum/Models/GanjoorAudio/AudioSyncStatus.cs +++ b/RMuseum/Models/GanjoorAudio/AudioSyncStatus.cs @@ -23,7 +23,7 @@ /// /// sound files should be reuploaded (this means xml file is also needs to reuploaded) /// - SoundFilesChanged = 4, + SoundOrXMLFilesChanged = 4, /// /// Xml file should be reuploaded diff --git a/RMuseum/Models/GanjoorAudio/Recitation.cs b/RMuseum/Models/GanjoorAudio/Recitation.cs index 58f13336..6c6550a3 100644 --- a/RMuseum/Models/GanjoorAudio/Recitation.cs +++ b/RMuseum/Models/GanjoorAudio/Recitation.cs @@ -169,9 +169,9 @@ namespace RMuseum.Models.GanjoorAudio public string LocalXmlFilePath { get; set; } /// - /// Value is one or a combination of + /// AudioSyncStatus /// - public int AudioSyncStatus { get; set; } + public AudioSyncStatus AudioSyncStatus { get; set; } /// /// Review Status diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/RecitationViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/RecitationViewModel.cs index 9c6be398..b80fbf1c 100644 --- a/RMuseum/Models/GanjoorAudio/ViewModels/RecitationViewModel.cs +++ b/RMuseum/Models/GanjoorAudio/ViewModels/RecitationViewModel.cs @@ -53,26 +53,7 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels PoemFullTitle = poem.FullTitle; PoemFullUrl = poem.FullUrl; } - - List lst = new List(); - 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 /// /// Value is one or a combination of /// - public AudioSyncStatus[] AudioSyncStatusArray { get; set; } + public AudioSyncStatus AudioSyncStatus { get; set; } /// /// Review Status diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index e0b463ed..fdfa4361 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -849,6 +849,12 @@ + + + Synchronization Queue + + + constructor @@ -1801,7 +1807,7 @@ meta data should be updated - + sound files should be reuploaded (this means xml file is also needs to reuploaded) @@ -1976,7 +1982,7 @@ - Value is one or a combination of + AudioSyncStatus @@ -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) - + Value is one or a combination of @@ -5173,6 +5179,13 @@ + + + Synchronization Queue + + + + Configuration @@ -5519,6 +5532,13 @@ + + + Synchronization Queue + + + + Internal messaging system interface diff --git a/RMuseum/Services/IRecitationService.cs b/RMuseum/Services/IRecitationService.cs index e013f00a..04bbd13e 100644 --- a/RMuseum/Services/IRecitationService.cs +++ b/RMuseum/Services/IRecitationService.cs @@ -181,5 +181,12 @@ namespace RMuseum.Services /// /// Task> MakeArtistRecitationsFirst(string artistName); + + /// + /// Synchronization Queue + /// + /// + /// + Task> GetSynchronizationQueue(Guid filteredUserId); } } diff --git a/RMuseum/Services/Implementation/RecitationService.cs b/RMuseum/Services/Implementation/RecitationService.cs index b9622fe4..ca8b3118 100644 --- a/RMuseum/Services/Implementation/RecitationService.cs +++ b/RMuseum/Services/Implementation/RecitationService.cs @@ -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 } } + /// + /// Synchronization Queue + /// + /// + /// + public async Task> 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(await source.ToArrayAsync()); + } + catch (Exception exp) + { + return new RServiceResult(null, exp.ToString()); + } + } + /// /// Configuration ///