|
12 | 12 |
|
13 | 13 | use async_session::{Result, Session, SessionStore};
|
14 | 14 | use async_trait::async_trait;
|
| 15 | +// use mongodb::bson::{doc, DateTime}; |
15 | 16 | use mongodb::bson::doc;
|
| 17 | +use mongodb::options::ReplaceOptions; |
16 | 18 | use mongodb::Client;
|
| 19 | +// use chrono::offset::Utc; |
17 | 20 |
|
18 | 21 | /// A MongoDB session store.
|
19 | 22 | #[derive(Debug, Clone)]
|
@@ -48,19 +51,19 @@ impl SessionStore for MongodbSessionStore {
|
48 | 51 | // TODO: mongodb supports TTL for auto-expiry somehow, need to figure out how!
|
49 | 52 | let value = serde_json::to_string(&session)?;
|
50 | 53 | let id = session.id();
|
51 |
| - let doc = doc! { "session_id": id, "session": value }; |
52 |
| - coll.insert_one(doc, None).await?; |
| 54 | + let query = doc! { "session_id": id }; |
| 55 | + let replacement = doc! { "session_id": id, "session": value }; |
| 56 | + let opts = ReplaceOptions::builder().upsert(true).build(); |
| 57 | + coll.replace_one(query, replacement, Some(opts)).await?; |
53 | 58 |
|
54 | 59 | Ok(session.into_cookie_value())
|
55 | 60 | }
|
56 | 61 |
|
57 | 62 | async fn load_session(&self, cookie_value: String) -> Result<Option<Session>> {
|
58 | 63 | let id = Session::id_from_cookie_value(&cookie_value)?;
|
59 | 64 | let coll = self.client.database(&self.db).collection(&self.coll_name);
|
60 |
| - |
61 | 65 | let filter = doc! { "session_id": id };
|
62 |
| - let result = coll.find_one(filter, None).await?; |
63 |
| - match result { |
| 66 | + match coll.find_one(filter, None).await? { |
64 | 67 | None => Ok(None),
|
65 | 68 | Some(doc) => Ok(Some(serde_json::from_str(doc.get_str("session")?)?)),
|
66 | 69 | }
|
|
0 commit comments