#404 suggest ganjoor link for naskban

This commit is contained in:
Hamid Reza Mohammadi 2023-08-01 09:55:20 +03:30
parent fb2642d288
commit 7d8aed75b2
6 changed files with 358 additions and 45 deletions

View File

@ -543,5 +543,10 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<QueuedFTPUpload> QueuedFTPUploads { get; set; }
/// <summary>
/// PDF Ganjoor Links
/// </summary>
public DbSet<PDFGanjoorLink> PDFGanjoorLinks { get; set; }
}
}

View File

@ -0,0 +1,91 @@
using RSecurityBackend.Models.Auth.Db;
using System;
namespace RMuseum.Models.GanjoorIntegration
{
/// <summary>
/// PDFBook Ganjoor Link
/// </summary>
public class PDFGanjoorLink
{
/// <summary>
/// Ganjoor Post Id
/// </summary>
public int GanjoorPostId { get; set; }
/// <summary>
/// ganjoor url
/// </summary>
public string GanjoorUrl { get; set; }
/// <summary>
/// ganjoor title
/// </summary>
public string GanjoorTitle { get; set; }
/// <summary>
/// pdf book id
/// </summary>
public int PDFBookId { get; set; }
/// <summary>
/// page number
/// </summary>
public int PageNumber { get; set; }
/// <summary>
/// User Id who suggested the link
/// </summary>
public Guid SuggestedById { get; set; }
/// <summary>
/// Suggestion Date
/// </summary>
public DateTime SuggestionDate { get; set; }
/// <summary>
/// User who suggested the link
/// </summary>
public RAppUser SuggestedBy { get; set; }
/// <summary>
/// User id who reviewed the link
/// </summary>
public Guid? ReviewerId { get; set; }
/// <summary>
/// User who reviewed the link
/// </summary>
public virtual RAppUser Reviewer { get; set; }
/// <summary>
/// Review Date
/// </summary>
public DateTime ReviewDate { get; set; }
/// <summary>
/// review result
/// </summary>
public ReviewResult ReviewResult { get; set; }
/// <summary>
/// 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 Page Title
/// </summary>
public string PDFPageTitle { get; set; }
/// <summary>
/// external thumbnail image url
/// </summary>
public string ExternalThumbnailImageUrl { get; set; }
}
}

View File

@ -0,0 +1,33 @@
namespace RMuseum.Models.PDFLibrary.ViewModels
{
/// <summary>
/// PDFBook Ganjoor Link Suggestion
/// </summary>
public class PDFGanjoorLinkSuggestion
{
/// <summary>
/// Ganjoor Post Id
/// </summary>
public int GanjoorPostId { get; set; }
/// <summary>
/// ganjoor url
/// </summary>
public string GanjoorUrl { get; set; }
/// <summary>
/// ganjoor title
/// </summary>
public string GanjoorTitle { get; set; }
/// <summary>
/// pdf book id
/// </summary>
public int PDFBookId { get; set; }
/// <summary>
/// page number
/// </summary>
public int PageNumber { get; set; }
}
}

View File

