8个发布版
0.1.7 | 2020年2月19日 |
---|---|
0.1.6 | 2020年2月18日 |
#53 in #role
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