/
core.clj
61 lines (56 loc) · 2.05 KB
/
core.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
(ns liberator-hal.discovery-resource.core
(:require
[halboy.resource :as hal]
[hype.core :as hype]
[liberator-mixin.core :as mixin]
[liberator-mixin.json.core :as json-mixin]
[liberator-mixin.hypermedia.core :as hypermedia-mixin]
[liberator-mixin.hal.core :as hal-mixin]))
(def ^:dynamic *default-links* [:ping :health])
(defn- normalise-links
[links]
(letfn [(->link-definition [l link-name]
(merge l {link-name {:route-name link-name}}))]
(cond
(false? links) {}
(map? links) links
:else (reduce ->link-definition {} links))))
(defn- add-link
[resource request routes link-name
{:keys [route-name] :as options}]
(let [params (dissoc options :route-name)
templated? (or
(contains? params :path-template-params)
(contains? params :query-template-params))
href (hype/absolute-url-for request routes route-name params)
templated-map (if templated? {:templated true} {})
href-map {:href href}]
(hal/add-link resource link-name
(merge templated-map href-map))))
(defn definitions
([dependencies] (definitions dependencies {}))
([{:keys [routes]}
{:keys [links
defaults]
:or {links {}
defaults *default-links*}}]
{:handle-ok
(fn [{:keys [request]}]
(let [links (merge
(normalise-links defaults)
(normalise-links links))
resource (hal/new-resource
(hype/absolute-url-for request routes :discovery))
resource (reduce
(fn [r [name options]]
(add-link r request routes name options))
resource links)]
resource))}))
(defn resource-handler
([dependencies] (resource-handler dependencies {}))
([dependencies options]
(mixin/build-resource
(json-mixin/with-json-mixin dependencies)
(hypermedia-mixin/with-hypermedia-mixin dependencies)
(hal-mixin/with-hal-mixin dependencies)
(definitions dependencies options))))