Skip to main content

kcode_k1_groups/
lib.rs

1use std::{path::Path, sync::Arc};
2
3use kcode_k1_groups_driver::K1GroupsDriver;
4use kcode_k1_groups_projection::Projection;
5use kcode_k1_peering::K1Peering;
6use kcode_k1_txn_ordering::K1TxnOrdering;
7
8pub use kcode_k1_groups_projection::{
9    ALL_MODELS, ALL_USERS, Group, GroupId, GroupMemberships, GroupName, GroupRevision, GroupRole,
10    GroupUser, LOCAL_MODELS, ModelId, SentinelGroup, TxId, UserId,
11};
12
13pub struct K1Groups {
14    driver: K1GroupsDriver,
15}
16
17impl K1Groups {
18    pub fn open(
19        root: &Path,
20        ordering: Arc<K1TxnOrdering>,
21        peering: Arc<K1Peering>,
22    ) -> Result<Self, String> {
23        let (projection, checkpoint) = Projection::open(root, &ordering)?;
24        let projection = Arc::new(projection);
25        let driver = K1GroupsDriver::register(projection, checkpoint, ordering, peering)?;
26        Ok(Self { driver })
27    }
28
29    pub fn create(&self, owner: UserId, name: GroupName) -> Result<GroupRevision, String> {
30        self.driver.create(owner, name)
31    }
32
33    pub fn rename(
34        &self,
35        actor: UserId,
36        group: GroupId,
37        name: GroupName,
38    ) -> Result<GroupRevision, String> {
39        self.driver.rename(actor, group, name)
40    }
41
42    pub fn set_user_role(
43        &self,
44        actor: UserId,
45        group: GroupId,
46        user: UserId,
47        role: Option<GroupRole>,
48    ) -> Result<GroupRevision, String> {
49        self.driver.set_user_role(actor, group, user, role)
50    }
51
52    pub fn set_model_membership(
53        &self,
54        actor: UserId,
55        group: GroupId,
56        model: ModelId,
57        present: bool,
58    ) -> Result<GroupRevision, String> {
59        self.driver
60            .set_model_membership(actor, group, model, present)
61    }
62
63    pub fn get(&self, group: GroupId) -> Result<Option<Group>, String> {
64        self.driver.get(group)
65    }
66
67    pub fn groups_for_user(&self, user: UserId) -> Result<Vec<GroupId>, String> {
68        self.driver.groups_for_user(user)
69    }
70
71    pub fn groups_for_model(&self, model: ModelId) -> Result<Vec<GroupId>, String> {
72        self.driver.groups_for_model(model)
73    }
74
75    pub fn memberships(&self, user: UserId, model: ModelId) -> Result<GroupMemberships, String> {
76        self.driver.memberships(user, model)
77    }
78}