@ -3624,6 +3624,11 @@
Queued FTP Uploads
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.PDFGanjoorLinks">
<summary>
PDF Ganjoor Links
</summary>
</member>
<member name="T:RMuseum.Migrations.PictureFileExtUrl">
<inheritdoc />
</member>
@ -6345,6 +6350,91 @@
Instagram
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink">
<summary>
PDFBook Ganjoor Link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.GanjoorPostId">
<summary>
Ganjoor Post Id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.GanjoorUrl">
<summary>
ganjoor url
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.GanjoorTitle">
<summary>
ganjoor title
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.PDFBookId">
<summary>
pdf book id
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.PageNumber">
<summary>
page number
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.SuggestedById">
<summary>
User Id who suggested the link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.SuggestionDate">
<summary>
Suggestion Date
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.SuggestedBy">
<summary>
User who suggested the link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.ReviewerId">
<summary>
User id who reviewed the link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.Reviewer">
<summary>
User who reviewed the link
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.ReviewDate">
<summary>
Review Date
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.ReviewResult">
<summary>
review result
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.Synchronized">
<summary>
Synchronized with ganjoor
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.IsTextOriginalSource">
<summary>
is the is the text original source?
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.PDFPageTitle">
<summary>
PDF Page Title
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorIntegration.PDFGanjoorLink.ExternalThumbnailImageUrl">
<summary>
external thumbnail image url
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorIntegration.PinterestLink">
<summary>
pinterest link
@ -12796,6 +12886,36 @@
Book Script Type
</summary>
</member>
<member name="T:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion">
<summary>
PDFBook Ganjoor Link Suggestion
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion.GanjoorPostId">
<summary>
Ganjoor Post Id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion.GanjoorUrl">
<summary>
ganjoor url
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion.GanjoorTitle">
<summary>
ganjoor title
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion.PDFBookId">
<summary>
pdf book id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion.PageNumber">
<summary>
page number
</summary>
</member>
<member name="T:RMuseum.Models.UploadSession.UploadSession">
<summary>
Upload Session
@ -18321,6 +18441,14 @@
<param name="term"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.SuggestGanjoorLink(System.Guid,RMuseum.Models.PDFLibrary.ViewModels.PDFGanjoorLinkSuggestion)">
<summary>
suggest ganjoor link
</summary>
<param name="userId"></param>
<param name="link"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.PDFLibraryService._context">
<summary>
Database Context

View File

