|
| 1 | +(ns otus-14.core |
| 2 | + (:require [ring.adapter.jetty :refer [run-jetty]] |
| 3 | + [ring.handler.dump :refer [handle-dump]] |
| 4 | + [ring.util.response :refer [redirect]] |
| 5 | + [ring.middleware.reload :refer [wrap-reload]] |
| 6 | + [ring.middleware.params :refer [wrap-params]] |
| 7 | + [ring.middleware.keyword-params :refer [wrap-keyword-params]] |
| 8 | + [compojure.core :refer :all] |
| 9 | + [compojure.route :as route] |
| 10 | + [compojure.coercions :refer [as-int]] |
| 11 | + [hiccup.core :refer [html]] |
| 12 | + [hiccup.util :refer [url]] |
| 13 | + [cheshire.core :refer [generate-string]]) |
| 14 | + (:gen-class)) |
| 15 | + |
| 16 | +;; * handler |
| 17 | + |
| 18 | +(defn handler [req] |
| 19 | + {:status 200 |
| 20 | + :body "Hello world!"}) |
| 21 | + |
| 22 | +(def app |
| 23 | + (-> #'handler |
| 24 | + wrap-keyword-params |
| 25 | + wrap-params)) |
| 26 | + |
| 27 | +;; * huccup |
| 28 | + |
| 29 | +(defn page [title & body] |
| 30 | + [:html |
| 31 | + [:head |
| 32 | + [:title title]] |
| 33 | + [:body |
| 34 | + body]]) |
| 35 | + |
| 36 | +(defn handler [req] |
| 37 | + {:status 200 |
| 38 | + :headers {"Content-Type" "text/html"} |
| 39 | + :body |
| 40 | + (html |
| 41 | + (page |
| 42 | + "Index" |
| 43 | + [:h1 {:style "color: red;"} "Hello world!"] |
| 44 | + [:ul |
| 45 | + (map (fn [x] |
| 46 | + [:li (str x)]) |
| 47 | + (range 10))]))}) |
| 48 | + |
| 49 | +;; * compojure |
| 50 | + |
| 51 | +(defn greet-page [name] |
| 52 | + (html |
| 53 | + (page |
| 54 | + "greet" |
| 55 | + (if (nil? name) |
| 56 | + [:form {:method "POST"} |
| 57 | + [:label "Name"] |
| 58 | + [:input {:name "name"}] |
| 59 | + [:button {:type "submit"} "Greet"]] |
| 60 | + [:h1 (str "Hello, " name "!")])))) |
| 61 | + |
| 62 | +(defroutes router |
| 63 | + (GET "/" [] |
| 64 | + (html |
| 65 | + (page |
| 66 | + "Index" |
| 67 | + [:h1 "Hello world!"]))) |
| 68 | + |
| 69 | + (GET "/greet" [name] (greet-page name)) |
| 70 | + |
| 71 | + (POST "/greet" [name] |
| 72 | + (redirect (str (url "/greet" {:name name})))) |
| 73 | + |
| 74 | + (GET "/dump" req |
| 75 | + (handle-dump req)) |
| 76 | + |
| 77 | + (GET "/json-dump" [] |
| 78 | + {:headers {"Content-Type" "application/json"} |
| 79 | + :body |
| 80 | + (generate-string |
| 81 | + {:users |
| 82 | + [{:name "Bob" |
| 83 | + :admin false |
| 84 | + :pets [{:name "Tom" |
| 85 | + :age 4}]}]})}) |
| 86 | + |
| 87 | + (GET "/add" [x :<< as-int |
| 88 | + y :<< as-int] |
| 89 | + (html [:h1 (+ x y)])) |
| 90 | + |
| 91 | + (GET "/blog/:user-id/post/:post-id" [user-id post-id] |
| 92 | + (handle-dump {:user-id user-id |
| 93 | + :post-id post-id})) |
| 94 | + |
| 95 | + (route/not-found |
| 96 | + (html |
| 97 | + (page |
| 98 | + "Page not found" |
| 99 | + [:h1 "Oops!"])))) |
| 100 | + |
| 101 | +(def app |
| 102 | + (-> #'router |
| 103 | + wrap-keyword-params |
| 104 | + wrap-params)) |
| 105 | + |
| 106 | +;; * Jetty |
| 107 | + |
| 108 | +(comment |
| 109 | + (run-jetty #'app {:join? false |
| 110 | + :port 8000}) |
| 111 | + ) |
| 112 | + |
| 113 | +(defn -main |
| 114 | + "I don't do a whole lot ... yet." |
| 115 | + [& args] |
| 116 | + (run-jetty |
| 117 | + (wrap-reload app) |
| 118 | + {:port 8000})) |
0 commit comments