docbox_database/models/
user.rs

1use crate::{DbExecutor, DbResult};
2use serde::Serialize;
3use sqlx::prelude::FromRow;
4use utoipa::ToSchema;
5
6pub type UserId = String;
7
8#[derive(Debug, Clone, Serialize, FromRow, ToSchema)]
9pub struct User {
10    /// Unique ID of the user
11    pub id: String,
12    /// Last saved name for the user
13    pub name: Option<String>,
14    /// Last saved image ID for the user
15    pub image_id: Option<String>,
16}
17
18impl User {
19    /// Stores / updates the stored user data, returns back the user ID
20    pub async fn store(
21        db: impl DbExecutor<'_>,
22        id: UserId,
23        name: Option<String>,
24        image_id: Option<String>,
25    ) -> DbResult<User> {
26        sqlx::query(
27            r#"   
28            INSERT INTO "docbox_users" ("id", "name", "image_id") 
29            VALUES ($1, $2, $3)
30            ON CONFLICT ("id") 
31            DO UPDATE SET "name" = EXCLUDED."name", "image_id" = EXCLUDED."image_id"
32        "#,
33        )
34        .bind(id.as_str())
35        .bind(name.as_ref())
36        .bind(image_id.as_ref())
37        .execute(db)
38        .await?;
39
40        Ok(User { id, name, image_id })
41    }
42
43    #[allow(unused)]
44    pub async fn find(db: impl DbExecutor<'_>, id: UserId) -> DbResult<Option<User>> {
45        sqlx::query_as(r#"SELECT * FROM "docbox_users" WHERE "id" = $1"#)
46            .bind(id)
47            .fetch_optional(db)
48            .await
49    }
50}