Skip to content

Commit

Permalink
Change http server API as per #8
Browse files Browse the repository at this point in the history
  • Loading branch information
Roxolan0 committed Jun 14, 2018
1 parent 3958081 commit f0c0f10
Showing 1 changed file with 50 additions and 29 deletions.
79 changes: 50 additions & 29 deletions src/crux/http_server.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
[crux.kv-store :as kvs]
[crux.query :as q]
[ring.adapter.jetty :as j]
[ring.middleware.params :as p]
[ring.util.request :as req])
(:import [java.io Closeable]))

Expand All @@ -17,33 +18,36 @@
(.getMessage e) "\n"
(ex-data e))})

(defn on-get [kvs db-dir request]
(println (req/path-info request))
(case (req/path-info request)
"/query"
(try
(let [query (edn/read-string (req/body-string request))]
(try
{:status 200
:headers {"Content-Type" "application/edn"}
:body (pr-str (q/q (doc/db kvs) query))}
(catch Exception e
(if (= "Invalid input" (.getMessage e))
(exception-response e 400) ;; Valid edn, invalid query
(exception-response e 500))))) ;; Valid query; something internal failed
(catch Exception e
(exception-response e 400))) ;; Invalid edn
(defn status [kvs db-dir]
{:status 200
:headers {"Content-Type" "application/edn"}
:body (pr-str
{:kv-backend (type kvs)
:estimate-num-keys (kvs/count-keys kvs)
:kv-store-size (cio/folder-human-size db-dir)
:dev-db-size (cio/folder-human-size "dev-storage")})})

;; default: Status
{:status 200
:headers {"Content-Type" "application/edn"}
:body (pr-str
{:kv-backend (type kvs)
:estimate-num-keys (kvs/count-keys kvs)
:kv-store-size (cio/folder-human-size db-dir)
:dev-db-size (cio/folder-human-size "dev-storage")})}))
(defn do-query [kvs request]
(try
(let [query (case (:request-method request)
:get (-> request
:query-params
(find "q")
last
edn/read-string)
:post (edn/read-string (req/body-string request)))]
(try
{:status 200
:headers {"Content-Type" "application/edn"}
:body (pr-str (q/q (doc/db kvs) query))}
(catch Exception e
(if (= "Invalid input" (.getMessage e))
(exception-response e 400) ;; Valid edn, invalid query
(exception-response e 500))))) ;; Valid query; something internal failed
(catch Exception e
(exception-response e 400)))) ;; Invalid edn

(defn on-post [kvs tx-log request] ;; Write
(defn transact [tx-log request]
(try
(let [v (edn/read-string (req/body-string request))
tx-op [:crux.tx/put
Expand All @@ -61,17 +65,34 @@
(catch Exception e
(exception-response e 400)))) ;; Invalid edn

(defn check-path [request valid-paths valid-methods]
(let [path (req/path-info request)
method (:request-method request)]
(and (some #{path} valid-paths)
(some #{method} valid-methods))))

(defn handler [kvs tx-log db-dir request]
(case (:request-method request)
:get (on-get kvs db-dir request)
:post (on-post kvs tx-log request)))
(cond
(check-path request ["/"] [:get])
(status kvs db-dir)

(check-path request ["/q" "/query"] [:get :post])
(do-query kvs request)

(check-path request ["/tx-log"] [:post])
(transact tx-log request)

:default
{:status 400
:headers {"Content-Type" "text/plain"}
:body "Unsupported method on this address."}))

(defn ^Closeable create-server
([kvs tx-log db-dir]
(create-server kvs tx-log 3000))

([kvs tx-log db-dir port]
(let [server (j/run-jetty (partial handler kvs tx-log db-dir)
(let [server (j/run-jetty (p/wrap-params (partial handler kvs tx-log db-dir))
{:port port
:join? false})]
(reify Closeable (close [_] (.stop server))))))

0 comments on commit f0c0f10

Please sign in to comment.