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