Skip to main content

haste_repository/pg/
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> =
17        QueryBuilder::new(r"SELECT id, tenant, email, role, method, provider_id FROM users WHERE ");
18
19    let mut seperator = query_builder.separated(" AND ");
20
21    if let Some(email) = clauses.email.as_ref() {
22        seperator.push(" email = ").push_bind_unseparated(email);
23    }
24
25    if let Some(role) = clauses.role.as_ref() {
26        seperator.push(" role = ").push_bind_unseparated(role);
27    }
28
29    if let Some(method) = clauses.method.as_ref() {
30        seperator.push(" method = ").push_bind_unseparated(method);
31    }
32
33    let query = query_builder.build_query_as::<User>();
34
35    let users: Vec<User> = query.fetch_all(executor).await.map_err(StoreError::from)?;
36
37    Ok(users)
38}
39
40impl SystemAdmin<User, UserSearchClauses> for PGConnection {
41    async fn search(
42        &self,
43        clauses: &UserSearchClauses,
44    ) -> Result<Vec<User>, OperationOutcomeError> {
45        match self {
46            PGConnection::Pool(pool, _) => {
47                let res = search_system_user(pool, clauses).await?;
48                Ok(res)
49            }
50            PGConnection::Transaction(tx, _) => {
51                let mut tx = tx.lock().await;
52                let res = search_system_user(&mut **tx, clauses).await?;
53                Ok(res)
54            }
55        }
56    }
57}