oku_fs/database/
core.rs

1use super::dht::*;
2use super::posts::core::OkuPost;
3use super::users::*;
4use crate::fs::FS_PATH;
5use miette::IntoDiagnostic;
6use native_db::*;
7use std::{path::PathBuf, sync::LazyLock};
8
9pub(crate) static DATABASE_PATH: LazyLock<PathBuf> =
10    LazyLock::new(|| PathBuf::from(FS_PATH).join("OKU_FS_DATABASE"));
11/// An Oku node's database.
12pub static DATABASE: LazyLock<OkuDatabase> = LazyLock::new(|| OkuDatabase::new().unwrap());
13pub(crate) static MODELS: LazyLock<Models> = LazyLock::new(|| {
14    let mut models = Models::new();
15    models.define::<OkuUser>().unwrap();
16    models.define::<OkuPost>().unwrap();
17    models.define::<ReplicaAnnouncement>().unwrap();
18    models
19});
20
21/// The database used by Oku's protocol.
22pub struct OkuDatabase {
23    pub(crate) database: Database<'static>,
24}
25
26impl OkuDatabase {
27    /// Open an existing Oku database, or create one if it does not exist.
28    ///
29    /// # Returns
30    ///
31    /// An Oku database.
32    pub fn new() -> miette::Result<Self> {
33        Ok(Self {
34            database: native_db::Builder::new()
35                .create(&MODELS, &*DATABASE_PATH)
36                .into_diagnostic()?,
37        })
38    }
39
40    /// Perform a database migration.
41    pub fn migrate(&self) -> miette::Result<()> {
42        let rw = self.database.rw_transaction().into_diagnostic()?;
43        rw.migrate::<OkuUser>().into_diagnostic()?;
44        rw.migrate::<OkuPost>().into_diagnostic()?;
45        rw.migrate::<ReplicaAnnouncement>().into_diagnostic()?;
46        rw.commit().into_diagnostic()
47    }
48}