Merge pull request #56 from ebaxt/session-store
Made it possbile to pass explisit db to session-store
This commit is contained in:
commit
a04596cdc5
3 changed files with 95 additions and 13 deletions
|
|
@ -1,8 +1,10 @@
|
||||||
(ns monger.ring.session-store
|
(ns monger.ring.session-store
|
||||||
(:require [ring.middleware.session.store :as ringstore]
|
(:require [ring.middleware.session.store :as ringstore]
|
||||||
[monger.collection :as mc])
|
[monger.multi.collection :as mc]
|
||||||
|
[monger.core :as mg])
|
||||||
(:use monger.conversion)
|
(:use monger.conversion)
|
||||||
(:import [java.util UUID Date]
|
(:import [java.util UUID Date]
|
||||||
|
[com.mongodb DB]
|
||||||
ring.middleware.session.store.SessionStore))
|
ring.middleware.session.store.SessionStore))
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
@ -23,7 +25,7 @@
|
||||||
;; data structure Clojure reader can serialize and read but won't make the data useful to applications
|
;; data structure Clojure reader can serialize and read but won't make the data useful to applications
|
||||||
;; in other languages.
|
;; in other languages.
|
||||||
|
|
||||||
(defrecord ClojureReaderBasedMongoDBSessionStore [^String collection-name])
|
(defrecord ClojureReaderBasedMongoDBSessionStore [^DB db ^String collection-name])
|
||||||
|
|
||||||
(defmethod print-dup java.util.Date
|
(defmethod print-dup java.util.Date
|
||||||
[^java.util.Date d ^java.io.Writer out]
|
[^java.util.Date d ^java.io.Writer out]
|
||||||
|
|
@ -48,7 +50,7 @@
|
||||||
|
|
||||||
(read-session [store key]
|
(read-session [store key]
|
||||||
(if key
|
(if key
|
||||||
(if-let [m (mc/find-one-as-map (.collection-name store) {:_id key})]
|
(if-let [m (mc/find-one-as-map (.db store) (.collection-name store) {:_id key})]
|
||||||
(read-string (:value m))
|
(read-string (:value m))
|
||||||
{})
|
{})
|
||||||
{}))
|
{}))
|
||||||
|
|
@ -58,47 +60,51 @@
|
||||||
key (or key (str (UUID/randomUUID)))
|
key (or key (str (UUID/randomUUID)))
|
||||||
value (binding [*print-dup* true]
|
value (binding [*print-dup* true]
|
||||||
(pr-str (assoc data :_id key)))]
|
(pr-str (assoc data :_id key)))]
|
||||||
(mc/save (.collection-name store) {:_id key :value value :date date})
|
(mc/save (.db store) (.collection-name store) {:_id key :value value :date date})
|
||||||
key))
|
key))
|
||||||
|
|
||||||
(delete-session [store key]
|
(delete-session [store key]
|
||||||
(mc/remove-by-id (.collection-name store) key)
|
(mc/remove-by-id (.db store) (.collection-name store) key)
|
||||||
nil))
|
nil))
|
||||||
|
|
||||||
|
|
||||||
(defn session-store
|
(defn session-store
|
||||||
([]
|
([]
|
||||||
(ClojureReaderBasedMongoDBSessionStore. default-session-store-collection))
|
(ClojureReaderBasedMongoDBSessionStore. mg/*mongodb-database* default-session-store-collection))
|
||||||
([^String s]
|
([^String s]
|
||||||
(ClojureReaderBasedMongoDBSessionStore. s)))
|
(ClojureReaderBasedMongoDBSessionStore. mg/*mongodb-database* s))
|
||||||
|
([^DB db ^String s]
|
||||||
|
(ClojureReaderBasedMongoDBSessionStore. db s)))
|
||||||
|
|
||||||
|
|
||||||
;; this session store won't store namespaced keywords correctly but stores results in a way
|
;; this session store won't store namespaced keywords correctly but stores results in a way
|
||||||
;; that applications in other languages can read. DO NOT use it with Friend.
|
;; that applications in other languages can read. DO NOT use it with Friend.
|
||||||
|
|
||||||
(defrecord MongoDBSessionStore [^String collection-name])
|
(defrecord MongoDBSessionStore [^DB db ^String collection-name])
|
||||||
|
|
||||||
(extend-protocol ringstore/SessionStore
|
(extend-protocol ringstore/SessionStore
|
||||||
MongoDBSessionStore
|
MongoDBSessionStore
|
||||||
|
|
||||||
(read-session [store key]
|
(read-session [store key]
|
||||||
(if-let [m (and key
|
(if-let [m (and key
|
||||||
(mc/find-one-as-map (.collection-name store) {:_id key}))]
|
(mc/find-one-as-map (.db store) (.collection-name store) {:_id key}))]
|
||||||
m
|
m
|
||||||
{}))
|
{}))
|
||||||
|
|
||||||
(write-session [store key data]
|
(write-session [store key data]
|
||||||
(let [key (or key (str (UUID/randomUUID)))]
|
(let [key (or key (str (UUID/randomUUID)))]
|
||||||
(mc/save (.collection-name store) (assoc data :date (Date.) :_id key))
|
(mc/save (.db store) (.collection-name store) (assoc data :date (Date.) :_id key))
|
||||||
key))
|
key))
|
||||||
|
|
||||||
(delete-session [store key]
|
(delete-session [store key]
|
||||||
(mc/remove-by-id (.collection-name store) key)
|
(mc/remove-by-id (.db store) (.collection-name store) key)
|
||||||
nil))
|
nil))
|
||||||
|
|
||||||
|
|
||||||
(defn monger-store
|
(defn monger-store
|
||||||
([]
|
([]
|
||||||
(MongoDBSessionStore. default-session-store-collection))
|
(MongoDBSessionStore. mg/*mongodb-database* default-session-store-collection))
|
||||||
([^String s]
|
([^String s]
|
||||||
(MongoDBSessionStore. s)))
|
(MongoDBSessionStore. mg/*mongodb-database* s))
|
||||||
|
([^DB db ^String s]
|
||||||
|
(MongoDBSessionStore. db s)))
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,12 @@
|
||||||
(is (= {} (read-session store "a-missing-key-1228277")))))
|
(is (= {} (read-session store "a-missing-key-1228277")))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-reading-a-session-that-does-not-exist-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (session-store db "sessions")]
|
||||||
|
(is (= {} (read-session store "a-missing-key-1228277")))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-reading-a-session-that-does-exist
|
(deftest test-reading-a-session-that-does-exist
|
||||||
(let [store (session-store)
|
(let [store (session-store)
|
||||||
sk (write-session store nil {:library "Monger"})
|
sk (write-session store nil {:library "Monger"})
|
||||||
|
|
@ -35,6 +41,17 @@
|
||||||
{:library "Monger"}))))
|
{:library "Monger"}))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-reading-a-session-that-does-exist-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (session-store db "sessions")
|
||||||
|
sk (write-session store nil {:library "Monger"})
|
||||||
|
m (read-session store sk)]
|
||||||
|
(is sk)
|
||||||
|
(is (and (:_id m)))
|
||||||
|
(is (= (dissoc m :_id)
|
||||||
|
{:library "Monger"}))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-updating-a-session
|
(deftest test-updating-a-session
|
||||||
(let [store (session-store "sessions")
|
(let [store (session-store "sessions")
|
||||||
sk1 (write-session store nil {:library "Monger"})
|
sk1 (write-session store nil {:library "Monger"})
|
||||||
|
|
@ -47,8 +64,29 @@
|
||||||
{:library "Ring"}))))
|
{:library "Ring"}))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-updating-a-session-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (session-store db "sessions")
|
||||||
|
sk1 (write-session store nil {:library "Monger"})
|
||||||
|
sk2 (write-session store sk1 {:library "Ring"})
|
||||||
|
m (read-session store sk2)]
|
||||||
|
(is (and sk1 sk2))
|
||||||
|
(is (and (:_id m)))
|
||||||
|
(is (= sk1 sk2))
|
||||||
|
(is (= (dissoc m :_id)
|
||||||
|
{:library "Ring"}))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-deleting-a-session
|
(deftest test-deleting-a-session
|
||||||
(let [store (session-store "sessions")
|
(let [store (session-store "sessions")
|
||||||
sk (write-session store nil {:library "Monger"})]
|
sk (write-session store nil {:library "Monger"})]
|
||||||
(is (nil? (delete-session store sk)))
|
(is (nil? (delete-session store sk)))
|
||||||
(is (= {} (read-session store sk)))))
|
(is (= {} (read-session store sk)))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-deleting-a-session
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (session-store db "sessions")
|
||||||
|
sk (write-session store nil {:library "Monger"})]
|
||||||
|
(is (nil? (delete-session store sk)))
|
||||||
|
(is (= {} (read-session store sk)))))
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,12 @@
|
||||||
(is (= {} (read-session store "a-missing-key-1228277")))))
|
(is (= {} (read-session store "a-missing-key-1228277")))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-reading-a-session-that-does-not-exist-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (monger-store db "sessions")]
|
||||||
|
(is (= {} (read-session store "a-missing-key-1228277")))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-reading-a-session-that-does-exist
|
(deftest test-reading-a-session-that-does-exist
|
||||||
(let [store (monger-store)
|
(let [store (monger-store)
|
||||||
sk (write-session store nil {:library "Monger"})
|
sk (write-session store nil {:library "Monger"})
|
||||||
|
|
@ -35,6 +41,17 @@
|
||||||
{:library "Monger"}))))
|
{:library "Monger"}))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-reading-a-session-that-does-exist-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (monger-store db "sessions")
|
||||||
|
sk (write-session store nil {:library "Monger"})
|
||||||
|
m (read-session store sk)]
|
||||||
|
(is sk)
|
||||||
|
(is (and (:_id m) (:date m)))
|
||||||
|
(is (= (dissoc m :_id :date)
|
||||||
|
{:library "Monger"}))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-updating-a-session
|
(deftest test-updating-a-session
|
||||||
(let [store (monger-store "sessions")
|
(let [store (monger-store "sessions")
|
||||||
sk1 (write-session store nil {:library "Monger"})
|
sk1 (write-session store nil {:library "Monger"})
|
||||||
|
|
@ -47,6 +64,19 @@
|
||||||
{:library "Ring"}))))
|
{:library "Ring"}))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-updating-a-session-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (monger-store db "sessions")
|
||||||
|
sk1 (write-session store nil {:library "Monger"})
|
||||||
|
sk2 (write-session store sk1 {:library "Ring"})
|
||||||
|
m (read-session store sk2)]
|
||||||
|
(is (and sk1 sk2))
|
||||||
|
(is (and (:_id m) (:date m)))
|
||||||
|
(is (= sk1 sk2))
|
||||||
|
(is (= (dissoc m :_id :date)
|
||||||
|
{:library "Ring"}))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-deleting-a-session
|
(deftest test-deleting-a-session
|
||||||
(let [store (monger-store "sessions")
|
(let [store (monger-store "sessions")
|
||||||
sk (write-session store nil {:library "Monger"})]
|
sk (write-session store nil {:library "Monger"})]
|
||||||
|
|
@ -54,6 +84,14 @@
|
||||||
(is (= {} (read-session store sk)))))
|
(is (= {} (read-session store sk)))))
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-deleting-a-session-given-db
|
||||||
|
(let [db (monger.core/get-db)
|
||||||
|
store (monger-store db "sessions")
|
||||||
|
sk (write-session store nil {:library "Monger"})]
|
||||||
|
(is (nil? (delete-session store sk)))
|
||||||
|
(is (= {} (read-session store sk)))))
|
||||||
|
|
||||||
|
|
||||||
(deftest test-reader-extensions
|
(deftest test-reader-extensions
|
||||||
(let [d (java.util.Date.)
|
(let [d (java.util.Date.)
|
||||||
oid (org.bson.types.ObjectId.)]
|
oid (org.bson.types.ObjectId.)]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue