Merge pull request #56 from ebaxt/session-store

Made it possbile to pass explisit db to session-store
This commit is contained in:
Michael Klishin 2013-07-04 13:26:01 -07:00
commit a04596cdc5
3 changed files with 95 additions and 13 deletions

View file

@ -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)))

View file

@ -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)))))

View file

@ -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.)]