diff --git a/RMuseum/Controllers/AudioNarrationController.cs b/RMuseum/Controllers/AudioNarrationController.cs
index 08fa3098..970c753a 100644
--- a/RMuseum/Controllers/AudioNarrationController.cs
+++ b/RMuseum/Controllers/AudioNarrationController.cs
@@ -68,6 +68,54 @@ namespace RMuseum.Controllers
return Ok(res.Result.Items);
}
+ ///
+ /// 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
+ ///
+ ///
+ ///
+ ///
+
+ [HttpPut("{id}")]
+ [Authorize]
+ [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(PoemNarrationUpdateViewModel))]
+ [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
+ [ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
+ public async Task UpdatePoemNarration(Guid id, [FromBody] PoemNarrationUpdateViewModel metadata)
+ {
+ 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.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);
+
+ if (!canModerate.Result)
+ return StatusCode((int)HttpStatusCode.Forbidden);
+ }
+
+ var res = await _audioService.UpdatePoemNarration(id, metadata);
+ if (!string.IsNullOrEmpty(res.ExceptionString))
+ return BadRequest(res.ExceptionString);
+
+ return Ok(res.Result);
+ }
+
+
+
///
/// Get User Uploads
///
diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationUpdateViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationUpdateViewModel.cs
new file mode 100644
index 00000000..989f97c4
--- /dev/null
+++ b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationUpdateViewModel.cs
@@ -0,0 +1,41 @@
+namespace RMuseum.Models.GanjoorAudio.ViewModels
+{
+ ///
+ /// Poem Narration View Model for updates
+ ///
+ public class PoemNarrationUpdateViewModel
+ {
+ ///
+ /// Audio Title
+ ///
+ public string AudioTitle { get; set; }
+
+ ///
+ /// Audio Artist
+ ///
+ public string AudioArtist { get; set; }
+
+ ///
+ /// Audio Artist Url
+ ///
+ public string AudioArtistUrl { get; set; }
+
+ ///
+ /// Audio Source
+ ///
+ public string AudioSrc { get; set; }
+
+ ///
+ /// Audio Src Url
+ ///
+ public string AudioSrcUrl { get; set; }
+
+ ///
+ /// Review Status
+ ///
+ ///
+ /// changing from Draft => Pending or Pending => Draft is possible for owner, other changes need narration::moderate permission
+ ///
+ public AudioReviewStatus ReviewStatus { get; set; }
+ }
+}
diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index 9b1ddf44..8fea4109 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -629,6 +629,14 @@
default: -1, unfiltered
+
+
+ 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
+
+
+
+
+
Get User Uploads
@@ -1875,6 +1883,44 @@
is default
+
+
+ Poem Narration View Model for updates
+
+
+
+
+ Audio Title
+
+
+
+
+ Audio Artist
+
+
+
+
+ Audio Artist Url
+
+
+
+
+ Audio Source
+
+
+
+
+ Audio Src Url
+
+
+
+
+ Review Status
+
+
+ changing from Draft => Pending or Pending => Draft is possible for owner, other changes need narration::moderate permission
+
+
Poem Narration view model
@@ -3548,6 +3594,21 @@
+
+
+ return selected narration information
+
+
+
+
+
+
+ updates metadata for narration
+
+
+
+
+
imports data from ganjoor MySql database
@@ -4343,6 +4404,21 @@
+
+
+ return selected narration information
+
+
+
+
+
+
+ updates metadata for narration
+
+
+
+
+
imports data from ganjoor MySql database
diff --git a/RMuseum/Services/IAudioNarrationService.cs b/RMuseum/Services/IAudioNarrationService.cs
index 863da863..0437eccd 100644
--- a/RMuseum/Services/IAudioNarrationService.cs
+++ b/RMuseum/Services/IAudioNarrationService.cs
@@ -22,6 +22,21 @@ namespace RMuseum.Services
///
public Task> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status);
+ ///
+ /// return selected narration information
+ ///
+ ///
+ ///
+ Task> Get(Guid id);
+
+ ///
+ /// updates metadata for narration
+ ///
+ ///
+ ///
+ ///
+ Task> UpdatePoemNarration(Guid id, PoemNarrationUpdateViewModel metadata);
+
///
/// imports data from ganjoor MySql database
///
diff --git a/RMuseum/Services/Implementation/AudioNarrationService.cs b/RMuseum/Services/Implementation/AudioNarrationService.cs
index 9aca5b85..f9c2ab9a 100644
--- a/RMuseum/Services/Implementation/AudioNarrationService.cs
+++ b/RMuseum/Services/Implementation/AudioNarrationService.cs
@@ -65,6 +65,52 @@ namespace RMuseum.Services.Implementation
}
}
+ ///
+ /// return selected narration information
+ ///
+ ///
+ ///
+ public async Task> Get(Guid id)
+ {
+ try
+ {
+ return new RServiceResult(new PoemNarrationViewModel(await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync()));
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// updates metadata for narration
+ ///
+ ///
+ ///
+ ///
+ public async Task> UpdatePoemNarration(Guid id, PoemNarrationUpdateViewModel metadata)
+ {
+ try
+ {
+ PoemNarration narration = await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync();
+ if(narration == null)
+ return new RServiceResult(false, "404");
+ narration.AudioTitle = metadata.AudioTitle;
+ narration.AudioArtist = metadata.AudioArtist;
+ narration.AudioArtistUrl = metadata.AudioArtistUrl;
+ narration.AudioSrc = metadata.AudioSrc;
+ narration.AudioSrcUrl = metadata.AudioSrcUrl;
+ narration.ReviewStatus = metadata.ReviewStatus;
+ _context.AudioFiles.Update(narration);
+ await _context.SaveChangesAsync();
+ return new RServiceResult(true);
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(false, exp.ToString());
+ }
+ }
+
///
/// imports data from ganjoor MySql database
///