#266 updating an API method to allow recitation owners have access to the list of their approved mistakes

This commit is contained in:
Hamid Reza Mohammadi 2021-12-24 09:31:08 +03:30
parent 5c86c608b2
commit 671f5cbf6f
5 changed files with 73 additions and 33 deletions

View File

@ -105,6 +105,7 @@ namespace RMuseum.Controllers
/// <param name="allUsers">default: false, user must have recitation::moderate permission to be able to see all users narrations</param>
/// <param name="status">default: -1, unfiltered</param>
/// <param name="searchTerm"></param>
/// <param name="mistakes"></param>
/// <remarks>additional headers: paging-headers, audio-upload-enabled</remarks>
/// <returns></returns>
[HttpGet]
@ -112,7 +113,7 @@ namespace RMuseum.Controllers
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<RecitationViewModel>))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
public async Task<IActionResult> Get([FromQuery] PagingParameterModel paging, bool allUsers = false, AudioReviewStatus status = AudioReviewStatus.All, string searchTerm = "")
public async Task<IActionResult> Get([FromQuery] PagingParameterModel paging, bool allUsers = false, AudioReviewStatus status = AudioReviewStatus.All, string searchTerm = "", bool mistakes = false)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
Guid sessionId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value);
@ -135,7 +136,7 @@ namespace RMuseum.Controllers
return StatusCode((int)HttpStatusCode.Forbidden);
}
var res = await _audioService.SecureGetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status, searchTerm);
var res = await _audioService.SecureGetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status, searchTerm, mistakes);
if(!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);

View File

@ -23,7 +23,8 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels
/// <param name="src"></param>
/// <param name="appUser"></param>
/// <param name="poem"></param>
public RecitationViewModel(Recitation src, RAppUser appUser, GanjoorPoem poem)
/// <param name="mistake"></param>
public RecitationViewModel(Recitation src, RAppUser appUser, GanjoorPoem poem, string mistake)
{
Id = src.Id;
Owner = new PublicRAppUser()
@ -67,7 +68,10 @@ namespace RMuseum.Models.GanjoorAudio.ViewModels
PoemFullUrl = poem.FullUrl;
}
AudioSyncStatus = src.AudioSyncStatus;
ReviewMsg = src.ReviewMsg;
if (string.IsNullOrEmpty(mistake))
ReviewMsg = src.ReviewMsg;
else
ReviewMsg = src.ReviewMsg;
}
/// <summary>

View File

@ -1640,7 +1640,7 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.RecitationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<member name="M:RMuseum.Controllers.RecitationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String,System.Boolean)">
<summary>
Gets audio narrations, user must have recitation::moderate permission to be able to see all users narrations
</summary>
@ -1648,6 +1648,7 @@
<param name="allUsers">default: false, user must have recitation::moderate permission to be able to see all users narrations</param>
<param name="status">default: -1, unfiltered</param>
<param name="searchTerm"></param>
<param name="mistakes"></param>
<remarks>additional headers: paging-headers, audio-upload-enabled</remarks>
<returns></returns>
</member>
@ -4284,13 +4285,14 @@
parameterless constructor for deserialization support
</summary>
</member>
<member name="M:RMuseum.Models.GanjoorAudio.ViewModels.RecitationViewModel.#ctor(RMuseum.Models.GanjoorAudio.Recitation,RSecurityBackend.Models.Auth.Db.RAppUser,RMuseum.Models.Ganjoor.GanjoorPoem)">
<member name="M:RMuseum.Models.GanjoorAudio.ViewModels.RecitationViewModel.#ctor(RMuseum.Models.GanjoorAudio.Recitation,RSecurityBackend.Models.Auth.Db.RAppUser,RMuseum.Models.Ganjoor.GanjoorPoem,System.String)">
<summary>
constructor
</summary>
<param name="src"></param>
<param name="appUser"></param>
<param name="poem"></param>
<param name="mistake"></param>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.RecitationViewModel.Id">
<summary>
@ -12469,7 +12471,7 @@
Audio Narration Service Implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<member name="M:RMuseum.Services.Implementationa.RecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String,System.Boolean)">
<summary>
returns list of narrations
</summary>
@ -12477,6 +12479,7 @@
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
<param name="status"></param>
<param name="searchTerm"></param>
<param name="mistakes"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetPublishedRecitations(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Int32,System.Int32)">
@ -12902,7 +12905,7 @@
Audio Narration Service
</summary>
</member>
<member name="M:RMuseum.Services.IRecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String)">
<member name="M:RMuseum.Services.IRecitationService.SecureGetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus,System.String,System.Boolean)">
<summary>
returns list of narrations
</summary>
@ -12910,6 +12913,7 @@
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
<param name="status"></param>
<param name="searchTerm"></param>
<param name="mistakes"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IRecitationService.GetPublishedRecitations(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Int32,System.Int32)">

View File

@ -21,8 +21,9 @@ namespace RMuseum.Services
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
/// <param name="status"></param>
/// <param name="searchTerm"></param>
/// <param name="mistakes"></param>
/// <returns></returns>
public Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm);
public Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm, bool mistakes);
/// <summary>
/// returns list of publish narrations (if poetId or catId is non-zero its ordered by poemId ascending if not it is ordered by publish date descending)

View File

