1use crate::config::{ConfigError, ConfigOption, config_on, set_config_on};
2use crate::db::DBError;
3use cfg_if::cfg_if;
4use sqlx::Postgres;
5use sqlx::pool::PoolConnection;
6use sqlx::types::Uuid;
7
8#[cfg(not(test))]
14mod userpool;
15
16pub struct User {
17 pub id: Uuid,
18}
19
20impl User {
21 cfg_if! {
22 if #[cfg(test)] {
23 pub async fn get_connection(&self) -> Result<PoolConnection<Postgres>, DBError> {
24 crate::db::get_connection().await
25 }
26 } else if #[cfg(feature = "test-utils")] {
27 pub async fn get_connection(&self) -> Result<PoolConnection<Postgres>, DBError> {
28 if crate::db::test_pool_is_set() {
29 crate::db::get_connection().await
30 } else {
31 userpool::get_connection(self.id).await
32 }
33 }
34 } else {
35 pub async fn get_connection(&self) -> Result<PoolConnection<Postgres>, DBError> {
36 userpool::get_connection(self.id).await
37 }
38 }
39 }
40
41 pub async fn config(&self, field: &str) -> Result<Option<ConfigOption>, ConfigError> {
48 let mut conn = self.get_connection().await.map_err(|_| ConfigError::DB)?;
49 config_on(&mut conn, field).await
50 }
51
52 pub async fn set_config(&self, field: &str, contents: ConfigOption) -> Result<(), ConfigError> {
57 let mut conn = self.get_connection().await.map_err(|_| ConfigError::DB)?;
58 set_config_on(&mut conn, field, contents).await
59 }
60}
61
62#[cfg(test)]
63impl User {
64 pub async fn commit(&self) -> Result<(), sqlx::Error> {
65 let mut conn = self.get_connection().await.unwrap();
66
67 sqlx::query!(
68 "INSERT INTO users (
69 id, user_name, email, photo, verified, user_password, user_role, db_name, created_at
70 ) VALUES (
71 $1, 'Test User', 'test@example.com', 'default.png',
72 FALSE, 'password123', 'user', 'database', NOW()
73 )",
74 self.id,
75 )
76 .execute(&mut *conn)
77 .await?;
78
79 Ok(())
80 }
81}