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}