summaryrefslogtreecommitdiffstats
path: root/src/server/Api/Internal/GetSiteReportRoute.cs
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-01-22 22:43:38 +0100
committerivarlovlie <git@ivarlovlie.no>2022-01-22 22:43:38 +0100
commit88110f536f9c3843ecf5016122e101f8a424af77 (patch)
treee8be4e77ccfb5ad37f49f89adad59ff12b4c85ea /src/server/Api/Internal/GetSiteReportRoute.cs
downloadbookmark-thing-88110f536f9c3843ecf5016122e101f8a424af77.tar.xz
bookmark-thing-88110f536f9c3843ecf5016122e101f8a424af77.zip
Initial commit
Diffstat (limited to 'src/server/Api/Internal/GetSiteReportRoute.cs')
-rw-r--r--src/server/Api/Internal/GetSiteReportRoute.cs54
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);
+ }
+}