forked from jasonrudolph/one-rep-max
-
Notifications
You must be signed in to change notification settings - Fork 0
/
observer.cljs
60 lines (49 loc) · 3.2 KB
/
observer.cljs
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
(ns ^{:doc "Observe model changes involving the datastore configuration and
trigger side effects as appropriate."}
one.repmax.datastore-configuration.observer
(:require [one.dispatch :as dispatch]
[one.repmax.cookies :as cookies]
[one.repmax.mongohq :as mongo]))
(defmulti do-initialization-step
(fn [& args] (first args)))
(defmethod do-initialization-step :verify-credentials [_ config]
(mongo/find-databases config
#(do
(cookies/set-cookie :api-key (:api-key config))
(cookies/set-cookie :database (:database config))
(dispatch/fire :action {:action :datastore-configuration/credentials-verified, :configuration config}))
#(initialization-error-callback config %)))
(defmethod do-initialization-step :verify-database [_ config]
(mongo/find-database config
#(dispatch/fire :action {:action :datastore-configuration/database-verified, :configuration config})
#(initialization-error-callback config %)))
(defmethod do-initialization-step :verify-collections [_ config]
(mongo/find-collections config
#(find-collections-success-callback config %)
#(initialization-error-callback config %)))
(defmethod do-initialization-step :ready [_ _]
(dispatch/fire :action {:action :datastore-configuration/ready}))
;; No-op. No action necessary when we transition to the :initialization-failed state.
(defmethod do-initialization-step :default [_ _])
;; TODO Enhance function to recurse through the list of necessary collections
;; and create each one. Fire action :datastore-configuration/collections-verified.
(defn find-collections-success-callback [config collections]
(if (contains-collection? collections "exercises") ;; TODO Get collection name from elsewhere
(dispatch/fire :action {:action :datastore-configuration/collections-verified, :configuration config})
(mongo/create-collection config "exercises" ;; TODO Get collection name from elsewhere
#(dispatch/fire :action {:action :datastore-configuration/collections-verified, :configuration config})
#(dispatch/fire :action {:action :datastore-configuration/initialization-failed, :configuration config}))))
(defn contains-collection? [collections collection-name]
(some #(= collection-name (% "name")) collections))
(defn initialization-error-callback [config response]
(dispatch/fire :action {:action :datastore-configuration/initialization-failed
:configuration config
:error response}))
;;; Register reactors
(dispatch/react-to #{:model-change}
(fn [_ event]
(let [old-config-state (-> event :old :datastore-configuration :state)
new-config-state (-> event :new :datastore-configuration :state)]
(if-not (= old-config-state new-config-state)
(let [config (dissoc (-> event :new :datastore-configuration) :state)]
(do-initialization-step new-config-state config))))))