#role #holochain #applications #pattern #dna #dynamic #agent

夜间 holochain_roles

一个用于帮助hApps通过祖先模式将角色添加到其DNA的crate。

8个发布版

0.1.7 2020年2月19日
0.1.6 2020年2月18日

#53 in #role

自定义许可GPL-3.0-only

22KB
316

holochain_roles

通用的holochain混入,用于在任何holochain应用程序中包含管理员和动态角色,使用祖先模式。

此混入旨在针对 hc v0.0.42-alpha3。它还依赖于holochain_anchors存在并配置。

设计

以下是此混入的设计:https://hackmd.io/6xfwfSVYSGeZe3vQ_-1cWw?view

文档

在此处可以找到此混入的文档:https://docs.rs/holochain_roles

安装

将以下内容添加到您的zome cargo toml中。

holochain_anchors = "0.2.1"
holochain_roles = "0.1.7"

使用

设置

将锚点条目定义添加到您的zome中。

 #[entry_def]
fn anchor_def() -> ValidatingEntryType {
    holochain_anchors::anchor_definition()
}

将角色条目定义添加到您的zome中。

 #[entry_def]
fn roles_def() -> ValidatingEntryType {
    holochain_roles::role_assignment_entry_def()
}

分配一个角色

要分配一个角色,只需调用assign_role函数

#[zome_fn("hc_public")]
fn some_other_public_function(agent_address: Address) {
    let my_role_name = String::from("editor");

    holochain_roles::handlers::assign_role(&my_role_name, &agent_address)?;
    ...
}

分配管理员

只有具有管理员角色或DNA的祖先的代理可以分配或取消分配角色。要分配管理员角色,请使用导入的管理员角色名称调用assign_role函数

#[zome_fn("hc_public")]
fn some_other_public_function(agent_address: Address) {
    let my_role_name = String::from(holochain_roles::ADMIN_ROLE_NAME);

    holochain_roles::handlers::assign_role(&my_role_name, &agent_address)?;
    ...
}

检查用户是否目前拥有某个角色

要检查用户是否具有某个角色,您可以使用验证has_agent_role函数

validation: | _validation_data: hdk::EntryValidationData<MyEntry>| {
    match _validation_data {
        hdk::EntryValidationData::Create { entry, validation_data } => {
            let agent_address = &validation_data.sources()[0];
            let is_agent_permitted_to_create_this_entry = holochain_roles::validaton::has_agent_role(&agent_address, String::from("editor"))?;

            if !is_agent_permitted_to_create_this_entry {
                return Err(String::from("Only editors can create a new entry"));
            }
            ...

        }
    }
}

检查用户在某个时间点是否拥有某个角色

要检查用户是否具有某个角色,您有两个选择

  • 使用验证validate_required_role函数,如果用户在提交条目时没有给定角色,它将返回错误
validation: | _validation_data: hdk::EntryValidationData<MyEntry>| {
    match _validation_data {
        hdk::EntryValidationData::Create { validation_data } => {
            holochain_roles::validaton::validate_require_role(&validation_data, String::from("editor"))?;

            ...
        }
    }
}
  • 使用验证has_agent_role函数
validation: | _validation_data: hdk::EntryValidationData<MyEntry>| {
    match _validation_data {
        hdk::EntryValidationData::Create { entry, validation_data } => {
            let agent_address = &validation_data.sources()[0];
            let timestamp = &validation_data.package.chain_header.timestamp();
            let is_agent_permitted_to_create_this_entry = holochain_roles::validaton::had_agent_role(&agent_address, String::from("editor"), timestamp)?;

            if !is_agent_permitted_to_create_this_entry {
                return Err(String::from("Only editors can create a new entry"));
            }
            ...

        }
    }
}

获取代理的所有角色分配

要获取特定代理的所有角色分配,您可以使用验证函数 get_agent_roles

#[zome_fn("hc_public")]
fn some_public_function(agent_address: Address) {
    let roles: Vec<String> = holochain_roles::handlers::get_agent_roles(&agent_address)?;
}

获取分配了特定角色的所有代理

要获取特定代理的所有角色分配,您可以使用验证函数 get_role_agents

#[zome_fn("hc_public")]
fn some_public_function(role_name: String) {
    let agents: Vec<Address> = holochain_roles::handlers::get_role_agents(&role_name)?;
}

取消分配角色

要取消分配角色,只需调用 unassign_role 函数

#[zome_fn("hc_public")]
fn some_other_public_function(agent_address: Address) {
    let my_role_name = String::from("editor");

    holochain_roles::handlers::unassign_role(&my_role_name, &agent_address)?;
    ...
}

依赖项

~18–27MB
~448K SLoC