use super::CallableCache;
use crate::proxy::{get_proxies, get_proxy_by_id};
use cal_core::Proxy;
use redis::RedisError;
use std::sync::Arc;
impl CallableCache {
pub async fn get_proxy_by_id(&mut self, id: &str) -> Result<Option<Arc<Proxy>>, RedisError> {
println!("[CallableCache::get_proxy_by_id] Getting proxy by ID: {}", id);
if let Some(proxy) = self.local_cache.proxies.get(id) {
println!("[CallableCache::get_proxy_by_id] Found proxy in local cache");
Ok(Some(proxy))
} else {
println!("[CallableCache::get_proxy_by_id] Proxy not in local cache, fetching from Redis");
match get_proxy_by_id(self.remote_cache.connection.clone(), id).await? {
Some(proxy) => {
println!("[CallableCache::get_proxy_by_id] Found proxy in Redis: {}", proxy.ip);
self.local_cache
.proxies
.insert(id.to_string(), Arc::new(proxy.clone()));
Ok(Some(Arc::new(proxy)))
}
None => {
println!("[CallableCache::get_proxy_by_id] Proxy not found in Redis");
Ok(None)
}
}
}
}
pub async fn get_proxies(&mut self) -> Result<Arc<Vec<Proxy>>, RedisError> {
println!("[CallableCache::get_proxies] Getting all proxies from Redis");
let proxies = get_proxies(self.remote_cache.connection.clone()).await?;
println!("[CallableCache::get_proxies] Retrieved {} proxies from Redis", proxies.len());
for proxy in &proxies {
self.local_cache
.proxies
.insert(proxy.id.clone(), Arc::new(proxy.clone()));
}
Ok(Arc::new(proxies))
}
pub async fn get_proxies_local(self) -> Result<Arc<Vec<Proxy>>, RedisError> {
println!("[CallableCache::get_proxies_local] Getting proxies from local cache");
let proxies: Vec<Proxy> = self
.local_cache
.proxies
.iter()
.map(|(_, value)| (*value).clone()) .collect();
println!("[CallableCache::get_proxies_local] Found {} proxies in local cache", proxies.len());
Ok(Arc::new(proxies))
}
}