aboutsummaryrefslogtreecommitdiff
path: root/back-end/src/Endpoints
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2024-08-18 01:22:24 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2024-08-18 01:22:24 -0400
commite1e567c42734817e05fed65b95817e41e3615c0c (patch)
tree06b11df11404b867faaf709ce65badc0db560c6a /back-end/src/Endpoints
parent3ad2db886f8c002248249a69c205d05cea0a5cc2 (diff)
testing and updateswidget
Diffstat (limited to 'back-end/src/Endpoints')
-rw-r--r--back-end/src/Endpoints/WidgetEndpoint.cs76
1 files changed, 61 insertions, 15 deletions
diff --git a/back-end/src/Endpoints/WidgetEndpoint.cs b/back-end/src/Endpoints/WidgetEndpoint.cs
index ad2fa39..13694e3 100644
--- a/back-end/src/Endpoints/WidgetEndpoint.cs
+++ b/back-end/src/Endpoints/WidgetEndpoint.cs
@@ -15,8 +15,10 @@
using System;
using System.Net;
+using System.Linq;
using System.Threading.Tasks;
using System.Text;
+using System.Collections.Generic;
using VNLib.Utils.IO;
using VNLib.Utils.Memory;
@@ -43,7 +45,14 @@ namespace SimpleBookmark.Endpoints
private readonly BookmarkStore bookmarks = plugin.GetOrCreateSingleton<BookmarkStore>();
private readonly WidgetAuthManager authManager = plugin.GetOrCreateSingleton<WidgetAuthManager>();
private readonly bool Enabled = config.GetValueOrDefault("enabled", false);
- private readonly string? CorsAclHeaerDomains = config.GetValueOrDefault<string?>("cors-urls", null);
+ private readonly string? CorsAclHeaderDomains = config.GetValueOrDefault<string?>("cors-urls", null);
+
+ protected override ProtectionSettings EndpointProtectionSettings { get; } = new()
+ {
+ DisableSessionsRequired = true,
+ DisabledTlsRequired = true,
+ DisableRefererMatch = true,
+ };
protected override async ValueTask<VfReturnType> GetAsync(HttpEntity entity)
{
@@ -52,15 +61,44 @@ namespace SimpleBookmark.Endpoints
return VfReturnType.NotFound;
}
+ string limitStr = entity.QueryArgs.GetValueOrDefault("l", "25");
+ string pageStr = entity.QueryArgs.GetValueOrDefault("p", "1");
+
+ //Get any query arguments
+ if (entity.QueryArgs.TryGetNonEmptyValue("q", out string? query))
+ {
+ //Replace percent encoding with spaces
+ query = query.Replace('+', ' ');
+ }
+
+ string[] tags = [];
+
+ //Get tags
+ if (entity.QueryArgs.TryGetNonEmptyValue("t", out string? tagsS))
+ {
+ //Split tags at spaces and remove empty entries
+ tags = tagsS.Split('+')
+ .Where(static t => !string.IsNullOrWhiteSpace(t))
+ .ToArray();
+ }
+
+ if (!int.TryParse(limitStr, out int limit) || !int.TryParse(pageStr, out int page))
+ {
+ return VirtualClose(entity, HttpStatusCode.BadRequest);
+ }
+
+ limit = Math.Clamp(limit, 0, 100);
+ page = Math.Clamp(page, 0, 100);
+
/* if (!await authManager.IsTokenValidAsync(entity))
{
return VirtualClose(entity, HttpStatusCode.Unauthorized);
}*/
//Widgets might be loaded in an iframe, so we need to allow cross-site requests
- if (CorsAclHeaerDomains is not null && entity.Server.IsCrossSite())
+ if (CorsAclHeaderDomains is not null && entity.Server.IsCrossSite())
{
- entity.Server.Headers.Append("Access-Control-Allow-Origin", CorsAclHeaerDomains);
+ entity.Server.Headers.Append("Access-Control-Allow-Origin", CorsAclHeaderDomains);
}
/*
@@ -69,11 +107,11 @@ namespace SimpleBookmark.Endpoints
*/
BookmarkEntry[] boomarks = await bookmarks.SearchBookmarksAsync(
- entity.Session.UserID,
- query: null,
- tags: ["favorite"],
- limit: 25,
- page: 1,
+ userId: entity.Session.UserID,
+ query: query,
+ tags: tags,
+ limit: limit,
+ page: page,
entity.EventCancellation
);
@@ -87,7 +125,7 @@ namespace SimpleBookmark.Endpoints
CompileGlanceTemplate(baseUrl, output, boomarks);
//Assign glance template
- entity.Server.Headers["Widget-Title"] = "Simple-Bookmark Widget";
+ entity.Server.Headers["Widget-Title"] = "Simple-Bookmark";
entity.Server.Headers["Widget-Content-Type"] = "html";
return VirtualClose(entity, HttpStatusCode.OK, ContentType.Html, output);
@@ -96,7 +134,7 @@ namespace SimpleBookmark.Endpoints
{
output.Dispose();
- Log.Error(ex, "Failed to complie glance template");
+ Log.Error(ex, "Failed to complie glance widget template");
return VirtualClose(entity, HttpStatusCode.InternalServerError);
}
}
@@ -117,28 +155,36 @@ namespace SimpleBookmark.Endpoints
writer.Append("<p class='size-h3'>");
writer.Append("<a class='bookmarks-link color-highlight size-h3' href='");
writer.Append(hostUrl);
- writer.Append("'>Favorites:</a>");
+ writer.Append("'>Favorites</a>");
writer.Append("</p>");
writer.Append("<hr class='margin-block-15'/>");
//Start bookmarks list
- writer.Append("<ul class='list-horizontal-text'>");
+ writer.Append("<ul class='list list-gap-24 list-with-separator'>");
+ writer.Append("<li class='bookmarks-group'>");
+ writer.Append("<ul class='list list-gap-2'>");
foreach (BookmarkEntry entry in bookmarks)
{
- writer.Append("<li>");
+ ReadOnlySpan<char> nameSpan = entry.Name.AsSpan();
+
+ nameSpan = nameSpan[..Math.Min(nameSpan.Length, 20)];
+
+ writer.Append("<li class='flex items-center gap-10'>");
//Enable the built-in bookmarks link (makes it prettier)
- writer.Append("<a class='bookmarks-link color-highlight size-h4' href='");
+ writer.Append("<a class='bookmarks-link color-highlight' href='");
writer.Append(entry.Url);
writer.Append("'>");
- writer.Append(entry.Name);
+ writer.Append(nameSpan);
writer.Append("</a>");
writer.Append("</li>");
}
writer.Append("</ul>");
+ writer.Append("</li>");
+ writer.Append("</ul>");
//Close the document
writer.Append("</body>");