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::{Acquire, Postgres, QueryBuilder};
8
9fn search_system_user<'a, 'c, Connection: Acquire<'c, Database = Postgres> + Send + 'a>(
10    connection: Connection,
11    clauses: &'a UserSearchClauses,
12) -> impl Future<Output = Result<Vec<User>, OperationOutcomeError>> + Send + 'a {
13    async move {
14        let mut conn = connection.acquire().await.map_err(StoreError::SQLXError)?;
15        let mut query_builder: QueryBuilder<Postgres> = QueryBuilder::new(
16            r#"SELECT id, tenant, email, role, method, provider_id FROM users WHERE  "#,
17        );
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();
34
35        let users: Vec<User> = query
36            .fetch_all(&mut *conn)
37            .await
38            .map_err(StoreError::from)?;
39
40        Ok(users)
41    }
42}
43
44impl SystemAdmin<User, UserSearchClauses> for PGConnection {
45    async fn search(
46        &self,
47        clauses: &UserSearchClauses,
48    ) -> Result<Vec<User>, OperationOutcomeError> {
49        match self {
50            PGConnection::Pool(pool, _) => {
51                let res = search_system_user(pool, clauses).await?;
52                Ok(res)
53            }
54            PGConnection::Transaction(tx, _) => {
55                let mut tx = tx.lock().await;
56                let res = search_system_user(&mut *tx, clauses).await?;
57                Ok(res)
58            }
59        }
60    }
61}