summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-03-16 20:31:14 +0800
committereltrac <hi@eltr.ac>2026-03-16 20:31:14 +0800
commit96821e2fe6f532107b6b3ffe210be8f71babd2cd (patch)
tree9f75c5049e3b87a7858aed44be55749416e54ab9 /src
parent97b7b6c7a9683eecf371a488e78acb7e8c422e42 (diff)
feat(handler): query one webmention by id
Diffstat (limited to 'src')
-rw-r--r--src/weepinbell/handler.clj3
-rw-r--r--src/weepinbell/retriever.clj18
-rw-r--r--src/weepinbell/utils.clj13
3 files changed, 25 insertions, 9 deletions
diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj
index 684d11c..17e1936 100644
--- a/src/weepinbell/handler.clj
+++ b/src/weepinbell/handler.clj
@@ -4,7 +4,7 @@
[ring.middleware.defaults :refer [wrap-defaults api-defaults]]
[weepinbell.config :refer [get-config]]
[weepinbell.receiver :refer [receive]]
- [weepinbell.retriever :refer [retrieve]]
+ [weepinbell.retriever :refer [retrieve retrieve-by-id]]
[weepinbell.processor :refer [process-webmention]]
[clojure.core.async :refer [chan]]))
@@ -16,6 +16,7 @@
(POST (get-config :endpoint) [source target]
(receive {:s source :t target} wmc))
(GET "/api/mentions" [filter] (retrieve filter))
+ (GET "/api/mention/:id" [id] (retrieve-by-id id))
(route/files "/avatars/" {:root "data/avatars"})
(route/not-found "Not Found"))
diff --git a/src/weepinbell/retriever.clj b/src/weepinbell/retriever.clj
index 467af63..e7f74fe 100644
--- a/src/weepinbell/retriever.clj
+++ b/src/weepinbell/retriever.clj
@@ -1,8 +1,8 @@
(ns weepinbell.retriever
(:require [weepinbell.storage :as storage]
- [weepinbell.utils :refer [valid-http-url? get-domain get-target]]
- [clojure.string :refer [includes?]]
- [cheshire.core :as json]))
+ [weepinbell.utils :refer [valid-http-url? get-domain get-target respond-json]]
+ [clojure.string :refer [includes?]]))
+
(defn retrieve
"Get all webmentions."
@@ -16,8 +16,12 @@
filter-by-target? #(= filter-string (get-target %))
filter-by-domain? #(= filter-string (-> % get-target get-domain))
:else identity)] ;; Use identity instead of not-empty for "no filter"
- ;; responsd with data filtered and converted to json
- {:status 200
- :headers {"Content-Type" "application/json; charset=utf-8"}
- :body (json/generate-string (filter pred data))}))
+ (respond-json (filter pred data))))
+
+(defn retrieve-by-id
+ "Get one specific webmention by ID."
+ [id]
+ (if-let [wm (storage/get-wm id)]
+ (respond-json wm)
+ (respond-json {:message "webmention not found"} 404)))
diff --git a/src/weepinbell/utils.clj b/src/weepinbell/utils.clj
index 99b5a2e..fe01d96 100644
--- a/src/weepinbell/utils.clj
+++ b/src/weepinbell/utils.clj
@@ -6,7 +6,8 @@
[clojure.string :as string]
[clojure.walk :as walk]
[clojure.java.io :as io]
- [taoensso.timbre :as timbre]))
+ [taoensso.timbre :as timbre]
+ [cheshire.core :as json]))
(defn get-domain [url]
(-> (URI/create url) .getHost))
@@ -86,3 +87,13 @@
(defn file-exists? [path]
(.exists (io/file path)))
+(defn respond-json
+ ([data]
+ (respond-json data 200))
+ ([data status]
+ (let [json-string (json/generate-string data)
+ status status]
+ {:status status
+ :headers {"Content-Type" "application/json; charset=utf-8"}
+ :body json-string})))
+