Skip to main content

shared/infrastructure/database/
adapters.rs

1use std::sync::Arc;
2
3use sqlx::{Pool, Postgres, Sqlite};
4
5use crate::domain::database::DatabaseAdapter;
6use crate::domain::model::{
7    Account, EmailVerificationToken, PasswordResetToken, Permission, RefreshToken, Role,
8    RolePermission, Session, SigningKey, User, UserRole,
9};
10
11use super::{mongodb::MongodbAdapter, postgres::PostgreSQLAdapter, sqlite::SQLiteAdapter};
12
13const USER: &str = "users";
14const ACCOUNT: &str = "accounts";
15const REFRESH_TOKEN: &str = "refresh_tokens";
16const PASSWORD_RESET_TOKEN: &str = "password_reset_tokens";
17const EMAIL_VERIFICATION_TOKEN: &str = "email_verification_tokens";
18const SESSION: &str = "sessions";
19const ROLE: &str = "roles";
20const USER_ROLE: &str = "user_roles";
21const PERMISSIONS: &str = "permissions";
22const ROLE_PERMISSIONS: &str = "role_permissions";
23const SIGNING_KEYS: &str = "signing_keys";
24
25pub struct DatabaseAdapters {
26    pub user_adapter: Arc<dyn DatabaseAdapter<User>>,
27    pub account_adapter: Arc<dyn DatabaseAdapter<Account>>,
28    pub jwt_adapter: Arc<dyn DatabaseAdapter<RefreshToken>>,
29    pub session_adapter: Arc<dyn DatabaseAdapter<Session>>,
30    pub reset_token_adapter: Arc<dyn DatabaseAdapter<PasswordResetToken>>,
31    pub email_verification_token: Arc<dyn DatabaseAdapter<EmailVerificationToken>>,
32    pub role_adapter: Arc<dyn DatabaseAdapter<Role>>,
33    pub user_role_adapter: Arc<dyn DatabaseAdapter<UserRole>>,
34    pub permission_adapter: Arc<dyn DatabaseAdapter<Permission>>,
35    pub role_permission_adapter: Arc<dyn DatabaseAdapter<RolePermission>>,
36    pub signing_keys_adapter: Arc<dyn DatabaseAdapter<SigningKey>>,
37    // pub transaction_adapter: MongodbTransaction,
38}
39
40impl DatabaseAdapters {
41    pub fn mongodb(client: &mongodb::Client, conn_string: &str) -> Self {
42        Self {
43            user_adapter: Arc::new(MongodbAdapter::<User>::new(client, conn_string, USER)),
44            account_adapter: Arc::new(MongodbAdapter::<Account>::new(client, conn_string, ACCOUNT)),
45            jwt_adapter: Arc::new(MongodbAdapter::<RefreshToken>::new(
46                client,
47                conn_string,
48                REFRESH_TOKEN,
49            )),
50            session_adapter: Arc::new(MongodbAdapter::<Session>::new(client, conn_string, SESSION)),
51            reset_token_adapter: Arc::new(MongodbAdapter::<PasswordResetToken>::new(
52                client,
53                conn_string,
54                PASSWORD_RESET_TOKEN,
55            )),
56            email_verification_token: Arc::new(MongodbAdapter::<EmailVerificationToken>::new(
57                client,
58                conn_string,
59                EMAIL_VERIFICATION_TOKEN,
60            )),
61            role_adapter: Arc::new(MongodbAdapter::<Role>::new(client, conn_string, ROLE)),
62            user_role_adapter: Arc::new(MongodbAdapter::<UserRole>::new(
63                client,
64                conn_string,
65                USER_ROLE,
66            )),
67
68            permission_adapter: Arc::new(MongodbAdapter::<Permission>::new(
69                client,
70                conn_string,
71                PERMISSIONS,
72            )),
73            role_permission_adapter: Arc::new(MongodbAdapter::<RolePermission>::new(
74                client,
75                conn_string,
76                ROLE_PERMISSIONS,
77            )),
78            signing_keys_adapter: Arc::new(MongodbAdapter::<SigningKey>::new(
79                client,
80                conn_string,
81                SIGNING_KEYS,
82            )),
83            // transaction_adapter: MongodbTransaction::new(client),
84        }
85    }
86
87    pub fn sqlite(pool: &Pool<Sqlite>) -> Self {
88        Self {
89            user_adapter: Arc::new(SQLiteAdapter::<User>::new(pool, USER)),
90            account_adapter: Arc::new(SQLiteAdapter::<Account>::new(pool, ACCOUNT)),
91            jwt_adapter: Arc::new(SQLiteAdapter::<RefreshToken>::new(pool, REFRESH_TOKEN)),
92            session_adapter: Arc::new(SQLiteAdapter::<Session>::new(pool, SESSION)),
93            reset_token_adapter: Arc::new(SQLiteAdapter::<PasswordResetToken>::new(
94                pool,
95                PASSWORD_RESET_TOKEN,
96            )),
97            email_verification_token: Arc::new(SQLiteAdapter::<EmailVerificationToken>::new(
98                pool,
99                EMAIL_VERIFICATION_TOKEN,
100            )),
101            role_adapter: Arc::new(SQLiteAdapter::<Role>::new(pool, ROLE)),
102            user_role_adapter: Arc::new(SQLiteAdapter::<UserRole>::new(pool, USER_ROLE)),
103            permission_adapter: Arc::new(SQLiteAdapter::<Permission>::new(pool, PERMISSIONS)),
104            role_permission_adapter: Arc::new(SQLiteAdapter::<RolePermission>::new(
105                pool,
106                ROLE_PERMISSIONS,
107            )),
108            signing_keys_adapter: Arc::new(SQLiteAdapter::<SigningKey>::new(pool, SIGNING_KEYS)),
109            // transaction_adapter: todo!(),
110        }
111    }
112
113    pub fn postgres(pool: &Pool<Postgres>) -> Self {
114        Self {
115            user_adapter: Arc::new(PostgreSQLAdapter::<User>::new(pool, USER)),
116            account_adapter: Arc::new(PostgreSQLAdapter::<Account>::new(pool, ACCOUNT)),
117            jwt_adapter: Arc::new(PostgreSQLAdapter::<RefreshToken>::new(pool, REFRESH_TOKEN)),
118            session_adapter: Arc::new(PostgreSQLAdapter::<Session>::new(pool, SESSION)),
119            reset_token_adapter: Arc::new(PostgreSQLAdapter::<PasswordResetToken>::new(
120                pool,
121                PASSWORD_RESET_TOKEN,
122            )),
123            email_verification_token: Arc::new(PostgreSQLAdapter::<EmailVerificationToken>::new(
124                pool,
125                EMAIL_VERIFICATION_TOKEN,
126            )),
127            role_adapter: Arc::new(PostgreSQLAdapter::<Role>::new(pool, ROLE)),
128            user_role_adapter: Arc::new(PostgreSQLAdapter::<UserRole>::new(pool, USER_ROLE)),
129            permission_adapter: Arc::new(PostgreSQLAdapter::<Permission>::new(pool, PERMISSIONS)),
130            role_permission_adapter: Arc::new(PostgreSQLAdapter::<RolePermission>::new(
131                pool,
132                ROLE_PERMISSIONS,
133            )),
134            signing_keys_adapter: Arc::new(PostgreSQLAdapter::<SigningKey>::new(
135                pool,
136                SIGNING_KEYS,
137            )),
138            // transaction_adapter: todo!(),
139        }
140    }
141}