@ -2630,11 +2630,11 @@ namespace RMuseum.Services.Implementation
{
RArtifactMasterRecord artifact = await _context.Artifacts.Where(a => a.FriendlyUrl == link.ArtifactFriendlyUrl).SingleOrDefaultAsync();
GanjoorLink alreaySuggest =
GanjoorLink alreadySuggest =
await _context.GanjoorLinks.
Where(l => l.GanjoorPostId == link.GanjoorPostId && l.ArtifactId == artifact.Id && l.ItemId == link.ItemId && l.ReviewResult != ReviewResult.Rejected)
.SingleOrDefaultAsync();
if (alreaySuggest != null)
if (alreadySuggest != null)
return new RServiceResult<GanjoorLinkViewModel>(null, "این مورد پیشتر پیشنهاد شده است.");
GanjoorLink suggestion =

View File

@ -4,8 +4,11 @@ using Microsoft.Extensions.Configuration;
using RMuseum.DbContext;
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RMuseum.Models.GanjoorIntegration;
using RMuseum.Models.PDFLibrary;
using RMuseum.Models.PDFLibrary.ViewModels;
using RSecurityBackend.Models.Auth.ViewModels;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Models.Image;
using RSecurityBackend.Services;
@ -1285,59 +1288,111 @@ namespace RMuseum.Services.Implementation
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>> SearchPDFBooksAsync(PagingParameterModel paging, string term)
{
term = term.Trim().ApplyCorrectYeKe();
if (string.IsNullOrEmpty(term))
try
{
return new RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>((null, null), "خطای جستجوی عبارت خالی");
}
term = term.Trim().ApplyCorrectYeKe();
term = term.Replace("‌", " ");//replace zwnj with space
string searchConditions;
if (term.IndexOf('"') == 0 && term.LastIndexOf('"') == (term.Length - 1))
{
searchConditions = term.Replace("\"", "").Replace("'", "");
searchConditions = $"\"{searchConditions}\"";
}
else
{
string[] words = term.Replace("\"", "").Replace("'", "").Split(' ', StringSplitOptions.RemoveEmptyEntries);
searchConditions = "";
string emptyOrAnd = "";
foreach (string word in words)
if (string.IsNullOrEmpty(term))
{
searchConditions += $" {emptyOrAnd} \"*{word}*\" ";
emptyOrAnd = " AND ";
return new RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>((null, null), "خطای جستجوی عبارت خالی");
}
term = term.Replace("‌", " ");//replace zwnj with space
string searchConditions;
if (term.IndexOf('"') == 0 && term.LastIndexOf('"') == (term.Length - 1))
{
searchConditions = term.Replace("\"", "").Replace("'", "");
searchConditions = $"\"{searchConditions}\"";
}
else
{
string[] words = term.Replace("\"", "").Replace("'", "").Split(' ', StringSplitOptions.RemoveEmptyEntries);
searchConditions = "";
string emptyOrAnd = "";
foreach (string word in words)
{
searchConditions += $" {emptyOrAnd} \"*{word}*\" ";
emptyOrAnd = " AND ";
}
}
//full text catalogue should be created manually
var source =
_context.PDFBooks.AsNoTracking().Include(a => a.Tags)
.Where(p =>
p.Status == PublishStatus.Published
&&
(
EF.Functions.Contains(p.Title, searchConditions)
||
EF.Functions.Contains(p.AuthorsLine, searchConditions)
||
EF.Functions.Contains(p.TranslatorsLine, searchConditions)
||
EF.Functions.Contains(p.Description, searchConditions)
||
p.Tags.Where(t => EF.Functions.Contains(t.Value, searchConditions) || EF.Functions.Contains(t.ValueInEnglish, searchConditions)).Any()
)
).OrderBy(i => i.Title);
(PaginationMetadata PagingMeta, PDFBook[] Items) paginatedResult =
await QueryablePaginator<PDFBook>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>(paginatedResult);
}
//full text catalogue should be created manually
catch (Exception exp)
{
return new RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>((null, null), exp.ToString());
}
}
var source =
_context.PDFBooks.AsNoTracking().Include(a => a.Tags)
.Where(p =>
p.Status == PublishStatus.Published
&&
(
EF.Functions.Contains(p.Title, searchConditions)
||
EF.Functions.Contains(p.AuthorsLine, searchConditions)
||
EF.Functions.Contains(p.TranslatorsLine, searchConditions)
||
EF.Functions.Contains(p.Description, searchConditions)
||
p.Tags.Where(t => EF.Functions.Contains(t.Value, searchConditions) || EF.Functions.Contains(t.ValueInEnglish, searchConditions)).Any()
)
).OrderBy(i => i.Title);
/// <summary>
/// suggest ganjoor link
/// </summary>
/// <param name="userId"></param>
/// <param name="link"></param>
/// <returns></returns>
public async Task<RServiceResult<bool>> SuggestGanjoorLink(Guid userId, PDFGanjoorLinkSuggestion link)
{
try
{
PDFBook pdfBook = await _context.PDFBooks.AsNoTracking().Where(a => a.Id == link.PDFBookId).SingleOrDefaultAsync();
PDFGanjoorLink alreadySuggest =
await _context.PDFGanjoorLinks.AsNoTracking().
Where(l => l.GanjoorPostId == link.GanjoorPostId && l.PDFBookId == pdfBook.Id && l.PageNumber == link.PageNumber && l.ReviewResult != ReviewResult.Rejected)
.SingleOrDefaultAsync();
if (alreadySuggest != null)
return new RServiceResult<bool>(false, "این مورد پیشتر پیشنهاد شده است.");
(PaginationMetadata PagingMeta, PDFBook[] Items) paginatedResult =
await QueryablePaginator<PDFBook>.Paginate(source, paging);
PDFGanjoorLink suggestion =
new PDFGanjoorLink()
{
GanjoorPostId = link.GanjoorPostId,
GanjoorTitle = link.GanjoorTitle,
GanjoorUrl = link.GanjoorUrl,
PDFBookId = pdfBook.Id,
PageNumber = link.PageNumber,
SuggestedById = userId,
SuggestionDate = DateTime.Now,
ReviewResult = ReviewResult.Awaiting,
ExternalThumbnailImageUrl = (await _context.PDFPages.AsNoTracking().Where(l => l.PDFBookId == link.PDFBookId && l.PageNumber == link.PageNumber).SingleAsync()).ExtenalThumbnailImageUrl,
PDFPageTitle = pdfBook.Title + " - صفحهٔ " + link.PageNumber.ToString().ToPersianNumbers()
};
_context.PDFGanjoorLinks.Add(suggestion);
await _context.SaveChangesAsync();
return new RServiceResult<(PaginationMetadata PagingMeta, PDFBook[] Items)>(paginatedResult);
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
@ -1356,6 +1411,7 @@ namespace RMuseum.Services.Implementation
/// ftp service
/// </summary>
protected readonly IQueuedFTPUploadService _ftpService;
/// <summary>
/// Configuration
/// </summary>