#404 review suggested ganjoor links
This commit is contained in:
parent
98c21ffcc6
commit
7b930d5193
@ -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>
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -20,6 +20,10 @@
|
||||
/// <summary>
|
||||
/// Instagram
|
||||
/// </summary>
|
||||
Instagram = 3
|
||||
Instagram = 3,
|
||||
/// <summary>
|
||||
/// Naskban
|
||||
/// </summary>
|
||||
Naskban = 4,
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user