Skip to content

Commit 9de1462

Browse files
committed
add book API
1 parent bde3c58 commit 9de1462

File tree

5 files changed

+84
-2
lines changed

5 files changed

+84
-2
lines changed

clojure/resultful-crud/schema.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@ CREATE TABLE "user" (
33
username VARCHAR(50) UNIQUE NOT NULL,
44
email VARCHAR(255) UNIQUE NOT NULL,
55
password_hash TEXT NOT NULL
6+
);
7+
8+
CREATE TABLE book (
9+
id SERIAL PRIMARY KEY,
10+
title VARCHAR(100) NOT NULL,
11+
year_published INTEGER NOT NULL
612
);
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
(ns resultful-crud.book
2+
(:require [schema.core :as s]
3+
[resultful-crud.models.book :refer [Book]]
4+
[toucan.db :as db]
5+
[ring.util.http-response :refer [ok not-found created]]
6+
[compojure.api.sweet :refer [GET POST PUT DELETE]]
7+
[resultful-crud.string-util :as str]))
8+
9+
(defn valid-book-title? [title]
10+
(str/non-blank-with-max-length? 100 title))
11+
12+
(defn valid-year-published? [year]
13+
(<= 2000 year 2018))
14+
15+
(s/defschema BookRequestSchema
16+
{:title (s/constrained s/Str valid-book-title?)
17+
:year_published (s/constrained s/Int valid-year-published?)})
18+
19+
(defn id->created [id]
20+
(created (str "/books/" id) {:id id}))
21+
22+
(defn create-book-handler [create-book-req]
23+
(-> (db/insert! Book create-book-req)
24+
:id
25+
id->created))
26+
27+
(defn delete-book-handler [book-id]
28+
(db/delete! Book :id book-id)
29+
(ok))
30+
31+
(defn get-books-handler []
32+
(ok (db/select Book)))
33+
34+
(defn book->response [book]
35+
(if book
36+
(ok book)
37+
(not-found)))
38+
39+
(defn get-book-handler [book-id]
40+
(-> (Book book-id)
41+
book->response))
42+
43+
(defn update-book-handler [id update-book-req]
44+
(db/update! Book id update-book-req)
45+
(ok))
46+
47+
(def book-routes
48+
[(POST "/books" []
49+
:body [create-book-req BookRequestSchema]
50+
(create-book-handler create-book-req))
51+
(GET "/books" []
52+
(get-books-handler))
53+
(GET "/books/:id" []
54+
:path-params [id :- s/Int]
55+
(get-book-handler id))
56+
(PUT "/books/:id" []
57+
:path-params [id :- s/Int]
58+
:body [update-book-req BookRequestSchema]
59+
(update-book-handler id update-book-req))
60+
(DELETE "/books/:id" []
61+
:path-params [id :- s/Int]
62+
(delete-book-handler id))])

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +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]])
6+
[resultful-crud.user :refer [user-routes]]
7+
[resultful-crud.book :refer [book-routes]])
78
(:gen-class))
89

910
(def db-spec
@@ -18,7 +19,7 @@
1819
:options {:ui {:validatorUrl nil}
1920
:data {:info {:version "1.0.0", :title "Restful CRUD API"}}}})
2021

21-
(def app (api {:swagger swagger-config} (apply routes user-routes)))
22+
(def app (api {:swagger swagger-config} (apply routes (concat user-routes book-routes))))
2223

2324
(defn -main
2425
[& args]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(ns resultful-crud.models.book
2+
(:require [toucan.models :refer [defmodel]]))
3+
4+
(defmodel Book :book)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
(ns resultful-crud.restful
2+
(:require [compojure.api.sweet :refer [routes]]))
3+
4+
(defn create-route [{:keys [name model req-schema]}]
5+
42)
6+
7+
(defn resource [resource-config]
8+
(routes
9+
(create-route resource-config)))

0 commit comments

Comments
 (0)