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