From 92cc50254c6f02bd1e29d0727ccccd4e772afcca Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Sat, 28 May 2022 23:22:14 -0400 Subject: [PATCH] WIP on RSS settings page --- src/MyWebLog/Handlers/Feed.fs | 30 +++++++- src/MyWebLog/Handlers/Routes.fs | 3 + src/MyWebLog/themes/admin/rss-settings.liquid | 77 +++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 src/MyWebLog/themes/admin/rss-settings.liquid diff --git a/src/MyWebLog/Handlers/Feed.fs b/src/MyWebLog/Handlers/Feed.fs index fa88c98..f5ee7a9 100644 --- a/src/MyWebLog/Handlers/Feed.fs +++ b/src/MyWebLog/Handlers/Feed.fs @@ -11,6 +11,8 @@ open Microsoft.AspNetCore.Http open MyWebLog open MyWebLog.ViewModels +// ~~ FEED GENERATION ~~ + /// The type of feed to generate type FeedType = | StandardFeed @@ -211,12 +213,11 @@ let private addPodcast webLog (rssFeed : SyndicationFeed) (feed : CustomFeed) = rssFeed.ElementExtensions.Add ("category", "itunes", categoryXml) rssFeed.ElementExtensions.Add ("explicit", "itunes", ExplicitRating.toString podcast.explicit) rssFeed.ElementExtensions.Add ("subscribe", "rawvoice", feedUrl) - -// GET {any-prescribed-feed} -let generate (feedType : FeedType) postCount : HttpHandler = fun next ctx -> backgroundTask { + +/// Create a feed with a known non-zero-length list of posts +let createFeed (feedType : FeedType) posts : HttpHandler = fun next ctx -> backgroundTask { let webLog = ctx.WebLog let conn = ctx.Conn - let! posts = getFeedPosts webLog feedType postCount conn let! authors = Post.getAuthors webLog posts conn let! tagMaps = Post.getTagMappings webLog posts conn let cats = CategoryCache.get ctx @@ -255,3 +256,24 @@ let generate (feedType : FeedType) postCount : HttpHandler = fun next ctx -> bac return! (setHttpHeader "Content-Type" "text/xml" >=> setStatusCode 200 >=> setBodyFromString output) next ctx } + +// GET {any-prescribed-feed} +let generate (feedType : FeedType) postCount : HttpHandler = fun next ctx -> backgroundTask { + match! getFeedPosts ctx.WebLog feedType postCount ctx.Conn with + | posts when List.length posts > 0 -> return! createFeed feedType posts next ctx + | _ -> return! Error.notFound next ctx +} + +// ~~ FEED ADMINISTRATION ~~ + +open DotLiquid + +// GET: /admin/rss/settings +let editSettings : HttpHandler = fun next ctx -> task { + // TODO: stopped here + return! + Hash.FromAnonymousObject + {| csrf = csrfToken ctx + |} + |> viewForTheme "admin" "rss-settings" next ctx +} diff --git a/src/MyWebLog/Handlers/Routes.fs b/src/MyWebLog/Handlers/Routes.fs index be2f582..e629997 100644 --- a/src/MyWebLog/Handlers/Routes.fs +++ b/src/MyWebLog/Handlers/Routes.fs @@ -93,6 +93,9 @@ let router : HttpHandler = choose [ routef "/%s/edit" Post.edit routef "/%s/permalinks" Post.editPermalinks ]) + subRoute "/rss" (choose [ + route "/settings" >=> Feed.editSettings + ]) route "/settings" >=> Admin.settings subRoute "/tag-mapping" (choose [ route "s" >=> Admin.tagMappings diff --git a/src/MyWebLog/themes/admin/rss-settings.liquid b/src/MyWebLog/themes/admin/rss-settings.liquid new file mode 100644 index 0000000..cdc6bb8 --- /dev/null +++ b/src/MyWebLog/themes/admin/rss-settings.liquid @@ -0,0 +1,77 @@ +

{{ web_log.name }} RSS Options

+
+
+ +
+
+
+
+ + +
+
+
+
+ + + Default is feed.xml +
+
+
+
+ + + Set to “0” to use “Posts per Page” setting +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+
+

Custom Feeds

+ Add a New Custom Feed + {%- assign feed_count = model.custom_feeds | size -%} + {% if feed_count > 0 %} + + + + + + + + + + {% for feed in model.custom_feeds %} + + + + + + {% endfor %} + +
SourcePathPodcast?
+ {{ feed.source }} + + {{ feed.path }}{% if feed.is_podcast %}Yes{% else %}No{% endif %}
+ {% else %} +

No custom feeds defined

+ {% endif %} +