aboutsummaryrefslogtreecommitdiff
path: root/base/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-30 15:47:16 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-30 15:47:16 +0100
commit32a05b5ec244d4d8143993b082f8d3f86a0a4ecd (patch)
tree4cc75a81ef77a424822c2f74e4c9008be0a0205f /base/src
parente588d058ec3d13501edd0b4a3ac86604934c78c5 (diff)
downloadjellything-32a05b5ec244d4d8143993b082f8d3f86a0a4ecd.tar
jellything-32a05b5ec244d4d8143993b082f8d3f86a0a4ecd.tar.bz2
jellything-32a05b5ec244d4d8143993b082f8d3f86a0a4ecd.tar.zst
external ids
Diffstat (limited to 'base/src')
-rw-r--r--base/src/database.rs96
-rw-r--r--base/src/permission.rs24
2 files changed, 68 insertions, 52 deletions
diff --git a/base/src/database.rs b/base/src/database.rs
index bec630a..cd8b2bc 100644
--- a/base/src/database.rs
+++ b/base/src/database.rs
@@ -31,6 +31,8 @@ const T_INVITE: TableDefinition<&str, ()> = TableDefinition::new("invite");
const T_NODE: TableDefinition<[u8; 32], Ser<Node>> = TableDefinition::new("node");
const T_NODE_CHILDREN: TableDefinition<([u8; 32], [u8; 32]), ()> =
TableDefinition::new("node_children");
+const T_NODE_EXTERNAL_ID: TableDefinition<(&str, &str), [u8; 32]> =
+ TableDefinition::new("node_external_id");
const T_IMPORT_FILE_MTIME: TableDefinition<&[u8], u64> = TableDefinition::new("import_file_mtime");
#[derive(Clone)]
@@ -65,9 +67,11 @@ impl Database {
info!("ready");
Ok(r)
}
+
pub fn get_node_slug(&self, slug: &str) -> Result<Option<Arc<Node>>> {
self.get_node(NodeID::from_slug(slug))
}
+
pub fn get_node(&self, id: NodeID) -> Result<Option<Arc<Node>>> {
let txn = self.inner.begin_read()?;
let t_node = txn.open_table(T_NODE)?;
@@ -77,6 +81,7 @@ impl Database {
Ok(None)
}
}
+
pub fn get_node_children(&self, id: NodeID) -> Result<Vec<NodeID>> {
let txn = self.inner.begin_read()?;
let t_node_children = txn.open_table(T_NODE_CHILDREN)?;
@@ -85,16 +90,20 @@ impl Database {
.map(|r| r.map(|r| NodeID(r.0.value().1)))
.collect::<Result<Vec<_>, StorageError>>()?)
}
+
pub fn clear_nodes(&self) -> Result<()> {
let txn = self.inner.begin_write()?;
let mut t_node = txn.open_table(T_NODE)?;
let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?;
+ let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?;
t_node.retain(|_, _| false)?;
t_node_children.retain(|_, _| false)?;
- drop((t_node, t_node_children));
+ t_node_external_id.retain(|_, _| false)?;
+ drop((t_node, t_node_children, t_node_external_id));
txn.commit()?;
Ok(())
}
+
pub fn get_node_udata(&self, id: NodeID, username: &str) -> Result<Option<NodeUserData>> {
let txn = self.inner.begin_read()?;
let t_node = txn.open_table(T_USER_NODE)?;
@@ -104,6 +113,52 @@ impl Database {
Ok(None)
}
}
+
+ pub fn update_node_init(
+ &self,
+ id: NodeID,
+ update: impl FnOnce(&mut Node) -> Result<()>,
+ ) -> Result<()> {
+ let txn = self.inner.begin_write()?;
+ let mut t_nodes = txn.open_table(T_NODE)?;
+ let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?;
+ let mut t_node_external_id = txn.open_table(T_NODE_EXTERNAL_ID)?;
+ let mut node = t_nodes.get(id.0)?.map(|v| v.value().0).unwrap_or_default();
+ update(&mut node)?;
+ for parent in &node.parents {
+ t_node_children.insert((parent.0, id.0), ())?;
+ }
+ for (pl, eid) in &node.external_ids {
+ t_node_external_id.insert((pl.as_str(), eid.as_str()), id.0)?;
+ }
+ t_nodes.insert(&id.0, Ser(node))?;
+ drop((t_nodes, t_node_children, t_node_external_id));
+ txn.commit()?;
+ Ok(())
+ }
+
+ pub fn update_node_udata(
+ &self,
+ node: NodeID,
+ username: &str,
+ update: impl FnOnce(&mut NodeUserData) -> Result<()>,
+ ) -> Result<()> {
+ let txn = self.inner.begin_write()?;
+ let mut user_nodes = txn.open_table(T_USER_NODE)?;
+
+ let mut udata = user_nodes
+ .get((username, node.0))?
+ .map(|x| x.value().0)
+ .unwrap_or_default();
+
+ update(&mut udata)?;
+
+ user_nodes.insert((username, node.0), Ser(udata))?;
+ drop(user_nodes);
+ txn.commit()?;
+ Ok(())
+ }
+
pub fn get_user(&self, username: &str) -> Result<Option<User>> {
let txn = self.inner.begin_read()?;
let t_user = txn.open_table(T_USER)?;
@@ -132,27 +187,6 @@ impl Database {
Ok(())
}
- pub fn update_node_udata(
- &self,
- node: NodeID,
- username: &str,
- update: impl FnOnce(&mut NodeUserData) -> Result<()>,
- ) -> Result<()> {
- let txn = self.inner.begin_write()?;
- let mut user_nodes = txn.open_table(T_USER_NODE)?;
-
- let mut udata = user_nodes
- .get((username, node.0))?
- .map(|x| x.value().0)
- .unwrap_or_default();
-
- update(&mut udata)?;
-
- user_nodes.insert((username, node.0), Ser(udata))?;
- drop(user_nodes);
- txn.commit()?;
- Ok(())
- }
pub fn delete_user(&self, username: &str) -> Result<bool> {
let txn = self.inner.begin_write()?;
let mut table = txn.open_table(T_USER)?;
@@ -290,24 +324,6 @@ impl Database {
txn.commit().unwrap();
Ok(())
}
- pub fn update_node_init(
- &self,
- id: NodeID,
- update: impl FnOnce(&mut Node) -> Result<()>,
- ) -> Result<()> {
- let txn = self.inner.begin_write()?;
- let mut t_nodes = txn.open_table(T_NODE)?;
- let mut t_node_children = txn.open_table(T_NODE_CHILDREN)?;
- let mut node = t_nodes.get(id.0)?.map(|v| v.value().0).unwrap_or_default();
- update(&mut node)?;
- for parent in &node.parents {
- t_node_children.insert((parent.0, id.0), ())?;
- }
- t_nodes.insert(&id.0, Ser(node))?;
- drop((t_nodes, t_node_children));
- txn.commit()?;
- Ok(())
- }
pub fn get_import_file_mtime(&self, path: &Path) -> Result<Option<u64>> {
let bytes = path.as_os_str().as_encoded_bytes();
let txn = self.inner.begin_read()?;
diff --git a/base/src/permission.rs b/base/src/permission.rs
index cec3833..55d0870 100644
--- a/base/src/permission.rs
+++ b/base/src/permission.rs
@@ -50,16 +50,16 @@ impl NodePermissionExt for Option<Node> {
})
}
}
-fn check_node_permission(perms: &PermissionSet, node: &Node) -> bool {
- if let Some(v) = perms.check_explicit(&UserPermission::AccessNode(node.id.clone().unwrap())) {
- v
- } else {
- // TODO
- // for com in node.parents.clone().into_iter() {
- // if let Some(v) = perms.check_explicit(&UserPermission::AccessNode(com.to_owned())) {
- // return v;
- // }
- // }
- true
- }
+fn check_node_permission(_perms: &PermissionSet, _node: &Node) -> bool {
+ // if let Some(v) = perms.check_explicit(&UserPermission::AccessNode(node.id.clone().unwrap())) {
+ // v
+ // } else {
+ // TODO
+ // for com in node.parents.clone().into_iter() {
+ // if let Some(v) = perms.check_explicit(&UserPermission::AccessNode(com.to_owned())) {
+ // return v;
+ // }
+ // }
+ true
+ // }
}