about summary refs log tree commit diff stats
path: root/crates/rocie-server/src/app.rs
blob: ab8f764088d867b1cfda62d36e46e13bbc6de800 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use std::{env, path::PathBuf};

use sqlx::{SqlitePool, sqlite::SqliteConnectOptions};

use crate::storage::migrate::migrate_db;

#[derive(Clone)]
pub(crate) struct App {
    pub(crate) db: SqlitePool,
}

impl App {
    pub(crate) async fn new() -> Result<Self, app_create::Error> {
        let db_path: PathBuf = PathBuf::from(env::var("ROCIE_DB_PATH")?);

        let db = {
            let options = SqliteConnectOptions::new()
                .filename(&db_path)
                .optimize_on_close(true, None)
                .create_if_missing(true);

            SqlitePool::connect_with(options).await.map_err(|err| {
                app_create::Error::DbConnectionFailed {
                    inner: err,
                    db_path,
                }
            })?
        };

        let me = Self { db };

        migrate_db(&me).await?;

        Ok(me)
    }
}

pub(crate) mod app_create {
    use std::{env, path::PathBuf};

    use crate::storage::migrate::migrate_db;

    #[derive(thiserror::Error, Debug)]
    pub(crate) enum Error {
        #[error("The `ROCIE_DB_PATH` variable is not accessible: {0}")]
        MissingDbVariable(#[from] env::VarError),

        #[error("Failed to connect to the sqlite database at `{db_path}`, because: {inner}")]
        DbConnectionFailed {
            inner: sqlx::Error,
            db_path: PathBuf,
        },

        #[error("Failed to migrate db to the current version")]
        MigrateDb(#[from] migrate_db::Error),
    }
}