From 24d4524d85fefdf1214a3b82ea32ececc77c5835 Mon Sep 17 00:00:00 2001 From: eltrac Date: Tue, 10 Mar 2026 11:18:43 +0800 Subject: feat: add filter to retriever --- src/weepinbell/handler.clj | 4 ++-- src/weepinbell/retriever.clj | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'src') 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))})) -- cgit v1.2.3