shared/infrastructure/database/
adapters.rs1use 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 }
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 }
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 }
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 }
140 }
141}