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}