Skip to main content

torii_storage_sqlite/repositories/
mod.rs

1//! Repository implementations for SQLite storage
2
3pub 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
22/// Repository provider implementation for SQLite
23pub 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}