cal_redis/
user.rs

1// File: cal-redis/src/user.rs
2
3use crate::cache::{get_hash, publish_event};
4use crate::common::{
5    get_hash_item, get_items, serialize_to_json,
6};
7use crate::constants::{USERS_KEY, USER_IDENTS_KEY};
8use cal_core::{RedisEvent, User, UserCreate};
9use redis::aio::MultiplexedConnection;
10use redis::{AsyncCommands, RedisError, Value};
11
12/// Retrieves all users stored in Redis.
13pub async fn get_users(con: MultiplexedConnection) -> Result<Vec<User>, RedisError> {
14    get_items(con, USERS_KEY).await
15}
16
17/// Retrieves a user by its identifier (e.g., email).
18pub async fn get_user_by_ident(
19    con: MultiplexedConnection,
20    key: &str,
21) -> Result<Option<User>, RedisError> {
22    match get_hash(con.clone(), USER_IDENTS_KEY, key).await? {
23        Some(user_id) => {
24            println!("get_user_by_ident: Found user ident {:?}", user_id);
25            get_user_by_id(con, &user_id).await
26        }
27        None => {
28            println!("get_user_by_ident: No user ident for {:?}", key);
29            Ok(None)
30        }
31    }
32}
33
34/// Retrieves a user by its unique ID.
35pub async fn get_user_by_id(
36    con: MultiplexedConnection,
37    key: &str,
38) -> Result<Option<User>, RedisError> {
39    get_hash_item(con, USERS_KEY, key).await
40}
41
42/// Inserts a complete user with identity mappings into Redis.
43pub async fn insert_user(
44    mut con: MultiplexedConnection,
45    user: User,
46) -> Result<(), RedisError> {
47    // Store full user info
48    let value = serialize_to_json(&user)?;
49    let _: Value = con.hset(USERS_KEY, &user.id, value).await?;
50
51    // Build user identity mappings
52    build_user_idents(&mut con, &user).await?;
53
54    let event = RedisEvent::UserCreate(UserCreate {
55        payload: user.clone(),
56    });
57
58    publish_event(&mut con, event).await?;
59
60    Ok(())
61}
62
63/// Builds Redis identity mappings for a user
64async fn build_user_idents(
65    con: &mut MultiplexedConnection,
66    user: &User,
67) -> Result<(), RedisError> {
68    // Add user ID and email mappings
69    let ident_entries = vec![
70        (user.id.clone(), user.id.clone()),
71        (user.email.clone(), user.id.clone()),
72    ];
73
74    // Insert all identity entries
75    let _: Value = con.hset_multiple(USER_IDENTS_KEY, &ident_entries).await?;
76
77    Ok(())
78}