scouter_sql/sql/traits/
user.rs1use crate::sql::query::Queries;
2use crate::sql::schema::User;
3
4use crate::sql::error::SqlError;
5use async_trait::async_trait;
6
7use sqlx::{Pool, Postgres};
8use std::result::Result::Ok;
9
10#[async_trait]
11pub trait UserSqlLogic {
12 async fn insert_user(pool: &Pool<Postgres>, user: &User) -> Result<(), SqlError> {
21 let query = Queries::InsertUser.get_query();
22
23 let hashed_recovery_codes = serde_json::to_value(&user.hashed_recovery_codes)?;
24 let group_permissions = serde_json::to_value(&user.group_permissions)?;
25 let permissions = serde_json::to_value(&user.permissions)?;
26 let favorite_spaces = serde_json::to_value(&user.favorite_spaces)?;
27
28 sqlx::query(&query.sql)
29 .bind(&user.username)
30 .bind(&user.password_hash)
31 .bind(&hashed_recovery_codes)
32 .bind(&permissions)
33 .bind(&group_permissions)
34 .bind(&favorite_spaces)
35 .bind(&user.role)
36 .bind(user.active)
37 .bind(&user.email)
38 .execute(pool)
39 .await?;
40
41 Ok(())
42 }
43
44 async fn get_user(pool: &Pool<Postgres>, username: &str) -> Result<Option<User>, SqlError> {
53 let query = Queries::GetUser.get_query();
54
55 let user: Option<User> = sqlx::query_as(&query.sql)
56 .bind(username)
57 .fetch_optional(pool)
58 .await
59 .map_err(SqlError::SqlxError)?;
60
61 Ok(user)
62 }
63
64 async fn update_user(pool: &Pool<Postgres>, user: &User) -> Result<(), SqlError> {
74 let query = Queries::UpdateUser.get_query();
75
76 let hashed_recovery_codes = serde_json::to_value(&user.hashed_recovery_codes)?;
77 let group_permissions = serde_json::to_value(&user.group_permissions)?;
78 let permissions = serde_json::to_value(&user.permissions)?;
79 let favorite_spaces = serde_json::to_value(&user.favorite_spaces)?;
80
81 sqlx::query(&query.sql)
82 .bind(user.active)
83 .bind(&user.password_hash)
84 .bind(&hashed_recovery_codes)
85 .bind(&permissions)
86 .bind(&group_permissions)
87 .bind(&favorite_spaces)
88 .bind(&user.refresh_token)
89 .bind(&user.email)
90 .bind(&user.username)
91 .execute(pool)
92 .await?;
93
94 Ok(())
95 }
96
97 async fn get_users(pool: &Pool<Postgres>) -> Result<Vec<User>, SqlError> {
105 let query = Queries::GetUsers.get_query();
106
107 let users = sqlx::query_as::<_, User>(&query.sql)
108 .fetch_all(pool)
109 .await
110 .map_err(SqlError::SqlxError)?;
111
112 Ok(users)
113 }
114
115 async fn is_last_admin(pool: &Pool<Postgres>, username: &str) -> Result<bool, SqlError> {
124 let query = Queries::LastAdmin.get_query();
126
127 let admins: Vec<String> = sqlx::query_scalar(&query.sql)
128 .fetch_all(pool)
129 .await
130 .map_err(SqlError::SqlxError)?;
131
132 if admins.len() > 1 {
134 return Ok(false);
135 }
136
137 if admins.is_empty() {
139 return Ok(false);
140 }
141
142 Ok(admins.len() == 1 && admins[0] == username)
144 }
145
146 async fn delete_user(pool: &Pool<Postgres>, username: &str) -> Result<(), SqlError> {
152 let query = Queries::DeleteUser.get_query();
153
154 sqlx::query(&query.sql)
155 .bind(username)
156 .execute(pool)
157 .await
158 .map_err(SqlError::SqlxError)?;
159
160 Ok(())
161 }
162}