#109 (db migration not added yet) + some compiler warning fixes

This commit is contained in:
Hamid Reza Mohammadi 2021-04-29 21:48:56 +04:30
parent 49b277dcd9
commit d0bad3565a
7 changed files with 221 additions and 12 deletions

View File

@ -1131,6 +1131,24 @@ namespace RMuseum.Controllers
}
}
/// <summary>
/// examine site pages for broken links
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("healthcheck")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public IActionResult HealthCheckContents()
{
RServiceResult<bool> res =
_ganjoorService.HealthCheckContents();
if (res.Result)
return Ok();
return BadRequest(res.ExceptionString);
}
/// <summary>
/// Ganjoor Service
/// </summary>

View File

@ -251,6 +251,11 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<GanjoorSiteBanner> GanjoorSiteBanners { get; set; }
/// <summary>
/// Ganjoor Health Check Errors
/// </summary>
public DbSet<GanjoorHealthCheckError> GanjoorHealthCheckErrors { get; set; }
}
}

View File

@ -0,0 +1,33 @@
namespace RMuseum.Models.Ganjoor
{
/// <summary>
/// Ganjoor Page Health Check log
/// </summary>
public class GanjoorHealthCheckError
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; }
/// <summary>
/// referer url
/// </summary>
public string ReferrerPageUrl { get; set; }
/// <summary>
/// broken link
/// </summary>
public bool BrokenLink { get; set; }
/// <summary>
/// multiple targets for a page
/// </summary>
public bool MulipleTargets { get; set; }
/// <summary>
/// target url
/// </summary>
public string TargetUrl { get; set; }
}
}

View File

@ -926,6 +926,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.HealthCheckContents">
<summary>
examine site pages for broken links
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.GanjoorController._ganjoorService">
<summary>
Ganjoor Service
@ -1466,6 +1472,11 @@
Ganjoor Site Bannaers
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.GanjoorHealthCheckErrors">
<summary>
Ganjoor Health Check Errors
</summary>
</member>
<member name="T:RMuseum.Models.Artifact.PublishStatus">
<summary>
Items or pictures status
@ -3854,6 +3865,36 @@
reported by user
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorHealthCheckError">
<summary>
Ganjoor Page Health Check log
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorHealthCheckError.Id">
<summary>
id
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorHealthCheckError.ReferrerPageUrl">
<summary>
referer url
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorHealthCheckError.BrokenLink">
<summary>
broken link
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorHealthCheckError.MulipleTargets">
<summary>
multiple targets for a page
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.GanjoorHealthCheckError.TargetUrl">
<summary>
target url
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.GanjoorMetre">
<summary>
Poem prosodic Metre
@ -6820,6 +6861,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.HealthCheckContents">
<summary>
examine site pages for broken links
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.GetVersesByQuery(System.String,System.Int32,RSecurityBackend.Models.Generic.PagingParameterModel)">
<summary>
Get Verses By query
@ -7882,6 +7929,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.HealthCheckContents">
<summary>
examine site pages for broken links
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Services.Implementation.GanjoorService._context">
<summary>
Database Context

View File

@ -316,6 +316,12 @@ namespace RMuseum.Services
/// <returns></returns>
RServiceResult<bool> ImportFromMySql();
/// <summary>
/// examine site pages for broken links
/// </summary>
/// <returns></returns>
RServiceResult<bool> HealthCheckContents();
/// <summary>
/// Get Verses By query
/// </summary>

View File

@ -67,13 +67,9 @@ namespace RMuseum.Services.Implementation
_tiles.Add((x, 0), tile);
max_x = x;
}
catch (Exception aexp)
catch (ArgumentException)
{
if (aexp is ArgumentException)
{
break;
}
throw aexp;
break;
}
}
}
@ -113,13 +109,9 @@ namespace RMuseum.Services.Implementation
_tiles.Add((0, y), tile);
max_y = y;
}
catch (Exception aexp)
catch (ArgumentException)
{
if (aexp is ArgumentException)
{
break;
}
throw aexp;
break;
}
}
}

View File

@ -20,6 +20,7 @@ using DNTPersianUtils.Core;
using System.IO;
using RSecurityBackend.Models.Image;
using Microsoft.Data.SqlClient;
using System.Text.RegularExpressions;
namespace RMuseum.Services.Implementation
{
@ -2152,6 +2153,107 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// examine site pages for broken links
/// </summary>
/// <returns></returns>
public RServiceResult<bool> HealthCheckContents()
{
try
{
_backgroundTaskQueue.QueueBackgroundWorkItem
(
async token =>
{
using (RMuseumDbContext context = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC
{
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context);
var job = (await jobProgressServiceEF.NewJob("HealthCheckContents", "Query data")).Result;
try
{
var pages = await context.GanjoorPages.ToArrayAsync();
await jobProgressServiceEF.UpdateJob(job.Id, 0, $"Examining Pages");
var previousErrors = await context.GanjoorHealthCheckErrors.ToArrayAsync();
context.RemoveRange(previousErrors);
await context.SaveChangesAsync();
int percent = 0;
for (int i = 0; i < pages.Length; i++)
{
if (i * 100 / pages.Length > percent)
{
percent++;
await jobProgressServiceEF.UpdateJob(job.Id, percent);
}
var hrefs = pages[i].HtmlText.Split(new[] { "href=\"" }, StringSplitOptions.RemoveEmptyEntries).Where(o => o.StartsWith("http")).Select(o => o.Substring(0, o.IndexOf("\"")));
foreach (string url in hrefs)
{
if (url == "https://ganjoor.net" || url == "https://ganjoor.net/")
continue;
if (url.IndexOf("http://ganjoor.net") == 0)
{
context.GanjoorHealthCheckErrors.Add
(
new GanjoorHealthCheckError()
{
ReferrerPageUrl = pages[i].FullUrl,
TargetUrl = url,
BrokenLink = false,
MulipleTargets = false
}
);
await context.SaveChangesAsync();
}
else
if (url.IndexOf("https://ganjoor.net") == 0)
{
var testUrl = url.Substring("https://ganjoor.net".Length);
if (testUrl[testUrl.Length - 1] == '/')
testUrl = testUrl.Substring(0, testUrl.Length - 1);
var pageCount = await context.GanjoorPages.Where(p => p.FullUrl == testUrl).CountAsync();
if (pageCount != 1)
{
context.GanjoorHealthCheckErrors.Add
(
new GanjoorHealthCheckError()
{
ReferrerPageUrl = pages[i].FullUrl,
TargetUrl = url,
BrokenLink = pageCount == 0,
MulipleTargets = pageCount != 0
}
);
await context.SaveChangesAsync();
}
}
}
}
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch(Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
}
);
return new RServiceResult<bool>(true);
}
catch(Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
/// Database Context
/// </summary>