use super::CallableCache;
use crate::constants::{ChannelKeys, WS_CONNECTIONS_KEY};
use cal_core::RedisEvent;
use redis::{AsyncCommands, RedisError};
impl CallableCache {
pub async fn get_ws_account(
&self,
ws_connection_id: &str,
) -> Result<Option<String>, RedisError> {
println!("[CallableCache::get_ws_account] Getting account for WebSocket: {}", ws_connection_id);
let mut con = self.redis_connection();
let result = con.hget(WS_CONNECTIONS_KEY, ws_connection_id).await?;
match &result {
Some(account_id) => println!("[CallableCache::get_ws_account] Found account: {}", account_id),
None => println!("[CallableCache::get_ws_account] No account found for WebSocket"),
}
Ok(result)
}
pub async fn get_account_connections(
&self,
account_id: &str,
) -> Result<Vec<String>, RedisError> {
println!("[CallableCache::get_account_connections] Getting WebSocket connections for account: {}", account_id);
let mut con = self.redis_connection();
let all_connections: Vec<(String, String)> = con.hgetall(WS_CONNECTIONS_KEY).await?;
let connections: Vec<String> = all_connections
.into_iter()
.filter(|(_, acc_id)| acc_id == account_id)
.map(|(conn_id, _)| conn_id)
.collect();
println!("[CallableCache::get_account_connections] Found {} connections", connections.len());
Ok(connections)
}
pub async fn publish_account_event(
&self,
account_id: &str,
event: &RedisEvent,
) -> Result<(), RedisError> {
println!("[CallableCache::publish_account_event] Publishing event for account: {}, Event type: {:?}",
account_id, std::mem::discriminant(event));
let channel = ChannelKeys::account_events(account_id);
let event_json = serde_json::to_string(event).map_err(super::helpers::serde_to_redis_error)?;
let mut con = self.redis_connection();
con.publish(&channel, event_json).await?;
Ok(())
}
}