diff options
Diffstat (limited to 'src/server/Api/Internal/GetSiteReportRoute.cs')
| -rw-r--r-- | src/server/Api/Internal/GetSiteReportRoute.cs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/server/Api/Internal/GetSiteReportRoute.cs b/src/server/Api/Internal/GetSiteReportRoute.cs new file mode 100644 index 0000000..58d6637 --- /dev/null +++ b/src/server/Api/Internal/GetSiteReportRoute.cs @@ -0,0 +1,54 @@ +using HtmlAgilityPack; +using IOL.BookmarkThing.Server.Api.Internal.Dtos; + +namespace IOL.BookmarkThing.Server.Api.Internal; + +public class GetSiteReportRoute : RouteBaseInternalAsync.WithRequest<GetSiteReportRequest>.WithActionResult +{ + private readonly HttpClient _client; + private readonly ILogger<GetSiteReportRequest> _logger; + private readonly AppDbContext _context; + + public GetSiteReportRoute(HttpClient client, ILogger<GetSiteReportRequest> logger, AppDbContext context) { + _client = client; + _logger = logger; + _context = context; + } + + [ApiVersionNeutral] + [ApiExplorerSettings(IgnoreApi = true)] + [HttpPost("~/v{version:apiVersion}/site-report")] + public override async Task<ActionResult> HandleAsync(GetSiteReportRequest request, CancellationToken cancellationToken = default) { + var report = new SiteReportDto(); + var exists = _context.Entries.Any(c => c.Url == request.Url && c.UserId == LoggedInUser.Id); + if (exists) { + report.Duplicate = true; + return Ok(report); + } + + try { + var http_request = await _client.GetAsync(request.Url, cancellationToken); + if (http_request.IsSuccessStatusCode) { + try { + var document = new HtmlDocument(); + document.Load(await http_request.Content.ReadAsStreamAsync(cancellationToken)); + var htmlNodes = document.DocumentNode.Descendants("meta") + .Where(p => p.GetAttributeValue("name", string.Empty).Equals("description", StringComparison.InvariantCultureIgnoreCase)); + report.Description = htmlNodes.FirstOrDefault()?.GetAttributeValue("content", string.Empty); + } catch (Exception e) { + _logger.LogWarning(e, "An error occured when parsing site for site report"); + } + } else { + report.Unreachable = true; + } + } catch (Exception e) { + if (e is HttpRequestException) { + report.Unreachable = true; + } + + _logger.LogError(e, "An error occured when getting external site for site report"); + } + + return Ok(report); + } +} |
