-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.clj
83 lines (73 loc) · 2.5 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(ns liberator.resource.discovery.core
(:require
[halboy.resource :as hal]
[hype.core :as hype]
[liberator.mixin.core :as lm-core]
[liberator.mixin.util :as lm-util]
[liberator.mixin.json.core :as json-mixin]
[liberator.mixin.hypermedia.core :as hypermedia-mixin]
[liberator.mixin.hal.core :as hal-mixin]))
(defn- link-definition-fn
[link-name link-definition]
(let [route-name (:route-name link-definition)
params (dissoc link-definition :route-name)
templated?
(or
(contains? params :path-template-params)
(contains? params :query-template-params))
templated-map
(if templated? {:templated true} {})]
(fn [{:keys [request router]}]
{link-name
(merge templated-map
{:href
(hype/absolute-url-for request router route-name params)})})))
(defn- link-definition-fns
[link-definitions]
(let [link-definitions
(if (map? link-definitions)
(mapv
(fn [[link-name link-definition]]
(merge {:link-name link-name} link-definition))
link-definitions)
link-definitions)]
(mapv
(fn [link-definition]
(cond
(map? link-definition)
(link-definition-fn
(get link-definition :link-name
(get link-definition :route-name))
link-definition)
(keyword? link-definition)
(link-definition-fn
link-definition
{:route-name link-definition})
:else link-definition))
link-definitions)))
(defn definitions
([_]
{:link-definitions {}
:self-link
(fn [{:keys [request router]}]
(hype/absolute-url-for request router :discovery))
:handle-ok
(fn [context]
(let [self-link (lm-util/resource-attribute-as-value context :self-link)
link-definitions
(lm-util/resource-attribute-as-value context :link-definitions)
link-definitions (link-definition-fns link-definitions)
link-maps (mapv #(% context) link-definitions)
links (apply merge link-maps)]
(cond-> (hal/new-resource self-link)
(some? links)
(hal/add-links links))))}))
(defn handler
([dependencies] (handler dependencies {}))
([dependencies overrides]
(lm-core/build-resource
(json-mixin/with-json-mixin dependencies)
(hypermedia-mixin/with-hypermedia-mixin dependencies)
(hal-mixin/with-hal-mixin dependencies)
(definitions dependencies)
overrides)))