diff options
| author | eltrac <hi@eltr.ac> | 2026-05-09 14:55:37 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-05-09 14:55:37 +0800 |
| commit | 845ff0f0facf3b7428399e4924b4aa0c9d79111c (patch) | |
| tree | 61a3d650655d441bd4c7deeb30d283185b2be451 /src | |
| parent | 0f73efc24cd20294fe4d2fccf288d328d647d6f8 (diff) | |
refactor: separate partition rules with response
Use a separate `(partition-pages)` function and pass its output as an
argument to `(respond-webmention-json-list)`, instead of implementing
partitioning inside that response function.
Also, when list if empty. Should respond 400 instead of 404 since the
route is "found", only something wrong with the request.
Diffstat (limited to 'src')
| -rw-r--r-- | src/weepinbell/retriever.clj | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/src/weepinbell/retriever.clj b/src/weepinbell/retriever.clj index 28575d9..d1572dc 100644 --- a/src/weepinbell/retriever.clj +++ b/src/weepinbell/retriever.clj @@ -17,26 +17,28 @@ :body {:status 404 :message "Webmention does not exist or is pending for verification."}})) -(defn- respond-webmention-list-json - ([data] - (respond-webmention-list-json nil nil data)) - ([page data] - (respond-webmention-list-json page default-page-size data)) - ([page page-size data] - (if (nil? page) data - ;; if page number is provided - ;; partition and return page frame - (let [pages (partition-all page-size data) - length (count pages) - page (Integer/parseInt page)] - (if (>= page length) - {:status 404 - :headers {"Content-Type" "application/json; charset=utf-8"} - :body {:message "No such page. Is page out of range and is it an integer?"}} - ;; return page frame if page exists - {:status 200 - :headers {"Content-Type" "application/json; charset=utf-8"} - :body (nth pages page)}))))) +(defn- partition-pages + [page size data] + (let [pages (partition-all size data) + length (count pages) + page (cond (keyword? page) page + (string? page) (Integer/parseInt page) + :else false)] + (cond (= page :last) (last pages) + (int? page) (if (>= page length) false + (nth pages page)) + (not page) false + :else false))) + +(defn- respond-webmention-list-json [data] + (let [base-resp {:status 200 + :headers {"Content-Type" "application/json; charset=utf-8"} + :body []}] + (if data + (assoc base-resp :body data) + (assoc (assoc base-resp :status 400) + :body {:message "The list is empty, something is wrong with your request."})) + )) (defn- wrap-response-object [data] (let [result {:webmention (:webmention data)}] @@ -70,7 +72,8 @@ (cond->> (storage/get-wms-by-domain domain) true wrap-response-list typ (filter-response-by-mftype typ) - true (respond-webmention-list-json page))) + page (partition-pages page default-page-size) + true respond-webmention-list-json)) (defn by-url "Get webmention sent to a particular URL." @@ -81,7 +84,8 @@ true (filter #(= url (get-in % [:webmention :target]))) true wrap-response-list typ (filter-response-by-mftype typ) - true (respond-webmention-list-json page)) + page (partition-pages page default-page-size) + true respond-webmention-list-json) ;; if no url query is passed {:status 400 :headers {"Content-Type" "application/json; charset=utf-8"} |
