docbox_database/models/
user.rs1use 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 pub id: String,
12 pub name: Option<String>,
14 pub image_id: Option<String>,
16}
17
18impl User {
19 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}