use super::CallableCache;
use crate::{get_user_by_id, get_user_by_ident, get_users};
use cal_core::User;
use redis::RedisError;
use std::sync::Arc;
impl CallableCache {
pub async fn get_user_by_id(&self, id: &str) -> Result<Option<Arc<User>>, RedisError> {
println!("[CallableCache::get_user_by_id] Getting user by ID: {}", id);
if let Some(resolved_id) = self.local_cache.user_idents.get(id) {
println!("[CallableCache::get_user_by_id] Found user ident in local cache: {}", resolved_id);
if let Some(user) = self.local_cache.users.get(resolved_id.as_str()) {
println!("[CallableCache::get_user_by_id] Found user in local cache: {}", user.email);
return Ok(Some(user));
}
println!("[CallableCache::get_user_by_id] User not in local cache, fetching from Redis");
match get_user_by_id(self.remote_cache.connection.clone(), &resolved_id).await? {
Some(user) => {
println!("[CallableCache::get_user_by_id] Found user in Redis: {}", user.email);
let user_arc = Arc::new(user);
self.local_cache
.users
.insert(resolved_id.to_string(), user_arc.clone());
self.local_cache
.user_idents
.insert(id.to_string(), resolved_id.to_string());
Ok(Some(user_arc))
}
None => {
println!("[CallableCache::get_user_by_id] User not found in Redis");
Ok(None)
}
}
} else {
println!("[CallableCache::get_user_by_id] User ident not in local cache, checking Redis");
match get_user_by_ident(self.remote_cache.connection.clone(), id).await? {
Some(user) => {
println!("[CallableCache::get_user_by_id] Found user in Redis by ident: {}", user.email);
let user_arc = Arc::new(user);
self.local_cache
.users
.insert(user_arc.id.clone(), user_arc.clone());
self.local_cache
.user_idents
.insert(id.to_string(), user_arc.id.clone());
self.local_cache
.user_idents
.insert(user_arc.email.clone(), user_arc.id.clone());
Ok(Some(user_arc))
}
None => {
println!("[CallableCache::get_user_by_id] User not found in Redis");
Ok(None)
}
}
}
}
pub async fn get_user_by_ident(&self, ident: &str) -> Result<Option<Arc<User>>, RedisError> {
println!("[CallableCache::get_user_by_ident] Getting user by ident: {}", ident);
self.get_user_by_id(ident).await
}
pub async fn get_users(&self) -> Result<Arc<Vec<User>>, RedisError> {
println!("[CallableCache::get_users] Getting all users from Redis");
let users = get_users(self.remote_cache.connection.clone()).await?;
println!("[CallableCache::get_users] Retrieved {} users from Redis", users.len());
for user in &users {
let user_arc = Arc::new(user.clone());
self.local_cache
.users
.insert(user.id.clone(), user_arc.clone());
self.local_cache
.user_idents
.insert(user.id.clone(), user.id.clone());
self.local_cache
.user_idents
.insert(user.email.clone(), user.id.clone());
}
Ok(Arc::new(users))
}
}