work in progress session caching (redis)

This commit is contained in:
Brandon Thomas committed 2023-03-12 03:00:47 -04:00
1 parent f2b6dc4349
commit 46bb4274ca
5 files changed
+68 -6

No files matched your search

Generated
+1
View File
@@ -7758,6 +7758,7 @@ dependencies = [
"md-5",
"once_cell",
"r2d2_redis",
"redis_caching",
"regex",
"reusable_types",
"serde",
@@ -8,10 +8,12 @@ use log::warn;
use sqlx::MySql;
use sqlx::pool::PoolConnection;
#[derive(Clone, Serialize, Deserialize)]
pub struct SessionRecord {
pub session_token: String,
pub user_token: String,
}
pub async fn get_user_session_by_token_light(
mysql_connection: &mut PoolConnection<MySql>,
session_token: &str,
+1
View File
@@ -19,6 +19,7 @@ container_common = { path = "../../../lib/container_common" }
database_queries = { path = "../../../lib/database_queries" }
enums = { path = "../../../_types/enums" }
http_server_common = { path = "../../../lib/http_server_common" }
redis_caching = { path = "../../../lib/caching/redis_caching" }
reusable_types = { path = "../../../_types/reusable_types" }
tokens = { path = "../../../_types/tokens" }
user_input_common = { path = "../../../lib/user_input_common" }
@@ -4,18 +4,21 @@
#![forbid(unused_variables)]
use actix_web::HttpRequest;
use log::warn;
use container_common::anyhow_result::AnyhowResult;
use crate::utils::session_cookie_manager::SessionCookieManager;
use crate::utils::user_session_extended::{UserSessionExtended, UserSessionPreferences, UserSessionPremiumPlanInfo, UserSessionRoleAndPermissions, UserSessionSubscriptionPlan, UserSessionUserDetails};
use database_queries::queries::users::user_sessions::get_user_session_by_token::{get_user_session_by_token, SessionUserRecord};
use database_queries::queries::users::user_sessions::get_user_session_by_token_light::{get_user_session_by_token_light, SessionRecord};
use database_queries::queries::users::user_subscriptions::list_active_user_subscriptions::list_active_user_subscriptions;
use redis_caching::redis_ttl_cache::{RedisTtlCache, RedisTtlCacheConnection};
use sqlx::pool::PoolConnection;
use sqlx::{MySqlPool, MySql};
#[derive(Clone)]
pub struct SessionChecker {
cookie_manager: SessionCookieManager,
maybe_redis_ttl_cache: Option<RedisTtlCache>,
}
impl SessionChecker {
@@ -23,9 +26,20 @@ impl SessionChecker {
pub fn new(cookie_manager: &SessionCookieManager) -> Self {
Self {
cookie_manager: cookie_manager.clone(),
maybe_redis_ttl_cache: None,
}
}
pub fn new_with_cache(cookie_manager: &SessionCookieManager, redis_ttl_cache: RedisTtlCache) -> Self {
Self {
cookie_manager: cookie_manager.clone(),
maybe_redis_ttl_cache: Some(redis_ttl_cache),
}
}
// ==================== SessionRecord ====================
#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
pub async fn maybe_get_session_light(
&self,
@@ -51,6 +65,36 @@ impl SessionChecker {
get_user_session_by_token_light(mysql_connection, &session_token).await
}
async fn maybe_get_session_light_from_connection_cached(
&self,
request: &HttpRequest,
mysql_connection: &mut PoolConnection<MySql>,
) -> AnyhowResult<Option<SessionRecord>>
{
let session_token = match self.cookie_manager.decode_session_token_from_request(request)? {
None => return Ok(None),
Some(session_token) => session_token,
};
let maybe_redis_cache = self.maybe_get_redis_cache_connection();
match maybe_redis_cache {
None => {
get_user_session_by_token_light(mysql_connection, &session_token).await
}
Some(mut redis_ttl_cache) => {
let cache_key = "todo";
redis_ttl_cache.lazy_load_if_not_cached(cache_key, move || {
//let session_token2 = session_token.to_string(); // TODO FIXME
get_user_session_by_token_light(mysql_connection, "")
}).await
}
}
}
// ==================== SessionUserRecord ====================
//#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
pub async fn maybe_get_user_session(
&self,
@@ -76,6 +120,9 @@ impl SessionChecker {
get_user_session_by_token(mysql_connection, &session_token).await
}
// ==================== UserSessionExtended ====================
//#[deprecated = "Use the PoolConnection<MySql> method instead of the MySqlPool one."]
pub async fn maybe_get_user_session_extended(
&self,
@@ -164,5 +211,17 @@ impl SessionChecker {
},
}))
}
fn maybe_get_redis_cache_connection(&self) -> Option<RedisTtlCacheConnection> {
self.maybe_redis_ttl_cache
.as_ref()
.map(|redis_ttl_cache| redis_ttl_cache.get_connection()
.map_err(|err| {
warn!("redis cache failure: {:?}", err); // NB: We'll fail open if Redis cache fails
err
})
.ok())
.flatten()
}
}
@@ -1,7 +1,7 @@
// NB: Incrementally getting rid of build warnings...
//#![forbid(unused_imports)]
//#![forbid(unused_mut)]
//#![forbid(unused_variables)]
#![forbid(unused_imports)]
#![forbid(unused_mut)]
#![forbid(unused_variables)]
use actix_web::error::ResponseError;
use actix_web::http::StatusCode;
@@ -10,14 +10,13 @@ use actix_web::{web, HttpResponse, HttpRequest};
use chrono::{DateTime, Utc};
use crate::server_state::ServerState;
use database_queries::column_types::vocoder_type::VocoderType;
use database_queries::queries::tts::tts_models::get_tts_model::{get_tts_model_by_token_using_connection, TtsModelRecord};
use database_queries::queries::tts::tts_models::get_tts_model::get_tts_model_by_token_using_connection;
use enums::common::visibility::Visibility;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
use log::warn;
use redis_common::redis_cache_keys::RedisCacheKeys;
use std::fmt;
use std::sync::Arc;
use errors::AnyhowResult;
use redis_common::redis_cache_keys::RedisCacheKeys;
use tts_common::text_pipelines::guess_pipeline::guess_text_pipeline_heuristic;
use tts_common::text_pipelines::text_pipeline_type::TextPipelineType;