-
Notifications
You must be signed in to change notification settings - Fork 3
/
collections.clj
77 lines (65 loc) · 2.51 KB
/
collections.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(ns fcms.representations.collections
(:require [cheshire.core :as json]
[clj-time.format :refer (unparse)]
[fcms.resources.common :refer (timestamp-format)]
[fcms.representations.common :as common]
[fcms.resources.collection :as collection]
[fcms.resources.item :refer (item-media-type)]))
(def ordered-keys [:name :created-at :updated-at :slug :description])
(defn- url
([coll]
(str "/" (:slug coll)))
([coll suffix]
(str "/" (:slug coll) suffix)))
(defn- self-link [coll]
(common/self-link (url coll) collection/collection-media-type))
(defn- contains-link [coll]
(common/link-map "contains" common/GET (url coll "/") item-media-type))
(defn- create-link [coll]
(common/create-link (url coll "/") item-media-type))
(defn- update-link [coll]
(common/update-link (url coll) collection/collection-media-type))
(defn- delete-link [coll]
(common/delete-link (url coll)))
(defn collection-links
"Add the HATEAOS links to the collection"
[coll]
(apply array-map (concat (flatten (vec coll)) [:links [
(self-link coll)
(contains-link coll)
(create-link coll)
(update-link coll)
(delete-link coll)]])))
(defn- collection-list-links
"Array of HATEAOS links for the item list"
[]
[(common/create-link (str "/") collection/collection-media-type)])
(defn- collection-to-json-map [coll]
;; Generate JSON from the sorted array map that results from:
;; 1) removing unneeded :id key
;; 2) render timestamps as strings
;; 3) making an ordered array hash of the known ordered keys
;; 4) adding a sorted hash of any remaining keys
;; 5) adding the HATEAOS links to the array hash
(let [coll-props (dissoc coll :id)]
(-> coll-props
(update-in [:created-at] #(unparse timestamp-format %))
(update-in [:updated-at] #(unparse timestamp-format %))
(common/ordered ordered-keys)
(common/append-sorted (common/remaining-keys coll-props ordered-keys))
collection-links)))
;; TODO collection list links
(defn render-collections
"Create a JSON representation of a group of collections for the REST API"
[collections]
(json/generate-string {
:collection (array-map
:version common/json-collection-version
:href "/"
:links (collection-list-links)
:collections (map collection-to-json-map collections))}
{:pretty true}))
(defn render-collection
"Create a JSON representation of a collection for the REST API"
[coll]
(json/generate-string (collection-to-json-map coll) {:pretty true}))