@ -41,29 +41,59 @@ namespace RMuseum.Services.Implementationa
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
/// <param name="status"></param>
/// <param name="searchTerm"></param>
/// <param name="mistakes"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm)
public async Task<RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>> SecureGetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status, string searchTerm, bool mistakes)
{
//whenever I had not a reference to audio.Owner in the final selection it became null, so this strange arrangement is not all because of my stupidity!
var source =
from audio in _context.Recitations.AsNoTracking().Include(a => a.Owner)
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
where
(filteredUserId == Guid.Empty || audio.OwnerId == filteredUserId)
&&
(status == AudioReviewStatus.All || audio.ReviewStatus == status)
&&
(string.IsNullOrEmpty(searchTerm) ||
(!string.IsNullOrEmpty(searchTerm) && (audio.AudioArtist.Contains(searchTerm) || audio.AudioTitle.Contains(searchTerm) || poem.FullTitle.Contains(searchTerm)))
)
orderby audio.UploadDate descending
select new RecitationViewModel(audio, audio.Owner, poem);
if(!mistakes)
{
//whenever I had not a reference to audio.Owner in the final selection it became null, so this strange arrangement is not all because of my stupidity!
var source =
from audio in _context.Recitations.AsNoTracking().Include(a => a.Owner)
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
where
(filteredUserId == Guid.Empty || audio.OwnerId == filteredUserId)
&&
(status == AudioReviewStatus.All || audio.ReviewStatus == status)
&&
(string.IsNullOrEmpty(searchTerm) ||
(!string.IsNullOrEmpty(searchTerm) && (audio.AudioArtist.Contains(searchTerm) || audio.AudioTitle.Contains(searchTerm) || poem.FullTitle.Contains(searchTerm)))
)
orderby audio.UploadDate descending
select new RecitationViewModel(audio, audio.Owner, poem, "");
(PaginationMetadata PagingMeta, RecitationViewModel[] Items) paginatedResult =
await QueryablePaginator<RecitationViewModel>.Paginate(source, paging);
(PaginationMetadata PagingMeta, RecitationViewModel[] Items) paginatedResult =
await QueryablePaginator<RecitationViewModel>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>(paginatedResult);
return new RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>(paginatedResult);
}
else
{
//whenever I had not a reference to audio.Owner in the final selection it became null, so this strange arrangement is not all because of my stupidity!
var source =
from mistake in _context.RecitationApprovedMistakes.AsNoTracking()
join audio in _context.Recitations.Include(a => a.Owner)
on mistake.RecitationId equals audio.Id
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
where
(filteredUserId == Guid.Empty || audio.OwnerId == filteredUserId)
&&
(status == AudioReviewStatus.All || audio.ReviewStatus == status)
&&
(string.IsNullOrEmpty(searchTerm) ||
(!string.IsNullOrEmpty(searchTerm) && (audio.AudioArtist.Contains(searchTerm) || audio.AudioTitle.Contains(searchTerm) || poem.FullTitle.Contains(searchTerm)))
)
orderby audio.UploadDate descending
select new RecitationViewModel(audio, audio.Owner, poem, mistake.Mistake);
(PaginationMetadata PagingMeta, RecitationViewModel[] Items) paginatedResult =
await QueryablePaginator<RecitationViewModel>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, RecitationViewModel[] Items)>(paginatedResult);
}
}
/// <summary>
@ -294,7 +324,7 @@ namespace RMuseum.Services.Implementationa
.Where(a => a.Id == id)
join poem in _context.GanjoorPoems
on audio.GanjoorPostId equals poem.Id
select new RecitationViewModel(audio, audio.Owner, poem);
select new RecitationViewModel(audio, audio.Owner, poem, "");
narration = await source.SingleOrDefaultAsync();
_memoryCache.Set(cachKey, narration);
@ -521,7 +551,7 @@ namespace RMuseum.Services.Implementationa
await _ganjoorService.CacheCleanForPageById(narration.GanjoorPostId);
}
return new RServiceResult<RecitationViewModel>(new RecitationViewModel(narration, narration.Owner, await _context.GanjoorPoems.Where(p => p.Id == narration.GanjoorPostId).SingleOrDefaultAsync()));
return new RServiceResult<RecitationViewModel>(new RecitationViewModel(narration, narration.Owner, await _context.GanjoorPoems.Where(p => p.Id == narration.GanjoorPostId).SingleOrDefaultAsync(), ""));
}
@ -1112,7 +1142,7 @@ namespace RMuseum.Services.Implementationa
await _ganjoorService.CacheCleanForPageById(narration.GanjoorPostId);
}
return new RServiceResult<RecitationViewModel>(new RecitationViewModel(narration, narration.Owner, await _context.GanjoorPoems.Where(p => p.Id == narration.GanjoorPostId).SingleOrDefaultAsync()));
return new RServiceResult<RecitationViewModel>(new RecitationViewModel(narration, narration.Owner, await _context.GanjoorPoems.Where(p => p.Id == narration.GanjoorPostId).SingleOrDefaultAsync(), ""));
}
@ -1728,7 +1758,7 @@ namespace RMuseum.Services.Implementationa
&&
audio.AudioSyncStatus != AudioSyncStatus.SynchronizedOrRejected
orderby audio.UploadDate descending
select new RecitationViewModel(audio, audio.Owner, poem);
select new RecitationViewModel(audio, audio.Owner, poem, "");
return new RServiceResult<RecitationViewModel[]>(await source.ToArrayAsync());
}
@ -1791,7 +1821,7 @@ namespace RMuseum.Services.Implementationa
Id = report.Id,
ReasonText = report.ReasonText,
RecitationId = report.RecitationId,
Recitation = new RecitationViewModel(report.Recitation, report.Recitation.Owner, poem),
Recitation = new RecitationViewModel(report.Recitation, report.Recitation.Owner, poem, ""),
DateTime = report.DateTime,
NumberOfLinesAffected = report.NumberOfLinesAffected,
CoupletIndex = report.CoupletIndex