#109 (db migration not added yet) + some compiler warning fixes
This commit is contained in:
parent
49b277dcd9
commit
d0bad3565a
@ -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>
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
33
RMuseum/Models/Ganjoor/GanjoorHealthCheckError.cs
Normal file
33
RMuseum/Models/Ganjoor/GanjoorHealthCheckError.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user