prefix -> namespace, created default-ns namespace for subscriptions
This commit is contained in:
parent
e263ed10c6
commit
99f2ba61a4
|
@ -1,7 +1,7 @@
|
|||
(ns views.base-subscribed-views
|
||||
(:require
|
||||
[views.db.load :refer [initial-views]]
|
||||
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn prefix-fn]]
|
||||
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn namespace-fn]]
|
||||
[views.subscriptions :as vs :refer [add-subscriptions! remove-subscription! subscriptions-for]]
|
||||
[clojure.tools.logging :refer [debug info warn error]]
|
||||
[clojure.core.async :refer [put! <! go thread]]))
|
||||
|
@ -51,8 +51,8 @@
|
|||
view-sigs (view-filter sub-req (:views sub-req) templates opts)] ; this is where security comes in.
|
||||
(info "Subscribing views: " view-sigs " for subscriber " subscriber-key)
|
||||
(when (seq view-sigs)
|
||||
(let [subbed-views (if-let [prefix (prefix-fn this sub-req)]
|
||||
(add-subscriptions! subscriber-key view-sigs templates prefix)
|
||||
(let [subbed-views (if-let [namespace (namespace-fn this sub-req)]
|
||||
(add-subscriptions! subscriber-key view-sigs templates namespace)
|
||||
(add-subscriptions! subscriber-key view-sigs templates))]
|
||||
(thread
|
||||
(->> (initial-views db view-sigs templates subbed-views)
|
||||
|
@ -63,21 +63,21 @@
|
|||
(let [subscriber-key (subscriber-key-fn this unsub-req)
|
||||
view-sigs (:views unsub-req)]
|
||||
(info "Unsubscribing views: " view-sigs " for subscriber " subscriber-key)
|
||||
(if-let [prefix (prefix-fn this unsub-req)]
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs prefix))
|
||||
(if-let [namespace (namespace-fn this unsub-req)]
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs namespace))
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs)))))
|
||||
|
||||
(disconnect [this disconnect-req]
|
||||
(let [subscriber-key (:subscriber-key disconnect-req)
|
||||
prefix (prefix-fn this disconnect-req)
|
||||
view-sigs (if prefix (subscriptions-for subscriber-key prefix) (subscriptions-for subscriber-key))]
|
||||
(if prefix
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs prefix))
|
||||
namespace (namespace-fn this disconnect-req)
|
||||
view-sigs (if namespace (subscriptions-for subscriber-key namespace) (subscriptions-for subscriber-key))]
|
||||
(if namespace
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs namespace))
|
||||
(doseq [vs view-sigs] (remove-subscription! subscriber-key vs)))))
|
||||
|
||||
(subscriber-key-fn [this msg] (:subscriber-key msg))
|
||||
|
||||
(prefix-fn [this msg] nil)
|
||||
(namespace-fn [this msg] nil)
|
||||
|
||||
;; DB interaction
|
||||
(subscribed-views [this] @vs/compiled-views)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
(unsubscribe-views [this unsub-request])
|
||||
(disconnect [this disconnect-request])
|
||||
(subscriber-key-fn [this msg])
|
||||
(prefix-fn [this msg])
|
||||
(namespace-fn [this msg])
|
||||
|
||||
;; DB interaction
|
||||
(broadcast-deltas [this db views-with-deltas])
|
||||
|
|
|
@ -7,12 +7,14 @@
|
|||
;;
|
||||
;; or
|
||||
;;
|
||||
;; {prefix {[:view-sig 1 "arg2"] {:keys [1 2 3 4 ... ] :view-map {:view ...}}}}
|
||||
;; {namespace {[:view-sig 1 "arg2"] {:keys [1 2 3 4 ... ] :view-map {:view ...}}}}
|
||||
;;
|
||||
|
||||
(def subscribed-views (atom {}))
|
||||
(def compiled-views (atom {}))
|
||||
|
||||
(def default-ns :default-ns)
|
||||
|
||||
(defn- add-subscriber-key
|
||||
[subscriber-key]
|
||||
(fn [view-subs]
|
||||
|
@ -26,59 +28,50 @@
|
|||
|
||||
(defn add-subscription!
|
||||
([subscriber-key view-sig templates]
|
||||
(swap! subscribed-views #(update-in % [view-sig] (add-subscriber-key subscriber-key)))
|
||||
(add-compiled-view! view-sig templates))
|
||||
([subscriber-key view-sig templates prefix]
|
||||
(swap! subscribed-views #(update-in % [prefix view-sig] (add-subscriber-key subscriber-key)))
|
||||
(add-subscription! subscriber-key view-sig templates default-ns))
|
||||
([subscriber-key view-sig templates namespace]
|
||||
(swap! subscribed-views #(update-in % [namespace view-sig] (add-subscriber-key subscriber-key)))
|
||||
(add-compiled-view! view-sig templates)))
|
||||
|
||||
(defn add-subscriptions!
|
||||
([subscriber-key view-sigs templates]
|
||||
(add-subscriptions! subscriber-key view-sigs templates nil))
|
||||
([subscriber-key view-sigs templates prefix]
|
||||
(last (mapv
|
||||
#(if prefix
|
||||
(add-subscription! subscriber-key % templates prefix)
|
||||
(add-subscription! subscriber-key % templates))
|
||||
view-sigs))))
|
||||
(add-subscriptions! subscriber-key view-sigs templates default-ns))
|
||||
([subscriber-key view-sigs templates namespace]
|
||||
(last (mapv #(add-subscription! subscriber-key % templates namespace) view-sigs))))
|
||||
|
||||
(defn subscriptions-for
|
||||
([subscriber-key]
|
||||
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] @subscribed-views))
|
||||
([subscriber-key prefix]
|
||||
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] (get @subscribed-views prefix))))
|
||||
([subscriber-key] (subscriptions-for subscriber-key default-ns))
|
||||
([subscriber-key namespace]
|
||||
(reduce #(if (contains? (second %2) subscriber-key) (conj %1 (first %2)) %1) [] (get @subscribed-views namespace))))
|
||||
|
||||
(defn subscribed-to
|
||||
([view-sig]
|
||||
(get @subscribed-views view-sig))
|
||||
([view-sig prefix]
|
||||
(get-in @subscribed-views [prefix view-sig])))
|
||||
([view-sig] (subscribed-to view-sig default-ns))
|
||||
([view-sig namespace]
|
||||
(get-in @subscribed-views [namespace view-sig])))
|
||||
|
||||
(defn subscribed-to?
|
||||
([subscriber-key view-sig]
|
||||
(subscribed-to? subscriber-key view-sig nil))
|
||||
([subscriber-key view-sig prefix]
|
||||
(if-let [view-subs (if prefix (subscribed-to view-sig prefix) (subscribed-to view-sig))]
|
||||
(subscribed-to? subscriber-key view-sig default-ns))
|
||||
([subscriber-key view-sig namespace]
|
||||
(if-let [view-subs (subscribed-to view-sig namespace)]
|
||||
(view-subs subscriber-key))))
|
||||
|
||||
(defn- remove-key-or-view
|
||||
[subscriber-key view-sig prefix]
|
||||
[subscriber-key view-sig namespace]
|
||||
(fn [subbed-views]
|
||||
(let [path (if prefix [prefix view-sig] [view-sig])
|
||||
(let [path [namespace view-sig]
|
||||
updated (update-in subbed-views path disj subscriber-key)]
|
||||
(if (seq (get-in updated path))
|
||||
updated
|
||||
(do (swap! compiled-views dissoc view-sig) ; remove the compiled view as well
|
||||
(if prefix
|
||||
(update-in updated [prefix] dissoc view-sig)
|
||||
(dissoc updated view-sig)))))))
|
||||
(update-in updated [namespace] dissoc view-sig))))))
|
||||
|
||||
(defn remove-subscription!
|
||||
([subscriber-key view-sig]
|
||||
(remove-subscription! subscriber-key view-sig nil))
|
||||
([subscriber-key view-sig prefix]
|
||||
(when (subscribed-to? subscriber-key view-sig (if prefix prefix))
|
||||
(swap! subscribed-views (remove-key-or-view subscriber-key view-sig prefix)))))
|
||||
(remove-subscription! subscriber-key view-sig default-ns))
|
||||
([subscriber-key view-sig namespace]
|
||||
(when (subscribed-to? subscriber-key view-sig namespace)
|
||||
(swap! subscribed-views (remove-key-or-view subscriber-key view-sig namespace)))))
|
||||
|
||||
(defn compiled-view-for
|
||||
[view-sig]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
(ns views.base-subscribed-views-test
|
||||
(:require
|
||||
[views.base-subscribed-views :as bsv] ; :refer [BaseSubscribedViews]]
|
||||
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn prefix-fn subscribe-views unsubscribe-views disconnect]]
|
||||
[views.subscribed-views :refer [SubscribedViews subscriber-key-fn namespace-fn subscribe-views unsubscribe-views disconnect]]
|
||||
[views.subscriptions :as vs :refer [subscribed-to?]]
|
||||
[views.fixtures :as vf]
|
||||
[clojure.test :refer [use-fixtures deftest is]]
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
(vs/add-subscription! key view-sig templates)
|
||||
(is (vs/subscribed-to? key view-sig))))
|
||||
|
||||
(deftest can-use-prefix
|
||||
(let [prefix1 1, prefix2 2, key 1, view-sig [:user-posts 1]]
|
||||
(vs/add-subscription! key view-sig templates prefix1)
|
||||
(vs/add-subscription! key view-sig templates prefix2)
|
||||
(is (vs/subscribed-to? key view-sig prefix1))
|
||||
(is (vs/subscribed-to? key view-sig prefix2))))
|
||||
(deftest can-use-namespace
|
||||
(let [namespace1 1, namespace2 2, key 1, view-sig [:user-posts 1]]
|
||||
(vs/add-subscription! key view-sig templates namespace1)
|
||||
(vs/add-subscription! key view-sig templates namespace2)
|
||||
(is (vs/subscribed-to? key view-sig namespace1))
|
||||
(is (vs/subscribed-to? key view-sig namespace2))))
|
||||
|
||||
(deftest removes-a-subscription
|
||||
(let [key 1, view-sig [:user-posts 1]]
|
||||
|
@ -33,19 +33,19 @@
|
|||
(vs/remove-subscription! 1 [:user-posts 1])
|
||||
(is (= {} @vs/subscribed-views)))
|
||||
|
||||
(deftest removes-a-subscription-with-prefix
|
||||
(let [prefix1 1, prefix2 2, key 1, view-sig [:user-posts 1]]
|
||||
(vs/add-subscription! key view-sig templates prefix1)
|
||||
(vs/add-subscription! key view-sig templates prefix2)
|
||||
(vs/remove-subscription! key view-sig prefix1)
|
||||
(is (not (vs/subscribed-to? key view-sig prefix1)))
|
||||
(is (vs/subscribed-to? key view-sig prefix2))))
|
||||
(deftest removes-a-subscription-with-namespace
|
||||
(let [namespace1 1, namespace2 2, key 1, view-sig [:user-posts 1]]
|
||||
(vs/add-subscription! key view-sig templates namespace1)
|
||||
(vs/add-subscription! key view-sig templates namespace2)
|
||||
(vs/remove-subscription! key view-sig namespace1)
|
||||
(is (not (vs/subscribed-to? key view-sig namespace1)))
|
||||
(is (vs/subscribed-to? key view-sig namespace2))))
|
||||
|
||||
(deftest removes-unsubscribed-to-view-from-subscribed-views
|
||||
(let [key 1, view-sig [:user-posts 1]]
|
||||
(vs/add-subscription! key view-sig templates)
|
||||
(vs/remove-subscription! key view-sig)
|
||||
(is (= {} @vs/subscribed-views))))
|
||||
(is (= {:default-ns {}} @vs/subscribed-views))))
|
||||
|
||||
(deftest adds-multiple-views-at-a-time
|
||||
(let [key 1, view-sigs [[:user-posts 1] [:user-posts 2]]]
|
||||
|
@ -70,7 +70,7 @@
|
|||
(vs/add-subscriptions! key view-sigs templates)
|
||||
(is (= (set (vs/subscriptions-for 1)) (set view-sigs)))))
|
||||
|
||||
(deftest retrieves-subscriptions-for-subscriber-with-prefix
|
||||
(let [key 1, view-sigs [[:users][:user-posts 1]] prefix 1]
|
||||
(vs/add-subscriptions! key view-sigs templates prefix)
|
||||
(is (= (set (vs/subscriptions-for 1 prefix)) (set view-sigs)))))
|
||||
(deftest retrieves-subscriptions-for-subscriber-with-namespace
|
||||
(let [key 1, view-sigs [[:users][:user-posts 1]] namespace 1]
|
||||
(vs/add-subscriptions! key view-sigs templates namespace)
|
||||
(is (= (set (vs/subscriptions-for 1 namespace)) (set view-sigs)))))
|
||||
|
|
Loading…
Reference in a new issue