1use 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
12pub async fn get_users(con: MultiplexedConnection) -> Result<Vec<User>, RedisError> {
14 get_items(con, USERS_KEY).await
15}
16
17pub 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
34pub 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
42pub async fn insert_user(
44 mut con: MultiplexedConnection,
45 user: User,
46) -> Result<(), RedisError> {
47 let value = serialize_to_json(&user)?;
49 let _: Value = con.hset(USERS_KEY, &user.id, value).await?;
50
51 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
63async fn build_user_idents(
65 con: &mut MultiplexedConnection,
66 user: &User,
67) -> Result<(), RedisError> {
68 let ident_entries = vec![
70 (user.id.clone(), user.id.clone()),
71 (user.email.clone(), user.id.clone()),
72 ];
73
74 let _: Value = con.hset_multiple(USER_IDENTS_KEY, &ident_entries).await?;
76
77 Ok(())
78}