haste_repository/pg/
system.rs1use 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}