diff options
| author | eltrac <hi@eltr.ac> | 2026-04-22 12:09:41 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-04-22 12:09:41 +0800 |
| commit | 93b7a316b0824fbc3d40489bf3e9528cbe4e2a80 (patch) | |
| tree | 155d0bf279c7450ee2916693323e6e0487a86d08 /src | |
| parent | 9bb100633356be25b02f98bc3c30c67e5f154f54 (diff) | |
refactor: simple DI using callbacks
Diffstat (limited to 'src')
| -rw-r--r-- | src/weepinbell/core.clj | 21 | ||||
| -rw-r--r-- | src/weepinbell/handler.clj | 4 | ||||
| -rw-r--r-- | src/weepinbell/processor.clj | 20 | ||||
| -rw-r--r-- | src/weepinbell/webhook.clj | 25 |
4 files changed, 44 insertions, 26 deletions
diff --git a/src/weepinbell/core.clj b/src/weepinbell/core.clj index a8e1e6f..e865397 100644 --- a/src/weepinbell/core.clj +++ b/src/weepinbell/core.clj @@ -1,9 +1,28 @@ (ns weepinbell.core (:require [ring.adapter.jetty :refer [run-jetty]] - [weepinbell.handler :refer [app]]) + [weepinbell.processor :refer [process-webmention]] + [weepinbell.handler :refer [app wmc]] + [weepinbell.config :refer [get-config]] + [weepinbell.webhook :as webhook] + [taoensso.timbre :as timbre]) (:gen-class)) ;; Essential for "lein uberjar" + (defn -main [& args] + ;; Start webmention processor + (process-webmention wmc + {:on-receive (fn [] + (timbre/info "Receive callback:") + (webhook/trigger :on-receive (get-config :webhook))) + :on-update (fn [] + (timbre/info "Update callback:") + (webhook/trigger :on-update (get-config :webhook))) + :on-delete (fn [] + (timbre/info "Delete callback:") + (webhook/trigger :on-delete (get-config :webhook))) + :on-create (fn [] + (timbre/info "Create callback:") + (webhook/trigger :on-create (get-config :webhook)))}) ;; Check for a PORT environment variable, default to 3000 (let [port (Integer/parseInt (or (System/getenv "PORT") "3000"))] (run-jetty app {:port port :join? true}))) diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj index d7067f0..29f772b 100644 --- a/src/weepinbell/handler.clj +++ b/src/weepinbell/handler.clj @@ -7,15 +7,11 @@ [weepinbell.config :refer [get-config]] [weepinbell.receiver :refer [receive]] [weepinbell.retriever :as retriever] - [weepinbell.processor :refer [process-webmention]] [weepinbell.ui :as ui] [weepinbell.feed :as feed] [clojure.core.async :refer [chan]])) -;; Start webmention processor - (def wmc (chan)) -(process-webmention wmc) ;; Define API routes diff --git a/src/weepinbell/processor.clj b/src/weepinbell/processor.clj index d075a06..571a870 100644 --- a/src/weepinbell/processor.clj +++ b/src/weepinbell/processor.clj @@ -5,7 +5,6 @@ [weepinbell.storage :as storage] [weepinbell.utils :refer [validate-content-types]] [weepinbell.wrapper :as wrapper] - [weepinbell.webhook :as webhook] [taoensso.timbre :as timbre])) (defn verify-mention @@ -28,32 +27,32 @@ (defn process-new-webmention "Store new webmention if verifed. Do nothing otherwise." - [source target] + [source target callbacks] (when (verify-mention source target) (timbre/info "\nšāāļø Valid webmention received: \n" "from " source "\n" "to " target "\n\n") (let [data (wrapper/wrap source target)] (storage/append-wm data))) - (webhook/trigger :on-create)) + ((:on-create callbacks))) (defn process-existing-webmention "Update existing Webmention when verified, delete it otherwise." - [source target] + [source target callbacks] (timbre/info "Webmention exists.") (if (verify-mention source target) (do (storage/update-wm source target (wrapper/wrap source target)) - (webhook/trigger :on-update) + ((:on-update callbacks)) (timbre/info "Webmention updated.")) (do (storage/delete-wm source target) - (webhook/trigger :on-delete) + ((:on-delete callbacks)) (timbre/info "Webmention no longer valid, deleted.")))) (defn process-webmention - [wmc] + [wmc callbacks] (go-loop [] (when-let [webmention (<! wmc)] (timbre/info "Webmention found in queue.") @@ -66,10 +65,9 @@ ;; if not, write to data (do (if (storage/get-wm s t) - (process-existing-webmention s t) - (process-new-webmention s t)) - ;; trigger webhook - (webhook/trigger :on-receive)) + (process-existing-webmention s t callbacks) + (process-new-webmention s t callbacks)) + ((:on-receive callbacks))) ;; if content-type check fails (timbre/error "Source or target is not HTML or plain text; or error occurred trying to get content type.")))) (recur))) diff --git a/src/weepinbell/webhook.clj b/src/weepinbell/webhook.clj index bb114cc..5a28fbc 100644 --- a/src/weepinbell/webhook.clj +++ b/src/weepinbell/webhook.clj @@ -1,16 +1,21 @@ (ns weepinbell.webhook (:require [clj-http.client :as client] [taoensso.timbre :as timbre] - [weepinbell.config :refer [get-config]] [weepinbell.utils :refer [valid-http-url?]])) -(defn trigger [keyw] - ;; keyw = on-receive, on-create, on-update, on-delete - (when-let [hooks (get (get-config :webhook) keyw)] - (->> hooks - (filter string?) - (filter valid-http-url?) - (map #((client/post %) - (timbre/info "Webhook triggered: " %))) - doall))) +(defn trigger + "Send requests to a list of webhooks." + ([urls] + (trigger urls nil)) + ([keyw webhooks] + (when-let [hooks (if (nil? webhooks) keyw + ;; if webhook list provided + ;; retrieve from config + (->> (get webhooks keyw) + (filter string?) + (filter valid-http-url?)))] + (->> hooks + (map #((client/post %) + (timbre/info "Webhook triggered: " %))) + doall)))) |
