use kcode_k1_access::{AccessContext, Authority};
use kcode_k1_groups::{GroupId, K1Groups, TxId};
use kcode_k1_web_package::WebFamily;
pub fn authorize_workspace(
context: &AccessContext,
groups: &K1Groups,
family: &WebFamily,
) -> Result<bool, String> {
let web_bytes = *family.authority().transaction_id().as_bytes();
let authority = TxId::from_bytes(web_bytes);
let user = context.user();
if authority.as_bytes() == user.as_tx_id().as_bytes() {
return Ok(!context.filter().contains(Authority::User(user)));
}
let group = GroupId::new(authority);
if group.sentinel().is_some() || context.filter().contains(Authority::Group(group)) {
return Ok(false);
}
let memberships = groups.memberships(user, context.model())?;
Ok(memberships.user_groups().contains(&group) && memberships.model_groups().contains(&group))
}