Bladeren bron

Add a basic API.

`/` provides a feed of the complete list, `/current` and `/past` give
current and past items, `/:item-name` allows display, creation, editing
and deletion of individual items.
Lucas Stadler 13 jaren geleden
bovenliggende
commit
1b44189d64
1 gewijzigde bestanden met toevoegingen van 34 en 2 verwijderingen
  1. 34 2
      clj/shame.clj

+ 34 - 2
clj/shame.clj

@ -6,7 +6,9 @@
6 6
  (:use ring.util.response)
7 7
  (:use ring.middleware.reload)
8 8
  (:use ring.middleware.stacktrace)
9
  (:use [ring.middleware.format-response :only [wrap-restful-response]]))
9
  (:use [ring.middleware.format-response :only [wrap-restful-response]])
10
  (:use [ring.middleware.format-params :only [wrap-restful-params]]))
11
10 12
11 13
; roadmap:
12 14
;  1. implement add-item, resurrect-item, close-item
@ -77,13 +79,43 @@
77 79
(dosync
78 80
  (ref-set *shaming* (read-shame "self.todo.json")))
79 81
82
(defn take-n [start amount coll]
83
  (take amount (drop start coll)))
84
85
(defn int-param [param & [default]]
86
  "Parse an integer from a string, with an optional default value (which defaults to 0)."
87
  (try (Integer/valueOf (or param default 0))
88
    (catch NumberFormatException n (or default 0))))
89
90
(defn filter-keys [map keys]
91
  (reduce-kv #(if (some (fn [k] (= k %2)) keys)
92
                (assoc %1 %2 %3)
93
                %1)
94
             {} map))
95
80 96
(defroutes shame-routes
81 97
  (GET "/" [] (response @*shaming*))
82
  (GET "/current" [] (response (:current @*shaming*)))
98
  (POST "/" [item] (dosync (ref-set *shaming*
99
                                      (add-item item @*shaming*))))
100
  (GET "/current" [start limit]
101
       (response
102
         (take-n (int-param start) (int-param limit 10) (:current @*shaming*))))
103
  (GET "/past" [start limit]
104
       (response
105
         (take-n (int-param start) (int-param limit 10) (:past @*shaming*))))
106
  (GET "/:item-name" [item-name] (response (get-by (:current @*shaming*)
107
                                         :name item-name)))
108
  (PUT "/:item-name" [item-name :as {params :params}] ; changes should be in the body?
109
       (dosync (ref-set *shaming*
110
                        (change-item item-name (filter-keys params [:name])  @*shaming*))))
111
  (DELETE "/:item-name" [item-name status]
112
          (dosync (ref-set *shaming*
113
                           (close-item item-name (or status "failed") @*shaming*))))
83 114
  (route/not-found "404 - Alternate Reality Monsters"))
84 115
85 116
(def serve
86 117
  (-> (handler/site shame-routes)
87 118
    (wrap-reload {:dirs ["."]})
88 119
    (wrap-stacktrace)
120
    (wrap-restful-params)
89 121
    (wrap-restful-response)))