Skip to main content

shared/intern/
db.rs

1use crate::error::Result;
2use crate::{
3    config::{Database, cache::CacheDriver, database::DatabaseDriver},
4    infrastructure::{
5        cache::{CacheAdapters, in_memory::InMemoryAdapter, memcache::MemCache, redis::Redis},
6        database::{DatabaseAdapters, mongodb::MongoDB, postgres::PostgreSQL, sqlite::SQLite},
7    },
8};
9
10pub struct DB {
11    pub database: DatabaseAdapters,
12    pub cache: CacheAdapters,
13}
14
15impl DB {
16    pub async fn new(database: &Database) -> Result<Self> {
17        let cache_adapter = match database.cache.driver {
18            CacheDriver::MemCached => {
19                let client = MemCache::start(&database.cache.url).await?;
20                CacheAdapters::memcached(client)
21            }
22            CacheDriver::Redis => {
23                let connection = Redis::start(&database.cache.url).await?;
24                CacheAdapters::redis(connection)
25            }
26            CacheDriver::InMemory => {
27                let store = InMemoryAdapter::default();
28                CacheAdapters::in_memory(store)
29            }
30        };
31
32        let database_adapter = match database.driver {
33            DatabaseDriver::SQLite => {
34                let sqlite = SQLite::start(&database.connection_string).await?;
35                sqlite.run_migrations().await?;
36
37                DatabaseAdapters::sqlite(&sqlite.pool)
38            }
39            DatabaseDriver::MongoDB => {
40                let client = MongoDB::start(&database.connection_string).await?;
41                let db_name = database.name().unwrap_or_default();
42                DatabaseAdapters::mongodb(&client, db_name)
43            }
44            DatabaseDriver::PostgreSQL => {
45                let postgresql = PostgreSQL::start(&database.connection_string).await?;
46                postgresql.run_migrations().await?;
47
48                DatabaseAdapters::postgres(&postgresql.pool)
49            }
50        };
51
52        Ok(Self {
53            database: database_adapter,
54            cache: cache_adapter,
55        })
56    }
57}