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}