#role #holochain #applications #mixin #dynamic #pattern #generic

nightly hc_roles_mixin

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

5个版本

0.1.4 2020年2月1日
0.1.3 2020年1月27日
0.1.2 2020年1月27日
0.1.1 2020年1月27日
0.1.0 2020年1月27日

#50 in #role

自定义许可证GPL-3.0-only

13KB
168

hc_roles_mixin

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

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

已知问题:由于更新条目未传播,此混入实际上在真实环境中无法工作,因为它依赖于角色条目的更新在整个网络中传播。

设计

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

文档

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

安装

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

holochain_anchors = "0.2.1"
hc_roles_mixin = "0.1.3"

用法

设置

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

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

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

 #[entry_def]
fn roles_def() -> ValidatingEntryType {
    hc_roles_mixin::role_entry_def()
}

在您的 init 函数中,创建 Admin 角色

#[init]
fn init() {
    hc_roles_mixin::handlers::create_admin_role()?;
    Ok(())
}

创建角色

要创建角色,请简单地调用 create_role 函数

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

    hc_roles_mixin::handlers::create_role(&my_role_name)?;
    ...
}

分配角色

要分配角色,请简单地调用 assign_role 函数

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

    hc_roles_mixin::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 = hc_roles_mixin::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"));
            }
            ...
            

取消分配角色

要取消分配角色,请简单地调用 unassign_role 函数

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

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

依赖关系

~21–30MB
~492K SLoC