kcode-k1-web-code-authority 0.1.0

Authorize current workspace access to K1 Web families
Documentation
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))
}