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 ///