pub mod entities;
pub mod error;
pub mod interface;
use std::collections::HashMap;
use std::sync::Arc;
use serde::{Deserialize, Serialize};
use wildland_crypto::identity::signing_keypair::PubKey;
use self::entities::ForestManifest;
use self::error::{CatlibError, CatlibResult};
use self::interface::CatLib;
use crate::{ForestIdentity, WildlandIdentity};
#[derive(Serialize, Deserialize)]
pub struct DeviceMetadata {
pub name: String,
pub pubkey: PubKey,
}
#[derive(Serialize, Deserialize)]
pub struct ForestMetaData {
devices: Vec<DeviceMetadata>,
free_storage_granted: bool,
}
impl ForestMetaData {
pub fn new(devices: Vec<DeviceMetadata>) -> Self {
Self {
devices,
free_storage_granted: false,
}
}
pub fn get_device_metadata(&self, device_pubkey: PubKey) -> Option<&DeviceMetadata> {
self.devices.iter().find(|d| d.pubkey == device_pubkey)
}
pub fn devices(&self) -> impl Iterator<Item = &DeviceMetadata> {
self.devices.iter()
}
}
impl TryFrom<ForestMetaData> for Vec<u8> {
type Error = CatlibError;
fn try_from(data: ForestMetaData) -> Result<Self, Self::Error> {
serde_json::to_vec(&data)
.map_err(|e| CatlibError::InvalidDataError(format!("Serialization error: {e}")))
}
}
#[derive(Clone)]
pub struct CatLibService {
catlib: Arc<dyn CatLib>,
}
impl CatLibService {
pub fn new(catlib: Arc<dyn CatLib>) -> Result<Self, CatlibError> {
catlib.is_db_alive()?;
Ok(Self { catlib })
}
#[tracing::instrument(level = "debug", skip_all)]
pub fn add_forest(
&self,
forest_identity: &ForestIdentity,
this_device_identity: &WildlandIdentity,
data: ForestMetaData,
) -> CatlibResult<Arc<dyn ForestManifest>> {
self.catlib.create_forest(
forest_identity.keypair.public().into(),
HashMap::from([(this_device_identity.get_public_key().into(), "".into())]),
data.try_into()?,
)
}
pub fn mark_free_storage_granted(&self, forest: &Arc<dyn ForestManifest>) -> CatlibResult<()> {
let mut forest_metadata = self.get_parsed_forest_metadata(forest)?;
forest_metadata.free_storage_granted = true;
forest.set_data(forest_metadata.try_into()?)?;
Ok(())
}
pub fn is_free_storage_granted(&self, forest: &Arc<dyn ForestManifest>) -> CatlibResult<bool> {
let forest_metadata = self.get_parsed_forest_metadata(forest)?;
Ok(forest_metadata.free_storage_granted)
}
pub fn get_forest(&self, owner: &ForestIdentity) -> CatlibResult<Arc<dyn ForestManifest>> {
self.catlib.get_forest(&owner.keypair.public().into())
}
fn get_parsed_forest_metadata(
&self,
forest: &Arc<dyn ForestManifest>,
) -> CatlibResult<ForestMetaData> {
serde_json::from_slice(&forest.data()?).map_err(|e| {
CatlibError::InvalidDataError(format!("Could not deserialize forest metadata {e}"))
})
}
}