diff --git a/src/clojure/monger/ring/session_store.clj b/src/clojure/monger/ring/session_store.clj index 8d830de..ceb3980 100644 --- a/src/clojure/monger/ring/session_store.clj +++ b/src/clojure/monger/ring/session_store.clj @@ -1,8 +1,10 @@ (ns monger.ring.session-store (:require [ring.middleware.session.store :as ringstore] - [monger.collection :as mc]) + [monger.multi.collection :as mc] + [monger.core :as mg]) (:use monger.conversion) (:import [java.util UUID Date] + [com.mongodb DB] 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 ;; in other languages. -(defrecord ClojureReaderBasedMongoDBSessionStore [^String collection-name]) +(defrecord ClojureReaderBasedMongoDBSessionStore [^DB db ^String collection-name]) (defmethod print-dup java.util.Date [^java.util.Date d ^java.io.Writer out] @@ -48,7 +50,7 @@ (read-session [store 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)) {}) {})) @@ -58,47 +60,51 @@ key (or key (str (UUID/randomUUID))) value (binding [*print-dup* true] (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)) (delete-session [store key] - (mc/remove-by-id (.collection-name store) key) + (mc/remove-by-id (.db store) (.collection-name store) key) nil)) (defn session-store ([] - (ClojureReaderBasedMongoDBSessionStore. default-session-store-collection)) + (ClojureReaderBasedMongoDBSessionStore. mg/*mongodb-database* default-session-store-collection)) ([^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 ;; 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 MongoDBSessionStore (read-session [store 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 {})) (write-session [store key data] (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)) (delete-session [store key] - (mc/remove-by-id (.collection-name store) key) + (mc/remove-by-id (.db store) (.collection-name store) key) nil)) (defn monger-store ([] - (MongoDBSessionStore. default-session-store-collection)) + (MongoDBSessionStore. mg/*mongodb-database* default-session-store-collection)) ([^String s] - (MongoDBSessionStore. s))) + (MongoDBSessionStore. mg/*mongodb-database* s)) + ([^DB db ^String s] + (MongoDBSessionStore. db s))) diff --git a/test/monger/test/ring/clojure_session_store_test.clj b/test/monger/test/ring/clojure_session_store_test.clj index ed90aef..2bd4328 100644 --- a/test/monger/test/ring/clojure_session_store_test.clj +++ b/test/monger/test/ring/clojure_session_store_test.clj @@ -25,6 +25,12 @@ (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 (let [store (session-store) sk (write-session store nil {:library "Monger"}) @@ -35,6 +41,17 @@ {: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 (let [store (session-store "sessions") sk1 (write-session store nil {:library "Monger"}) @@ -47,8 +64,29 @@ {: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 (let [store (session-store "sessions") sk (write-session store nil {:library "Monger"})] (is (nil? (delete-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))))) diff --git a/test/monger/test/ring/session_store_test.clj b/test/monger/test/ring/session_store_test.clj index ac87a32..5892cee 100644 --- a/test/monger/test/ring/session_store_test.clj +++ b/test/monger/test/ring/session_store_test.clj @@ -25,6 +25,12 @@ (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 (let [store (monger-store) sk (write-session store nil {:library "Monger"}) @@ -35,6 +41,17 @@ {: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 (let [store (monger-store "sessions") sk1 (write-session store nil {:library "Monger"}) @@ -47,6 +64,19 @@ {: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 (let [store (monger-store "sessions") sk (write-session store nil {:library "Monger"})] @@ -54,6 +84,14 @@ (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 (let [d (java.util.Date.) oid (org.bson.types.ObjectId.)]