#404 review suggested ganjoor links

This commit is contained in:
Hamid Reza Mohammadi 2023-08-01 11:17:20 +03:30
parent 98c21ffcc6
commit 7b930d5193
8 changed files with 322 additions and 8 deletions

View File

@ -17,6 +17,7 @@ using Newtonsoft.Json;
using RMuseum.Models.Artifact;
using RMuseum.Services.Implementation;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.GanjoorIntegration;
namespace RMuseum.Controllers
{
@ -1216,6 +1217,63 @@ namespace RMuseum.Controllers
return Ok();
}
/// <summary>
/// finds next awaiting suggested link
/// return value might be null (has paging-headers)
/// </summary>
/// <remarks>has paging-headers</remarks>
/// <param name="skip"></param>
/// <returns> return value might be null </returns>
[HttpGet]
[Route("ganjoor/nextunreviewed")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorLinkViewModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetNextUnreviewedGanjoorLinkAsync(int skip)
{
RServiceResult<GanjoorLinkViewModel> res = await _pdfService.GetNextUnreviewedGanjoorLinkAsync(skip);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
var resCount = await _pdfService.GetUnreviewedGanjoorLinksCountAsync();
if (!string.IsNullOrEmpty(resCount.ExceptionString))
return BadRequest(resCount.ExceptionString);
// Paging Header
HttpContext.Response.Headers.Add("paging-headers",
JsonConvert.SerializeObject(
new PaginationMetadata()
{
totalCount = resCount.Result,
pageSize = -1,
currentPage = -1,
hasNextPage = false,
hasPreviousPage = false,
totalPages = -1
})
);
return Ok(res.Result);
}
/// <summary>
/// review suggested ganjoor link
/// </summary>
/// <param name="linkId"></param>
/// <param name="result"></param>
/// <returns></returns>
[HttpPut]
[Route("ganjoor/review/{linkId}/{result}")]
[Authorize(Policy = RMuseumSecurableItem.PDFLibraryEntityShortName + ":" + RMuseumSecurableItem.ReviewGanjoorLinksOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> ReviewSuggestedLinkAsync(Guid linkId, ReviewResult result)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<bool> suggestion = await _pdfService.ReviewSuggestedLinkAsync(linkId, loggedOnUserId, result);
if (!string.IsNullOrEmpty(suggestion.ExceptionString))
return BadRequest(suggestion.ExceptionString);
return Ok();
}
/// <summary>
/// PDF Service
/// </summary>

View File

@ -218,6 +218,7 @@ namespace RMuseum.Models.Auth.Memory
new SecurableItemOperation(EditTagValueOperationShortName, "اصلاح مقدار ویژگی", false),
new SecurableItemOperation(ToAwaitingStatusOperationShortName, "درخواست بازبینی", false),
new SecurableItemOperation(PublishOperationShortName, "انتشار", false),
new SecurableItemOperation(ReviewGanjoorLinksOperationShortName, "بررسی شعرهای پیشنهادی گنجور", false),
}
},
new SecurableItem()

View File

@ -20,6 +20,10 @@
/// <summary>
/// Instagram
/// </summary>
Instagram = 3
Instagram = 3,
/// <summary>
/// Naskban
/// </summary>
Naskban = 4,
}
}

View File

@ -8,6 +8,10 @@ namespace RMuseum.Models.GanjoorIntegration
/// </summary>
public class PDFGanjoorLink
{
/// <summary>
/// Id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// Ganjoor Post Id
/// </summary>

View File

@ -114,5 +114,20 @@ namespace RMuseum.Models.GanjoorIntegration
/// Synchronized with ganjoor
/// </summary>
public bool Synchronized { get; set; }
/// <summary>
/// is the is the text original source?
/// </summary>
public bool IsTextOriginalSource { get; set; }
/// <summary>
/// pdf book id
/// </summary>
public int PDFBookId { get; set; }
/// <summary>
/// page number
/// </summary>
public int PageNumber { get; set; }
}
}

View File

