Skip to main content

haste_repository/pg/models/
system.rs

1use 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}