summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-04-13 17:08:21 +0800
committereltrac <hi@eltr.ac>2026-04-13 17:08:50 +0800
commit734f7972f1a82d332f176ee308f7c3bef2af9353 (patch)
treea749f87bc27b492d8f5742678225cea4c96d7768 /src
parent8a6942de45ef440e93a3e5cfff841f763c0bb7e6 (diff)
feat: add typing support for by-url routes
new route /api/likes/?url= new route /api/reposts/?url= new route /api/replies/?url=
Diffstat (limited to 'src')
-rw-r--r--src/weepinbell/handler.clj9
-rw-r--r--src/weepinbell/retriever.clj31
2 files changed, 29 insertions, 11 deletions
diff --git a/src/weepinbell/handler.clj b/src/weepinbell/handler.clj
index d13413d..7a2eec3 100644
--- a/src/weepinbell/handler.clj
+++ b/src/weepinbell/handler.clj
@@ -31,11 +31,14 @@
(GET "/:domain" [domain] (retriever/by-domain domain)))
;; query webmention list by microformats type
(context "/likes" []
- (GET "/:domain" [domain] (retriever/by-domain domain :like-of)))
+ (GET "/" [url] (retriever/by-url url :like))
+ (GET "/:domain" [domain] (retriever/by-domain domain :like)))
(context "/reposts" []
- (GET "/:domain" [domain] (retriever/by-domain domain :repost-of)))
+ (GET "/" [url] (retriever/by-url url :repost))
+ (GET "/:domain" [domain] (retriever/by-domain domain :repost)))
(context "/replies" []
- (GET "/:domain" [domain] (retriever/by-domain domain :in-reply-to)))
+ (GET "/" [url] (retriever/by-url url :reply))
+ (GET "/:domain" [domain] (retriever/by-domain domain :reply)))
;; query one specific webmention
(context "/mention" []
(GET "/:id" [id] (retriever/by-id id))
diff --git a/src/weepinbell/retriever.clj b/src/weepinbell/retriever.clj
index da6868b..bcbdd98 100644
--- a/src/weepinbell/retriever.clj
+++ b/src/weepinbell/retriever.clj
@@ -25,31 +25,46 @@
(defn- wrap-response-list [data]
(map wrap-response-object data))
+
+(defn- get-mftype-key [typ]
+ (get {:like :like-of
+ :repost :repost-of
+ :reply :in-reply-to
+ :rsvp :rsvp} typ))
+
+(defn- filter-response-by-mftype [typ data]
+ (when typ
+ (filter #(= (-> % :microformats :type)
+ (get-mftype-key typ))
+ data)))
;; end utilities
(defn by-domain
"Get webmentions sent to a particular domain."
([domain]
(by-domain domain nil))
- ([domain mftype]
- (cond->> (storage/get-wms-by-domain domain)
- true wrap-response-list
- mftype (filter #(= (-> % :microformats :type) mftype))
- true respond-json)))
+ ([domain typ]
+ (->> (storage/get-wms-by-domain domain)
+ wrap-response-list
+ (filter-response-by-mftype typ)
+ respond-json)))
(defn by-url
"Get webmention sent to a particular URL."
- [url]
- (if url
+ ([url]
+ (by-url url nil))
+ ([url typ]
+ (if url
(->> (get-domain url)
storage/get-wms-by-domain
(filter #(= url (get-in % [:webmention :target])))
wrap-response-list
+ (filter-response-by-mftype typ)
respond-json)
;; if no url query is passed
(respond-json {:status 400
:message "Missing URL. Specify target URL whose webmentions you are querying."}
- 400)))
+ 400))))
(defn by-id
"Get one specific webmention by ID."