From b856f12cf422b96c37c12df3d7829e4d15ef4453 Mon Sep 17 00:00:00 2001 From: tempest Date: Tue, 15 Apr 2025 00:08:12 -0600 Subject: Can find content data --- src/data/mod.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) (limited to 'src/data/mod.rs') diff --git a/src/data/mod.rs b/src/data/mod.rs index 4767914..0c61bd7 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -1,3 +1,72 @@ -pub mod config; -pub mod content; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; +#[cfg(feature = "ssr")] +use fs2::FileExt; +#[cfg(feature = "ssr")] +use std::fs::File; +#[cfg(feature = "ssr")] +use std::sync::LazyLock; + +use std::{collections::HashMap, path::Path}; + +mod config; +mod namespace; +mod page; + +use config::Config; +pub use namespace::{Namespace, Namespaces}; +pub use page::{Page, Pages}; + +#[derive(Hash, PartialEq, Eq, Clone, Debug, Deserialize, Serialize)] +pub struct PageUuid(Uuid); + +#[cfg(feature = "ssr")] +pub static CONFIG: LazyLock = + LazyLock::new(|| Config::read_from_file().expect("Could not open config file")); + +#[cfg(feature = "ssr")] +static DATA_LOCK: LazyLock = LazyLock::new(|| { + let config = &CONFIG; + let lock_path = Path::join(&config.data_dir, ".lock"); + let lockfile = std::fs::OpenOptions::new() + .read(true) + .write(true) + .create(true) + .open(&lock_path) + .map_err(|_| "Could not open data directory".to_string()) + .unwrap(); + + lockfile + .try_lock_exclusive() + .map_err(|_| "Could not lock data directory".to_string()) + .unwrap(); + + StormscribeData { + file_lock: lockfile, + namespaces: Namespaces::init(&Path::join(&config.data_dir, "namespace/")).unwrap(), + pages: Pages::init(&Path::join(&config.data_dir, "pages/")).unwrap(), + } +}); + +#[cfg(feature = "ssr")] +pub struct StormscribeData { + file_lock: File, + namespaces: Namespaces, + pages: Pages, +} + +#[cfg(feature = "ssr")] +impl StormscribeData { + fn get_data() -> &'static Self { + &DATA_LOCK + } + + pub fn get_namespace() -> Namespace { + DATA_LOCK.namespaces.root.clone() + } + + pub fn get_pages() -> HashMap { + DATA_LOCK.pages.pages.clone() + } +} -- cgit 1.4.1