torii_storage_sqlite/repositories/
mod.rs1pub mod oauth;
4pub mod passkey;
5pub mod password;
6pub mod session;
7pub mod token;
8pub mod user;
9
10pub use oauth::SqliteOAuthRepository;
11pub use passkey::SqlitePasskeyRepository;
12pub use password::SqlitePasswordRepository;
13pub use session::SqliteSessionRepository;
14pub use token::SqliteTokenRepository;
15pub use user::SqliteUserRepository;
16
17use async_trait::async_trait;
18use sqlx::SqlitePool;
19use std::sync::Arc;
20use torii_core::{Error, error::StorageError, repositories::RepositoryProvider};
21
22pub struct SqliteRepositoryProvider {
24 pool: SqlitePool,
25 user: Arc<SqliteUserRepository>,
26 session: Arc<SqliteSessionRepository>,
27 password: Arc<SqlitePasswordRepository>,
28 oauth: Arc<SqliteOAuthRepository>,
29 passkey: Arc<SqlitePasskeyRepository>,
30 token: Arc<SqliteTokenRepository>,
31}
32
33impl SqliteRepositoryProvider {
34 pub fn new(pool: SqlitePool) -> Self {
35 let user = Arc::new(SqliteUserRepository::new(pool.clone()));
36 let session = Arc::new(SqliteSessionRepository::new(pool.clone()));
37 let password = Arc::new(SqlitePasswordRepository::new(pool.clone()));
38 let oauth = Arc::new(SqliteOAuthRepository::new(pool.clone()));
39 let passkey = Arc::new(SqlitePasskeyRepository::new(pool.clone()));
40 let token = Arc::new(SqliteTokenRepository::new(pool.clone()));
41
42 Self {
43 pool,
44 user,
45 session,
46 password,
47 oauth,
48 passkey,
49 token,
50 }
51 }
52}
53
54#[async_trait]
55impl RepositoryProvider for SqliteRepositoryProvider {
56 type User = SqliteUserRepository;
57 type Session = SqliteSessionRepository;
58 type Password = SqlitePasswordRepository;
59 type OAuth = SqliteOAuthRepository;
60 type Passkey = SqlitePasskeyRepository;
61 type Token = SqliteTokenRepository;
62
63 fn user(&self) -> &Self::User {
64 &self.user
65 }
66
67 fn session(&self) -> &Self::Session {
68 &self.session
69 }
70
71 fn password(&self) -> &Self::Password {
72 &self.password
73 }
74
75 fn oauth(&self) -> &Self::OAuth {
76 &self.oauth
77 }
78
79 fn passkey(&self) -> &Self::Passkey {
80 &self.passkey
81 }
82
83 fn token(&self) -> &Self::Token {
84 &self.token
85 }
86
87 async fn migrate(&self) -> Result<(), torii_core::Error> {
88 use crate::migrations::{
89 CreateIndexes, CreateOAuthAccountsTable, CreatePasskeyChallengesTable,
90 CreatePasskeysTable, CreateSessionsTable, CreateUsersTable, SqliteMigrationManager,
91 };
92 use torii_migration::{Migration, MigrationManager};
93
94 let manager = SqliteMigrationManager::new(self.pool.clone());
95 manager.initialize().await.map_err(|e| {
96 tracing::error!(error = %e, "Failed to initialize migrations");
97 Error::Storage(StorageError::Database(
98 "Failed to initialize migrations".to_string(),
99 ))
100 })?;
101
102 let migrations: Vec<Box<dyn Migration<_>>> = vec![
103 Box::new(CreateUsersTable),
104 Box::new(CreateSessionsTable),
105 Box::new(CreateOAuthAccountsTable),
106 Box::new(CreatePasskeysTable),
107 Box::new(CreatePasskeyChallengesTable),
108 Box::new(CreateIndexes),
109 ];
110 manager.up(&migrations).await.map_err(|e| {
111 tracing::error!(error = %e, "Failed to run migrations");
112 Error::Storage(StorageError::Database(
113 "Failed to run migrations".to_string(),
114 ))
115 })?;
116
117 Ok(())
118 }
119
120 async fn health_check(&self) -> Result<(), torii_core::Error> {
121 sqlx::query("SELECT 1")
122 .execute(&self.pool)
123 .await
124 .map_err(|e| Error::Storage(StorageError::Database(e.to_string())))?;
125 Ok(())
126 }
127}