@ -2711,6 +2711,23 @@
<param name="link"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.PDFLibraryController.GetNextUnreviewedGanjoorLinkAsync(System.Int32)">
<summary>
finds next awaiting suggested link
return value might be null (has paging-headers)
</summary>
<remarks>has paging-headers</remarks>
<param name="skip"></param>
<returns> return value might be null </returns>
</member>
<member name="M:RMuseum.Controllers.PDFLibraryController.ReviewSuggestedLinkAsync(System.Guid,RMuseum.Models.GanjoorIntegration.ReviewResult)">
<summary>
review suggested ganjoor link
</summary>
<param name="linkId"></param>
<param name="result"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.PDFLibraryController._pdfService">
<summary>
PDF Service
@ -6357,11 +6374,21 @@
Instagram
</summary>
</member>
<member name="F:RMuseum.Models.GanjoorIntegration.LinkType.Naskban">
<summary>
Naskban
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink">
<summary>
PDFBook Ganjoor Link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.Id">
<summary>
Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.GanjoorPostId">
<summary>
Ganjoor Post Id
@ -6552,6 +6579,21 @@
Synchronized with ganjoor
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PinterestLink.IsTextOriginalSource">
<summary>
is the is the text original source?
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PinterestLink.PDFBookId">
<summary>
pdf book id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PinterestLink.PageNumber">
<summary>
page number
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorIntegration.ReviewResult">
<summary>
Review Result
@ -18461,6 +18503,28 @@
<param name="link"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.GetNextUnreviewedGanjoorLinkAsync(System.Int32)">
<summary>
finds what the method name suggests
</summary>
<param name="skip"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.GetUnreviewedGanjoorLinksCountAsync">
<summary>
get unreviewed image count
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.ReviewSuggestedLinkAsync(System.Guid,System.Guid,RMuseum.Models.GanjoorIntegration.ReviewResult)">
<summary>
Review Suggested Link
</summary>
<param name="linkId"></param>
<param name="userId"></param>
<param name="result"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.PDFLibraryService._context">
<summary>
Database Context
@ -19654,6 +19718,28 @@
<param name="link"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IPDFLibraryService.GetNextUnreviewedGanjoorLinkAsync(System.Int32)">
<summary>
finds what the method name suggests
</summary>
<param name="skip"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IPDFLibraryService.GetUnreviewedGanjoorLinksCountAsync">
<summary>
get unreviewed image count
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IPDFLibraryService.ReviewSuggestedLinkAsync(System.Guid,System.Guid,RMuseum.Models.GanjoorIntegration.ReviewResult)">
<summary>
Review Suggested Link
</summary>
<param name="linkId"></param>
<param name="userId"></param>
<param name="result"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.IPictureFileService">
<summary>
manipulating picture files

View File

@ -1,4 +1,6 @@
using RMuseum.Models.Artifact;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.PDFLibrary;
using RMuseum.Models.PDFLibrary.ViewModels;
using RSecurityBackend.Models.Generic;
@ -346,5 +348,27 @@ namespace RMuseum.Services
/// <param name="link"></param>
/// <returns></returns>
Task<RServiceResult<bool>> SuggestGanjoorLinkAsync(Guid userId, PDFGanjoorLinkSuggestion link);
/// <summary>
/// finds what the method name suggests
/// </summary>
/// <param name="skip"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorLinkViewModel>> GetNextUnreviewedGanjoorLinkAsync(int skip);
/// <summary>
/// get unreviewed image count
/// </summary>
/// <returns></returns>
Task<RServiceResult<int>> GetUnreviewedGanjoorLinksCountAsync();
/// <summary>
/// Review Suggested Link
/// </summary>
/// <param name="linkId"></param>
/// <param name="userId"></param>
/// <param name="result"></param>
/// <returns></returns>
Task<RServiceResult<bool>> ReviewSuggestedLinkAsync(Guid linkId, Guid userId, ReviewResult result);
}
}

View File

