From b47d6409201760704c5c482ba6bde74ea9c981c8 Mon Sep 17 00:00:00 2001 From: Sagar Vrajalal Date: Mon, 27 May 2024 02:10:15 +0530 Subject: [PATCH] Add RSS feed --- project.clj | 3 ++- src/com/sagar/casa/rss.clj | 12 ++++++++++++ src/com/sagar/casa/server.clj | 32 ++++++++++++++++++++----------- src/com/sagar/casa/ui/blog.cljc | 13 ++++++++++--- src/com/sagar/casa/ui/routes.cljc | 1 + 5 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 src/com/sagar/casa/rss.clj diff --git a/project.clj b/project.clj index 6b200c2..6e2e87c 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,8 @@ [alekcz/storyblok-clj "1.2.0"] [camel-snake-kebab/camel-snake-kebab "0.4.3"] [clojure.java-time "1.3.0"] - [superstructor/re-highlight "2.0.2"]] + [superstructor/re-highlight "2.0.2"] + [clj-rss "0.4.0"]] :plugins [[lein-environ "1.1.0"]] :main ^:skip-aot com.sagar.casa :target-path "target/%s" diff --git a/src/com/sagar/casa/rss.clj b/src/com/sagar/casa/rss.clj new file mode 100644 index 0000000..142ea1e --- /dev/null +++ b/src/com/sagar/casa/rss.clj @@ -0,0 +1,12 @@ +(ns com.sagar.casa.rss + (:require [com.sagar.casa.api.storyblok :as api] + [clj-rss.core :as rss])) + + +(defn rss-feed + [] + (->> (api/get-story :blogs) + (map #(select-keys % [:title :slug :description])) + (map #(assoc % :link (str "https://sagarvrajalal.com/" (:slug %)))) + (map #(dissoc % :slug)) + (apply rss/channel-xml))) diff --git a/src/com/sagar/casa/server.clj b/src/com/sagar/casa/server.clj index 36d281d..b3419cc 100644 --- a/src/com/sagar/casa/server.clj +++ b/src/com/sagar/casa/server.clj @@ -2,6 +2,7 @@ (:require [com.sagar.casa.middleware :as middleware] com.sagar.casa.ui [donut.system :as ds] + [com.sagar.casa.rss :as rss] [hyperfiddle.electric :as e] [hyperfiddle.electric-ring-adapter :as electric-ring] [ring.adapter.jetty :as ring] @@ -9,7 +10,8 @@ [ring.middleware.params :refer [wrap-params]] [shadow.cljs.devtools.api :as shadow-api] [shadow.cljs.devtools.server :as shadow-server] - [taoensso.timbre :as timbre]) + [taoensso.timbre :as timbre] + [ring.util.response :as res]) (:import (org.eclipse.jetty.server.handler.gzip GzipHandler) (org.eclipse.jetty.websocket.server.config @@ -21,6 +23,18 @@ ;; See Dockerfile (not-empty (System/getProperty "HYPERFIDDLE_ELECTRIC_APP_VERSION"))) +(def entrypoint + (fn [handler] + (e/boot-server {} com.sagar.casa.ui/Root handler))) + + +(defn rss-middleware + [handler] + (fn [request] + (if (= (:uri request) "/feed.xml") + (-> (res/response (rss/rss-feed)) + (res/content-type "application/xml")) + (handler request)))) (defn electric-websocket-middleware "Open a websocket and boot an Electric server program defined by `entrypoint`. @@ -30,15 +44,16 @@ - see `hyperfiddle.electric-ring-adapter/wrap-reject-stale-client` - an Electric `entrypoint`: a function (fn [ring-request] (e/boot-server {} my-ns/My-e-defn ring-request)) " - [next-handler config entrypoint] + [next-handler config] (-> (electric-ring/wrap-electric-websocket next-handler entrypoint) (cookies/wrap-cookies) (electric-ring/wrap-reject-stale-client config) (wrap-params))) -(defn middleware [config entrypoint] +(defn middleware [config] (-> (middleware/http-middleware config) ; 2. serve regular http content - (electric-websocket-middleware config entrypoint))) ; 1. intercept electric websocket + (electric-websocket-middleware config) ; 1. intercept electric websocket + (rss-middleware))) (defn- add-gzip-handler! "Makes Jetty server compress responses. Optional but recommended." @@ -69,16 +84,11 @@ (.setMaxTextMessageSize wsContainer (* 100 1024 1024)))))) -(def entrypoint - (fn [handler] - (e/boot-server {} com.sagar.casa.ui/Root handler))) - - (def server #::ds{:start (fn [{{:keys [host port] :as opts} ::ds/config}] ;; Start electric compiler and server (timbre/warn (str "Starting server on " host ":" port)) - (ring/run-jetty (middleware opts entrypoint) opts)) + (ring/run-jetty (middleware opts) opts)) :config {:host (ds/ref [:env :http-host]) :port (ds/ref [:env :http-port]) :join? false @@ -98,7 +108,7 @@ (shadow-api/dev :dev) ;; Start electric compiler and server (timbre/warn (str "Starting server on " host ":" port)) - (ring/run-jetty (middleware opts entrypoint) opts)) + (ring/run-jetty (middleware opts) opts)) :stop (fn [{server ::ds/instance}] (timbre/warn "Stopping HTTP Server...") (.stop server) diff --git a/src/com/sagar/casa/ui/blog.cljc b/src/com/sagar/casa/ui/blog.cljc index 5487c12..b62f511 100644 --- a/src/com/sagar/casa/ui/blog.cljc +++ b/src/com/sagar/casa/ui/blog.cljc @@ -79,9 +79,16 @@ :fluid true :class-name "pt-3 col-md-6 overflow-auto mx-auto"} [:> Stack {:gap 2} - [:a {:style {:text-decoration :none} - :href routes/home} - "↰ Home"] + + [:> Row + [:> Col {:class-name "text-start"} + [:a {:style {:text-decoration :none} + :href routes/home} + "↰ Home"]] + [:> Col {:class-name "text-end"} + [:a {:style {:text-decoration :none} + :href routes/rss} + "RSS " [:i {:class-name "fa fa-rss"}]]]] [:div [:h2 "Blog"] [:hr {:style {:border-color :black}}]] diff --git a/src/com/sagar/casa/ui/routes.cljc b/src/com/sagar/casa/ui/routes.cljc index faeda88..06af2fa 100644 --- a/src/com/sagar/casa/ui/routes.cljc +++ b/src/com/sagar/casa/ui/routes.cljc @@ -6,3 +6,4 @@ (def blogpost (partial str blog "/")) (def not-found "/not-found") (def literature "/literature") +(def rss "/feed.xml")