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::{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}