haste_repository/pg/models/
system.rs1use crate::{
2 admin::SystemAdmin,
3 pg::{PGConnection, StoreError},
4 types::user::{User, UserSearchClauses},
5};
6use haste_fhir_operation_error::OperationOutcomeError;
7use sqlx::{PgExecutor, QueryBuilder};
8
9async fn search_system_user<'a, 'e, E>(
10 executor: E,
11 clauses: &'a UserSearchClauses,
12) -> Result<Vec<User>, OperationOutcomeError>
13where
14 E: PgExecutor<'e>,
15{
16 let mut query_builder: QueryBuilder<sqlx::Postgres> = QueryBuilder::new(
17 r"SELECT id, tenant, email, role, method, provider_id, email_verified FROM users WHERE ",
18 );
19
20 let mut seperator = query_builder.separated(" AND ");
21
22 if let Some(email) = clauses.email.as_ref() {
23 seperator.push(" email = ").push_bind_unseparated(email);
24 }
25
26 if let Some(role) = clauses.role.as_ref() {
27 seperator.push(" role = ").push_bind_unseparated(role);
28 }
29
30 if let Some(method) = clauses.method.as_ref() {
31 seperator.push(" method = ").push_bind_unseparated(method);
32 }
33
34 let query = query_builder.build_query_as::<User>();
35
36 let users: Vec<User> = query.fetch_all(executor).await.map_err(StoreError::from)?;
37
38 Ok(users)
39}
40
41impl SystemAdmin<User, UserSearchClauses> for PGConnection {
42 async fn search(
43 &self,
44 clauses: &UserSearchClauses,
45 ) -> Result<Vec<User>, OperationOutcomeError> {
46 match self {
47 PGConnection::Pool(pool, _) => {
48 let res = search_system_user(pool, clauses).await?;
49 Ok(res)
50 }
51 PGConnection::Transaction(tx, _, _) => {
52 let mut tx = tx.lock().await;
53 let res = search_system_user(&mut **tx, clauses).await?;
54 Ok(res)
55 }
56 }
57 }
58}