Skip to content

Commit 224e323

Browse files
committed
add restful abstraction
1 parent 9de1462 commit 224e323

File tree

4 files changed

+80
-9
lines changed

4 files changed

+80
-9
lines changed

clojure/resultful-crud/src/resultful_crud/book.clj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(:require [schema.core :as s]
33
[resultful-crud.models.book :refer [Book]]
44
[toucan.db :as db]
5+
[resultful-crud.restful :as restful]
56
[ring.util.http-response :refer [ok not-found created]]
67
[compojure.api.sweet :refer [GET POST PUT DELETE]]
78
[resultful-crud.string-util :as str]))
@@ -59,4 +60,9 @@
5960
(update-book-handler id update-book-req))
6061
(DELETE "/books/:id" []
6162
:path-params [id :- s/Int]
62-
(delete-book-handler id))])
63+
(delete-book-handler id))])
64+
65+
(def book-entity-route
66+
(restful/resource {:model Book
67+
:name "books"
68+
:req-schema BookRequestSchema}))

clojure/resultful-crud/src/resultful_crud/core.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
[toucan.db :as db]
44
[toucan.models :as models]
55
[compojure.api.sweet :refer [api routes]]
6-
[resultful-crud.user :refer [user-routes]]
7-
[resultful-crud.book :refer [book-routes]])
6+
[resultful-crud.user :refer [user-entity-route]]
7+
[resultful-crud.book :refer [book-entity-route]])
88
(:gen-class))
99

1010
(def db-spec
@@ -19,7 +19,9 @@
1919
:options {:ui {:validatorUrl nil}
2020
:data {:info {:version "1.0.0", :title "Restful CRUD API"}}}})
2121

22-
(def app (api {:swagger swagger-config} (apply routes (concat user-routes book-routes))))
22+
; (def app (api {:swagger swagger-config} (apply routes (concat user-routes book-routes))))
23+
24+
(def app (api {:swagger swagger-config} (apply routes book-entity-route user-entity-route)))
2325

2426
(defn -main
2527
[& args]
Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,64 @@
11
(ns resultful-crud.restful
2-
(:require [compojure.api.sweet :refer [routes]]))
2+
(:require [compojure.api.sweet :refer [GET POST PUT DELETE routes]]
3+
[toucan.db :as db]
4+
[schema.core :as s]
5+
[ring.util.http-response :refer [ok not-found created]]))
36

4-
(defn create-route [{:keys [name model req-schema]}]
5-
42)
7+
(defn id->created [id]
8+
(created (str "/users/" id) {:id id}))
9+
10+
(defn create-route [{:keys [name model req-schema enter]}]
11+
(let [enter-interceptor (or enter identity)
12+
path (str "/" name)]
13+
(POST path http-req
14+
:body [req-body req-schema]
15+
(->> (enter-interceptor req-body)
16+
(db/insert! model)
17+
:id
18+
id->created))))
19+
20+
(defn entity->response [entity]
21+
(if entity
22+
(ok entity)
23+
(not-found)))
24+
25+
(defn get-by-id-route [{:keys [name model leave]}]
26+
(let [leave-interceptor (or leave identity)
27+
path (str "/" name "/:id")]
28+
(GET path []
29+
:path-params [id :- s/Int]
30+
(-> (model id)
31+
leave-interceptor
32+
entity->response))))
33+
34+
(defn get-all-route [{:keys [name model leave]}]
35+
(let [leave-interceptor (or leave identity)
36+
path (str "/" name)]
37+
(GET path []
38+
(->> (db/select model)
39+
(map leave-interceptor)
40+
ok))))
41+
42+
(defn update-route [{:keys [name model req-schema enter]}]
43+
(let [enter-interceptor (or enter identity)
44+
path (str "/" name "/:id")]
45+
(PUT path http-req
46+
:path-params [id :- s/Int]
47+
:body [req-body req-schema]
48+
(db/update! model id (enter-interceptor req-body))
49+
(ok))))
50+
51+
(defn delete-route [{:keys [name model]}]
52+
(let [path (str "/" name "/:id")]
53+
(DELETE path []
54+
:path-params [id :- s/Int]
55+
(db/delete! model :id id)
56+
(ok))))
657

758
(defn resource [resource-config]
859
(routes
9-
(create-route resource-config)))
60+
(create-route resource-config)
61+
(get-by-id-route resource-config)
62+
(get-all-route resource-config)
63+
(update-route resource-config)
64+
(delete-route resource-config)))

clojure/resultful-crud/src/resultful_crud/user.clj

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
[buddy.hashers :as hashers]
55
[clojure.set :refer [rename-keys]]
66
[toucan.db :as db]
7+
[resultful-crud.restful :as restful]
78
[ring.util.http-response :refer [ok not-found created]]
89
[compojure.api.sweet :refer [GET POST PUT DELETE]]
910
[resultful-crud.string-util :as str]))
@@ -70,4 +71,11 @@
7071
(update-user-handler id update-user-req))
7172
(DELETE "/users/:id" []
7273
:path-params [id :- s/Int]
73-
(delete-user-handler id))])
74+
(delete-user-handler id))])
75+
76+
(def user-entity-route
77+
(restful/resource {:model User
78+
:name "users"
79+
:req-schema UserRequestSchema
80+
:leave #(dissoc % :password_hash)
81+
:enter canonicalize-user-req}))

0 commit comments

Comments
 (0)