diff options
| author | eltrac <hi@eltr.ac> | 2026-04-13 17:08:21 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-04-13 17:08:50 +0800 |
| commit | 734f7972f1a82d332f176ee308f7c3bef2af9353 (patch) | |
| tree | a749f87bc27b492d8f5742678225cea4c96d7768 /src | |
| parent | 8a6942de45ef440e93a3e5cfff841f763c0bb7e6 (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.clj | 9 | ||||
| -rw-r--r-- | src/weepinbell/retriever.clj | 31 |
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." |