@ -33,12 +33,12 @@ namespace RMuseum.Services.Implementation
/// <returns></returns>
public async Task<RServiceResult<bool>> StartImportingKnownSourceAsync(string srcUrl)
{
if(srcUrl.Contains("https://sohalibrary.com/"))
if (srcUrl.Contains("https://sohalibrary.com/"))
{
return await StartImportingSohaLibraryUrlAsync(srcUrl);
}
return new RServiceResult<bool>(false, "Unknown source url");
}
/// <summary>
/// get pdf book by id
@ -62,14 +62,14 @@ namespace RMuseum.Services.Implementation
.SingleOrDefaultAsync();
if (pdfBook != null)
{
if(pdfBook.Book != null)
if (pdfBook.Book != null)
{
pdfBook.Book.PDFBooks = await _context.PDFBooks.AsNoTracking()
.Include(a => a.CoverImage)
.Where(a => a.Status == PublishStatus.Published && a.BookId == id)
.OrderByDescending(t => t.Title).ToArrayAsync();
}
if(pdfBook.MultiVolumePDFCollection != null)
if (pdfBook.MultiVolumePDFCollection != null)
{
pdfBook.MultiVolumePDFCollection.PDFBooks = await _context.PDFBooks.AsNoTracking()
.Include(a => a.CoverImage)
@ -926,7 +926,7 @@ namespace RMuseum.Services.Implementation
.Include(b => b.Authors).ThenInclude(a => a.Author)
.Include(b => b.Tags)
.Where(b => b.Id == id).SingleOrDefaultAsync();
if(book != null)
if (book != null)
{
book.PDFBooks = await _context.PDFBooks.AsNoTracking()
.Include(a => a.CoverImage)
@ -1120,7 +1120,7 @@ namespace RMuseum.Services.Implementation
try
{
var volumes = await _context.MultiVolumePDFCollections.Include(v => v.Book).AsNoTracking().Where(x => x.Id == id).SingleOrDefaultAsync();
if(volumes != null)
if (volumes != null)
{
volumes.PDFBooks = await _context.PDFBooks.AsNoTracking()
.Include(a => a.CoverImage)
@ -1396,6 +1396,128 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// finds what the method name suggests
/// </summary>
/// <param name="skip"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorLinkViewModel>> GetNextUnreviewedGanjoorLinkAsync(int skip)
{
try
{
var link = await _context.PDFGanjoorLinks.AsNoTracking()
.Include(l => l.SuggestedBy)
.Where(l => l.ReviewResult == ReviewResult.Awaiting)
.OrderBy(l => l.SuggestionDate)
.Skip(skip)
.FirstOrDefaultAsync();
if (link != null)
{
return new RServiceResult<GanjoorLinkViewModel>(
new GanjoorLinkViewModel()
{
Id = link.Id,
GanjoorPostId = link.GanjoorPostId,
GanjoorUrl = link.GanjoorUrl,
GanjoorTitle = link.GanjoorTitle,
EntityName = link.PDFPageTitle,
EntityFriendlyUrl = $"https://naskban.ir/{link.PDFBookId}/{link.PageNumber}",
ReviewResult = link.ReviewResult,
Synchronized = link.Synchronized,
SuggestedBy = new PublicRAppUser()
{
Id = link.SuggestedBy.Id,
Username = link.SuggestedBy.UserName,
Email = link.SuggestedBy.Email,
FirstName = link.SuggestedBy.FirstName,
SureName = link.SuggestedBy.SureName,
PhoneNumber = link.SuggestedBy.PhoneNumber,
RImageId = link.SuggestedBy.RImageId,
Status = link.SuggestedBy.Status,
NickName = link.SuggestedBy.NickName,
Website = link.SuggestedBy.Website,
Bio = link.SuggestedBy.Bio,
EmailConfirmed = link.SuggestedBy.EmailConfirmed
},
IsTextOriginalSource = link.IsTextOriginalSource
});
}
return new RServiceResult<GanjoorLinkViewModel>(null);
}
catch (Exception exp)
{
return new RServiceResult<GanjoorLinkViewModel>(null, exp.ToString());
}
}
/// <summary>
/// get unreviewed image count
/// </summary>
/// <returns></returns>
public async Task<RServiceResult<int>> GetUnreviewedGanjoorLinksCountAsync()
{
return new RServiceResult<int>
(
await _context.PDFGanjoorLinks.AsNoTracking()
.Where(l => l.ReviewResult == ReviewResult.Awaiting)
.CountAsync()
);
}
/// <summary>
/// Review Suggested Link
/// </summary>
/// <param name="linkId"></param>
/// <param name="userId"></param>
/// <param name="result"></param>
/// <returns></returns>
public async Task<RServiceResult<bool>> ReviewSuggestedLinkAsync(Guid linkId, Guid userId, ReviewResult result)
{
PDFGanjoorLink link =
await _context.PDFGanjoorLinks
.Where(l => l.Id == linkId)
.SingleOrDefaultAsync();
link.ReviewResult = result;
link.ReviewerId = userId;
link.ReviewDate = DateTime.Now;
_context.PDFGanjoorLinks.Update(link);
if (link.ReviewResult == ReviewResult.Approved)
{
var pageInfo = await _context.PDFPages
.Include(i => i.Tags)
.ThenInclude(t => t.RTag)
.Where(i => i.PDFBookId == link.PDFBookId && i.PageNumber == link.PageNumber).SingleAsync();
RTagValue tag = await TagHandler.PrepareAttribute(_context, "Ganjoor Link", link.GanjoorTitle, 1);
tag.ValueSupplement = link.GanjoorUrl;
pageInfo.Tags.Add(tag);
_context.PDFPages.Update(pageInfo);
RTagValue toc = await TagHandler.PrepareAttribute(_context, "Title in TOC", link.GanjoorTitle, 1);
toc.ValueSupplement = "1";//font size
if (pageInfo.Tags.Where(t => t.RTag.Name == "Title in TOC" && t.Value == toc.Value).Count() == 0)
{
toc.Order = 1 + pageInfo.Tags.Where(t => t.RTag.NameInEnglish == "Title in TOC").Count();
pageInfo.Tags.Add(toc);
_context.PDFPages.Update(pageInfo);
}
}
await _context.SaveChangesAsync();
return new RServiceResult<bool>(true);
}
/// <summary>
/// Database Context
/// </summary>
@ -1412,7 +1534,7 @@ namespace RMuseum.Services.Implementation
/// ftp service
/// </summary>
protected readonly IQueuedFTPUploadService _ftpService;
/// <summary>
/// Configuration
/// </summary>