Skip to content

Commit

Permalink
Enable routing & implement handlers (clj)
Browse files Browse the repository at this point in the history
  • Loading branch information
lagenorhynque committed Jun 2, 2019
1 parent ca14418 commit 64ba26b
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 11 deletions.
4 changes: 3 additions & 1 deletion minimal-api-clj.core/deps.edn
@@ -1,6 +1,8 @@
{:paths ["resources" "src"]
:deps {camel-snake-kebab {:mvn/version "0.4.0"}
:deps {bidi {:mvn/version "2.1.6"}
camel-snake-kebab {:mvn/version "0.4.0"}
integrant {:mvn/version "0.7.0"}
metosin/ring-http-response {:mvn/version "0.9.1"}
org.clojure/clojure {:mvn/version "1.10.0"}
ring/ring-core {:mvn/version "1.7.1"}
ring/ring-jetty-adapter {:mvn/version "1.7.1"}
Expand Down
61 changes: 51 additions & 10 deletions minimal-api-clj.core/src/minimal_api_clj/core.clj
@@ -1,21 +1,61 @@
(ns minimal-api-clj.core
(:gen-class)
(:require [camel-snake-kebab.core :refer [->kebab-case ->snake_case]]
(:require [bidi.ring :refer [make-handler]]
[camel-snake-kebab.core :refer [->kebab-case ->snake_case]]
[camel-snake-kebab.extras :refer [transform-keys]]
[clojure.string :as str]
[integrant.core :as ig]
[ring.adapter.jetty :as jetty]
[ring.middleware.json :refer [wrap-json-params wrap-json-response]]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
[ring.middleware.params :refer [wrap-params]]
[ring.util.response :as response]))
[ring.util.http-response :as response]))

;;; handlers

(defn hello-world [request]
;; for debug
(clojure.pprint/pprint (:params request))
(response/response {:message "Hello, World!"
:params (:params request)}))
(def todos
(atom {"todo1" {"task" "build an API"}
"todo2" {"task" "?????"}
"todo3" {"task" "profit!"}}))

(defn list-todos [_]
(response/ok @todos))

(defn create-todo [{:keys [params]}]
(let [id (->> (keys @todos)
(map #(-> %
(str/replace-first "todo" "")
Long/parseLong))
(apply max)
inc)
todo-id (str "todo" id)]
(swap! todos assoc todo-id {"task" (:task params)})
(response/created (str "/todos/" todo-id) (get @todos todo-id))))

(defn fetch-todo [{:keys [params]}]
(if-let [todo (get @todos (:todo-id params))]
(response/ok todo)
(response/not-found {:message (str "Todo " (:todo-id params) " doesn't exist")})))

(defn delete-todo [{:keys [params]}]
(if (get @todos (:todo-id params))
(do (swap! todos dissoc (:todo-id params))
(response/no-content))
(response/not-found {:message (str "Todo " (:todo-id params) " doesn't exist")})))

(defn update-todo [{:keys [params]}]
(let [task {"task" (:task params)}]
(swap! todos assoc (:todo-id params) task)
(response/created (str "/todos/" (:todo-id params)) task)))

;;; routes

(defmethod ig/init-key ::routes [_ _]
["/" {"todos" {:get list-todos
:post create-todo}
["todos/" :todo-id] {:get fetch-todo
:delete delete-todo
:put update-todo}}])

;;; middleware

Expand All @@ -26,8 +66,8 @@
handler)]
(transform-keys #(->snake_case % :separator \-) response))))

(defmethod ig/init-key ::app [_ _]
(-> hello-world
(defmethod ig/init-key ::app [_ {:keys [routes]}]
(-> (make-handler routes)
wrap-kebab-case-keys
wrap-keyword-params
wrap-json-params
Expand All @@ -45,7 +85,8 @@
;;; system configuration

(def config
{::app {}
{::routes {}
::app {:routes (ig/ref ::routes)}
::server {:app (ig/ref ::app)
:options {:port 3000
:join? false}}})
Expand Down

0 comments on commit 64ba26b

Please sign in to comment.