summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-03-10 11:18:43 +0800
committereltrac <hi@eltr.ac>2026-03-10 11:18:43 +0800
commit24d4524d85fefdf1214a3b82ea32ececc77c5835 (patch)
tree134ca2293ee507ff3ccb512fac753b7756d1db50 /src
parent2d2e1cb7b5661cdc6dc6548b665a9f52235f328b (diff)
feat: add filter to retriever
Diffstat (limited to 'src')
-rw-r--r--src/weepinbell/handler.clj4
-rw-r--r--src/weepinbell/retriever.clj19
2 files changed, 17 insertions, 6 deletions
diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj
index a72fe0d..562712a 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-all]]
+ [weepinbell.retriever :refer [retrieve]]
[weepinbell.processor :refer [process-webmention]]
[clojure.core.async :refer [chan]]))
@@ -15,7 +15,7 @@
(defroutes api-routes
(POST (get-config :endpoint) [source target]
(receive {:s source :t target} wmc))
- (GET "/api/mentions" [] (retrieve-all))
+ (GET "/api/mentions" [filter] (retrieve filter))
(route/not-found "Not Found"))
(def app
diff --git a/src/weepinbell/retriever.clj b/src/weepinbell/retriever.clj
index 7862061..467af63 100644
--- a/src/weepinbell/retriever.clj
+++ b/src/weepinbell/retriever.clj
@@ -1,12 +1,23 @@
(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]))
-(defn retrieve-all
+(defn retrieve
"Get all webmentions."
- []
- (let [body (json/generate-string (storage/load-data))]
+ [filter-string]
+ (let [data (storage/load-data)
+ has-filter? (not (nil? filter-string))
+ filter-by-target? (and has-filter? (valid-http-url? filter-string))
+ filter-by-domain? (and has-filter? (includes? filter-string "."))
+ ;; determine filter predicate
+ pred (cond
+ 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 body}))
+ :body (json/generate-string (filter pred data))}))