summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-04-22 12:09:41 +0800
committereltrac <hi@eltr.ac>2026-04-22 12:09:41 +0800
commit93b7a316b0824fbc3d40489bf3e9528cbe4e2a80 (patch)
tree155d0bf279c7450ee2916693323e6e0487a86d08
parent9bb100633356be25b02f98bc3c30c67e5f154f54 (diff)
refactor: simple DI using callbacks
-rw-r--r--src/weepinbell/core.clj21
-rw-r--r--src/weepinbell/handler.clj4
-rw-r--r--src/weepinbell/processor.clj20
-rw-r--r--src/weepinbell/webhook.clj25
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))))