#407 PDF Page by number (omitted book BookText)

This commit is contained in:
Hamid Reza Mohammadi 2023-08-11 11:18:54 +03:30
parent 6f2b405cf0
commit 4831ed6c09
5 changed files with 149 additions and 0 deletions

View File

@ -1421,6 +1421,41 @@ namespace RMuseum.Controllers
return Ok();
}
/// <summary>
/// page of published book by page number
/// </summary>
/// <param name="pdfBookId"></param>
/// <param name="pageNumber"></param>
/// <returns></returns>
[HttpGet("{pdfBookId}/page/{pageNumber}")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(PDFPage))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetPDFPageAsync(int pdfBookId, int pageNumber)
{
var bookRes = await _pdfService.GetPDFPageAsync(pdfBookId, pageNumber);
if (!string.IsNullOrEmpty(bookRes.ExceptionString))
{
return BadRequest(bookRes.ExceptionString);
}
if (bookRes.Result == null)
return NotFound();
Response.GetTypedHeaders().LastModified = bookRes.Result.LastModified;
var requestHeaders = Request.GetTypedHeaders();
if (requestHeaders.IfModifiedSince.HasValue &&
requestHeaders.IfModifiedSince.Value >= bookRes.Result.LastModified)
{
return StatusCode(StatusCodes.Status304NotModified);
}
return Ok(bookRes.Result);
}
/// <summary>
/// PDF Service

View File

@ -1,4 +1,5 @@
using RMuseum.Models.Artifact;
using RMuseum.Models.Artifact.ViewModels;
using RSecurityBackend.Models.Image;
using System;
using System.Collections.Generic;
@ -87,5 +88,11 @@ namespace RMuseum.Models.PDFLibrary
[NotMapped]
public PDFBook PDFBook { get; set; }
/// <summary>
/// tags view models
/// </summary>
[NotMapped]
public ICollection<RArtifactTagViewModel> ArtifactTags { get; set; }
}
}

View File

@ -2790,6 +2790,14 @@
<param name="pdf"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.PDFLibraryController.GetPDFPageAsync(System.Int32,System.Int32)">
<summary>
page of published book by page number
</summary>
<param name="pdfBookId"></param>
<param name="pageNumber"></param>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.PDFLibraryController._pdfService">
<summary>
PDF Service
@ -12868,6 +12876,11 @@
pdf book
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.PDFPage.ArtifactTags">
<summary>
tags view models
</summary>
</member>
<member name="T:RMuseum.Models.PDFLibrary.PDFSource">
<summary>
PDF Source (Web Sites)
@ -18424,6 +18437,14 @@
<param name="omitPageText"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.GetPDFPageAsync(System.Int32,System.Int32)">
<summary>
get page by page number
</summary>
<param name="pdfBookId"></param>
<param name="pageNumber"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.PDFLibraryService.GetAllPDFBooksAsync(RSecurityBackend.Models.Generic.PagingParameterModel,RMuseum.Models.Artifact.PublishStatus[])">
<summary>
get all pdfbooks (including CoverImage info but not pages or tagibutes info)
@ -20067,6 +20088,14 @@
<param name="term"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IPDFLibraryService.GetPDFPageAsync(System.Int32,System.Int32)">
<summary>
get page by page number
</summary>
<param name="pdfBookId"></param>
<param name="pageNumber"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.IPictureFileService">
<summary>
manipulating picture files

View File

@ -422,5 +422,13 @@ namespace RMuseum.Services
/// <param name="term"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, PDFPage[] Items)>> SearchPDFPagesTextAsync(PagingParameterModel paging, int bookId, string term);
/// <summary>
/// get page by page number
/// </summary>
/// <param name="pdfBookId"></param>
/// <param name="pageNumber"></param>
/// <returns></returns>
Task<RServiceResult<PDFPage>> GetPDFPageAsync(int pdfBookId, int pageNumber);
}
}

View File

@ -134,6 +134,76 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// get page by page number
/// </summary>
/// <param name="pdfBookId"></param>
/// <param name="pageNumber"></param>
/// <returns></returns>
public async Task<RServiceResult<PDFPage>> GetPDFPageAsync(int pdfBookId, int pageNumber)
{
try
{
var pdfBook = await _context.PDFBooks.AsNoTracking().Where(b => b.Id == pdfBookId).SingleAsync();
if (pdfBook.Status != PublishStatus.Published)
{
return null;
}
pdfBook.BookText = "";
var pdfPage = await _context.PDFPages.AsNoTracking()
.Include(b => b.Tags).ThenInclude(t => t.RTag)
.Where(b => b.PDFBookId == pdfBookId && b.PageNumber == pageNumber)
.SingleOrDefaultAsync();
if (pdfPage != null)
{
pdfPage.PDFBook = pdfBook;
List<RArtifactTagViewModel> rArtifactTags = new List<RArtifactTagViewModel>();
if (pdfPage.Tags != null)
{
foreach (RTagValue tag in pdfPage.Tags)
{
RArtifactTagViewModel related = rArtifactTags.Where(t => t.Id == tag.RTagId).SingleOrDefault();
List<RTagValue> values = (related == null) ? new List<RTagValue>() : new List<RTagValue>(related.Values);
if (related == null)
{
related =
new RArtifactTagViewModel()
{
Id = tag.RTag.Id,
Order = tag.RTag.Order,
TagType = tag.RTag.TagType,
FriendlyUrl = tag.RTag.FriendlyUrl,
Status = tag.RTag.Status,
Name = tag.RTag.Name,
NameInEnglish = tag.RTag.NameInEnglish,
GlobalValue = tag.RTag.GlobalValue,
PluralName = tag.RTag.PluralName,
PluralNameInEnglish = tag.RTag.PluralNameInEnglish
};
rArtifactTags.Add(related);
}
values.Add(tag);
values.Sort((a, b) => a.Order - b.Order);
related.Values = values;
}
rArtifactTags.Sort((a, b) => a.Order - b.Order);
}
pdfPage.ArtifactTags = rArtifactTags;
}
return new RServiceResult<PDFPage>(pdfPage);
}
catch (Exception exp)
{
return new RServiceResult<PDFPage>(null, exp.ToString());
}
}
/// <summary>
/// get all pdfbooks (including CoverImage info but not pages or tagibutes info)
/// </summary>