use super::CallableCache;
use cal_core::QueueGroup;
use redis::{AsyncCommands, RedisError};
impl CallableCache {
pub async fn queue_group_set(&self, queue: &QueueGroup) -> Result<(), RedisError> {
println!("[CallableCache::queue_group_set] Setting queue group - Account: {}, Name: {}, Type: {}",
queue.account_id, queue.name, queue.get_type());
let key = crate::constants::QueueKeys::queue(&queue.account_id, &queue.name);
let json = serde_json::to_string(queue)
.map_err(super::helpers::serde_to_redis_error)?;
let mut con = self.redis_connection();
con.set(&key, json).await?;
con.sadd(&crate::constants::QueueKeys::active(&queue.account_id), &queue.name).await?;
let meta_key = crate::constants::QueueKeys::metadata(&queue.account_id);
let meta = serde_json::json!({
"name": queue.name,
"type": queue.get_type(),
"device_id": queue.device_id,
"entry_count": queue.entries.len()
});
con.hset(&meta_key, &queue.name, meta.to_string()).await?;
Ok(())
}
pub async fn queue_group_get(&self, account_id: &str, queue_name: &str) -> Result<Option<QueueGroup>, RedisError> {
println!("[CallableCache::queue_group_get] Getting queue group - Account: {}, Name: {}", account_id, queue_name);
let key = crate::constants::QueueKeys::queue(account_id, queue_name);
let mut con = self.redis_connection();
match con.get::<_, Option<String>>(&key).await? {
Some(json) => {
let queue: QueueGroup = serde_json::from_str(&json)
.map_err(super::helpers::serde_to_redis_error)?;
if queue.account_id != account_id {
println!("[CallableCache::queue_group_get] Account ID mismatch! Expected: {}, Got: {}",
account_id, queue.account_id);
return Ok(None);
}
println!("[CallableCache::queue_group_get] Found queue group: {} entries", queue.entries.len());
Ok(Some(queue))
}
None => {
println!("[CallableCache::queue_group_get] Queue group not found");
Ok(None)
}
}
}
pub async fn queue_group_delete(&self, account_id: &str, queue_name: &str) -> Result<(), RedisError> {
println!("[CallableCache::queue_group_delete] Deleting queue group - Account: {}, Name: {}", account_id, queue_name);
let key = crate::constants::QueueKeys::queue(account_id, queue_name);
let mut con = self.redis_connection();
con.del(&key).await?;
con.srem(&crate::constants::QueueKeys::active(account_id), queue_name).await?;
let meta_key = crate::constants::QueueKeys::metadata(account_id);
con.hdel(&meta_key, queue_name).await?;
Ok(())
}
pub async fn queue_group_list(&self, account_id: &str) -> Result<Vec<String>, RedisError> {
println!("[CallableCache::queue_group_list] Getting all queue names for account: {}", account_id);
let mut con = self.redis_connection();
let names: Vec<String> = con.smembers(&crate::constants::QueueKeys::active(account_id)).await?;
println!("[CallableCache::queue_group_list] Found {} queue names", names.len());
Ok(names)
}
pub async fn queue_groups_get_all(&self, account_id: &str) -> Result<Vec<QueueGroup>, RedisError> {
println!("[CallableCache::queue_groups_get_all] Getting all queue groups for account: {}", account_id);
let queue_names = self.queue_group_list(account_id).await?;
let mut queues = Vec::new();
for name in queue_names {
if let Some(queue) = self.queue_group_get(account_id, &name).await? {
queues.push(queue);
}
}
println!("[CallableCache::queue_groups_get_all] Returning {} queue groups", queues.len());
Ok(queues)
}
}