use crate::AppState;
use actix_web::web::Data;
use serde_json::Value;
use crate::utils::redis_client::GLOBAL_REDIS;
pub async fn hydrate_cache_and_return_json(
app_state: Data<AppState>,
cache_key: String,
json_body: Vec<Value>,
) -> Vec<Value> {
let value_to_cache: Value = Value::Array(json_body.clone());
app_state
.cache
.insert(cache_key.clone(), value_to_cache)
.await;
if let Some(redis) = GLOBAL_REDIS.get() {
let _ = redis
.lock()
.await
.set_with_ttl(&cache_key, &Value::Array(json_body.clone()), 900u64)
.await;
}
json_body
}
#[cfg(test)]
mod tests {
use super::*;
use crate::drivers::postgresql::sqlx_driver::PostgresClientRegistry;
use actix_web::web::Data;
use moka::future::Cache;
use reqwest::Client;
use serde_json::json;
use std::sync::Arc;
#[tokio::test]
async fn test_hydrate_inserts_and_returns() {
let cache: Cache<String, Value> = Cache::builder().build();
let immortal: Cache<String, Value> = Cache::builder().build();
let app: AppState = AppState {
cache: Arc::new(cache),
immortal_cache: Arc::new(immortal),
client: Client::new(),
pg_registry: Arc::new(PostgresClientRegistry::empty()),
gateway_force_camel_case_to_snake_case: false,
pipeline_registry: None,
logging_client_name: None,
};
let data: Data<AppState> = Data::new(app);
let key: String = "test_key".to_string();
let payload: Vec<Value> = vec![json!({"a": 1}), json!({"b": 2})];
let returned: Vec<Value> =
hydrate_cache_and_return_json(data.clone(), key.clone(), payload.clone()).await;
assert_eq!(returned, payload);
let cached: Option<Value> = data.cache.get(&key).await;
assert!(cached.is_some());
assert_eq!(cached.unwrap(), Value::Array(payload));
}
#[tokio::test]
async fn test_hydrate_overwrites_existing_key() {
let cache: Cache<String, Value> = Cache::builder().build();
let immortal: Cache<String, Value> = Cache::builder().build();
let app: AppState = AppState {
cache: Arc::new(cache),
immortal_cache: Arc::new(immortal),
client: Client::new(),
pg_registry: Arc::new(PostgresClientRegistry::empty()),
gateway_force_camel_case_to_snake_case: false,
pipeline_registry: None,
logging_client_name: None,
};
let data: Data<AppState> = Data::new(app);
let key: String = "key2".to_string();
hydrate_cache_and_return_json(data.clone(), key.clone(), vec![json!({"v":1})]).await;
hydrate_cache_and_return_json(data.clone(), key.clone(), vec![json!({"v":2})]).await;
let cached: Value = data.cache.get(&key).await.unwrap();
assert_eq!(cached, Value::Array(vec![json!({"v":2})]));
}
}