backend/objects/
user.rs

1use diesel::{ExpressionMethods, QueryDsl, Queryable, Selectable, SelectableHelper};
2use diesel_async::RunQueryDsl;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use crate::{Conn, Data, error::Error, schema::users};
7
8use super::load_or_empty;
9
10#[derive(Deserialize, Serialize, Clone, Queryable, Selectable)]
11#[diesel(table_name = users)]
12#[diesel(check_for_backend(diesel::pg::Pg))]
13pub struct User {
14    uuid: Uuid,
15    username: String,
16    display_name: Option<String>,
17    avatar: Option<String>,
18    pronouns: Option<String>,
19    about: Option<String>,
20}
21
22impl User {
23    pub async fn fetch_one(data: &Data, user_uuid: Uuid) -> Result<Self, Error> {
24        let mut conn = data.pool.get().await?;
25
26        if let Ok(cache_hit) = data.get_cache_key(user_uuid.to_string()).await {
27            return Ok(serde_json::from_str(&cache_hit)?);
28        }
29
30        use users::dsl;
31        let user: User = dsl::users
32            .filter(dsl::uuid.eq(user_uuid))
33            .select(User::as_select())
34            .get_result(&mut conn)
35            .await?;
36
37        data.set_cache_key(user_uuid.to_string(), user.clone(), 1800)
38            .await?;
39
40        Ok(user)
41    }
42
43    pub async fn fetch_amount(
44        conn: &mut Conn,
45        offset: i64,
46        amount: i64,
47    ) -> Result<Vec<Self>, Error> {
48        use users::dsl;
49        let users: Vec<User> = load_or_empty(
50            dsl::users
51                .limit(amount)
52                .offset(offset)
53                .select(User::as_select())
54                .load(conn)
55                .await,
56        )?;
57
58        Ok(users)
59    }
60}