diff --git a/RMuseum/Controllers/AudioNarrationController.cs b/RMuseum/Controllers/AudioNarrationController.cs index 970c753a..21c1bcd1 100644 --- a/RMuseum/Controllers/AudioNarrationController.cs +++ b/RMuseum/Controllers/AudioNarrationController.cs @@ -69,10 +69,14 @@ namespace RMuseum.Controllers } /// - /// updates narration metadata, user must have narration::moderate permission to change narration status from pending to approved or rejected or modify other users narrations metadata + /// updates narration metadata /// /// /// + /// + /// reviewstatus cannot be set to Approved or Rejected using this method, use moderate method instead + /// TODO: for approved narrations provide another API or solution + /// /// [HttpPut("{id}")] @@ -86,25 +90,21 @@ namespace RMuseum.Controllers var narration = await _audioService.Get(id); if (!string.IsNullOrEmpty(narration.ExceptionString)) - return BadRequest(narration.ExceptionString); - - if(narration.Result.Owner.Id != id || metadata.ReviewStatus == AudioReviewStatus.Approved || metadata.ReviewStatus == AudioReviewStatus.Rejected) { - Guid sessionId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value); - RServiceResult - canModerate = - await _userPermissionChecker.Check - ( - loggedOnUserId, - sessionId, - RMuseumSecurableItem.AudioNarrationEntityShortName, - RMuseumSecurableItem.ModerateOperationShortName - ); - if (!string.IsNullOrEmpty(canModerate.ExceptionString)) - return BadRequest(canModerate.ExceptionString); + return BadRequest(narration.ExceptionString); + } - if (!canModerate.Result) - return StatusCode((int)HttpStatusCode.Forbidden); + if (!string.IsNullOrEmpty(narration.ExceptionString)) + { + return BadRequest(narration.ExceptionString); + } + + if (narration.Result == null) + return NotFound(); + + if (metadata.ReviewStatus == AudioReviewStatus.Approved || metadata.ReviewStatus == AudioReviewStatus.Rejected) + { + return StatusCode((int)HttpStatusCode.Forbidden); } var res = await _audioService.UpdatePoemNarration(id, metadata); @@ -114,6 +114,37 @@ namespace RMuseum.Controllers return Ok(res.Result); } + /// + /// Moderate pending narration + /// + /// + /// + /// + [HttpPut("moderate/{id}")] + [Authorize(Policy = RMuseumSecurableItem.AudioNarrationEntityShortName + ":" + RMuseumSecurableItem.ModerateOperationShortName)] + [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(PoemNarrationUpdateViewModel))] + [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] + [ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))] + public async Task ModeratePoemNarration(Guid id, [FromBody] PoemNarrationModerateViewModel model) + { + Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); + + var narration = await _audioService.Get(id); + if (!string.IsNullOrEmpty(narration.ExceptionString)) + { + return BadRequest(narration.ExceptionString); + } + + if (narration.Result == null) + return NotFound(); + + var res = await _audioService.ModeratePoemNarration(id, loggedOnUserId, model); + if (!string.IsNullOrEmpty(res.ExceptionString)) + return BadRequest(res.ExceptionString); + + return Ok(res.Result); + } + /// diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationModerateViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationModerateViewModel.cs new file mode 100644 index 00000000..067e972b --- /dev/null +++ b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationModerateViewModel.cs @@ -0,0 +1,18 @@ +namespace RMuseum.Models.GanjoorAudio.ViewModels +{ + /// + /// Poem Narration Moderation View Model + /// + public class PoemNarrationModerateViewModel + { + /// + /// Approve or Reject + /// + public bool Approve { get; set; } + + /// + /// Rejection Message + /// + public string Message { get; set; } + } +} diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index 92c4dd8e..0952f7ab 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -631,10 +631,22 @@ - updates narration metadata, user must have narration::moderate permission to change narration status from pending to approved or rejected or modify other users narrations metadata + updates narration metadata + + reviewstatus cannot be set to Approved or Rejected using this method, use moderate method instead + TODO: for approved narrations provide another API or solution + + + + + + Moderate pending narration + + + @@ -1898,6 +1910,21 @@ is default + + + Poem Narration Moderation View Model + + + + + Approve or Reject + + + + + Rejection Message + + Poem Narration View Model for updates @@ -3653,6 +3680,15 @@ + + + Moderate pending narration + + + + + + Get Upload Session (including files) @@ -4462,6 +4498,15 @@ + + + Moderate pending narration + + + + + + Get Upload Session (including files) diff --git a/RMuseum/Services/IAudioNarrationService.cs b/RMuseum/Services/IAudioNarrationService.cs index 0437eccd..429a428b 100644 --- a/RMuseum/Services/IAudioNarrationService.cs +++ b/RMuseum/Services/IAudioNarrationService.cs @@ -66,6 +66,15 @@ namespace RMuseum.Services /// Task> FinalizeNewUploadSession(UploadSession session, UploadSessionFile[] files); + /// + /// Moderate pending narration + /// + /// + /// + /// + /// + Task> ModeratePoemNarration(Guid id, Guid moderatorId, PoemNarrationModerateViewModel model); + /// /// Get Upload Session (including files) /// diff --git a/RMuseum/Services/Implementation/AudioNarrationService.cs b/RMuseum/Services/Implementation/AudioNarrationService.cs index f9c2ab9a..e0f98b19 100644 --- a/RMuseum/Services/Implementation/AudioNarrationService.cs +++ b/RMuseum/Services/Implementation/AudioNarrationService.cs @@ -74,7 +74,12 @@ namespace RMuseum.Services.Implementation { try { - return new RServiceResult(new PoemNarrationViewModel(await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync())); + var narration = await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync(); + if(narration == null) + { + return new RServiceResult(null); + } + return new RServiceResult(new PoemNarrationViewModel(narration)); } catch (Exception exp) { @@ -111,6 +116,7 @@ namespace RMuseum.Services.Implementation } } + /// /// imports data from ganjoor MySql database /// @@ -494,9 +500,40 @@ namespace RMuseum.Services.Implementation } } - + /// + /// Moderate pending narration + /// + /// + /// + /// + /// + public async Task> ModeratePoemNarration(Guid id, Guid moderatorId, PoemNarrationModerateViewModel model) + { + try + { + PoemNarration narration = await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync(); + if (narration == null) + return new RServiceResult(false, "404"); + if (narration.ReviewStatus != AudioReviewStatus.Pending) + return new RServiceResult(false, "خوانش می‌بایست در وضعیت در انتظار بازبینی باشد."); + narration.ReviewDate = DateTime.Now; + narration.ReviewerId = moderatorId; + narration.ReviewStatus = model.Approve ? AudioReviewStatus.Approved : AudioReviewStatus.Rejected; + narration.ReviewMsg = model.Message; + _context.AudioFiles.Update(narration); + await _context.SaveChangesAsync(); - + //TODO: 1 . notify user on moderation result + //TODO: 2 . start a background job for finalizing approved narrations + //TODO: 3 . notify user on publication of approved narration + + return new RServiceResult(true); + } + catch (Exception exp) + { + return new RServiceResult(false, exp.ToString()); + } + } ///