# Roles
### Cliff notes
Kizuna role need
- pin message
- add member
- update group name
- update group avatar
- remove member
- send message
- react message
- reply to message
## role creation general flow

## Entry Structure
```rust=
pub struct RoleImage(SerializedBytes)
pub struct Role {
role_name: String,
image: EntryHash,
role_color: String,
}
pub struct Permission {
zome_name: ZomeName,
zome_id: ZomeId,
function_name: FunctionName,
}
```
## ERD
```mermaid
graph TD
subgraph group_zome
subgraph path
all_roles_path
all_permissions_path
all_permissions_path-->group_zome_path
all_permissions_path-->p2p_zome_path
end
subgraph role_entry
all_roles_path-->admin_role
all_roles_path-->guest_role
all_roles_path-->everyone_role
end
subgraph role_image_entry
admin_role.->admin_role_image
guest_role.->guest_role_image
admin_role_image-->admin_role_image_v2
admin_role_image-->admin_role_image_v3
end
subgraph permissions
group_zome_path-->add_member_permission
group_zome_path-->create_role_permission
p2p_zome_path-->pin_message_permission
admin_role.->add_member_permission
admin_role.->create_role_permission
end
subgraph agents
alice-->|has_role|admin_role
bobby-->|has_role|guest_role
diego-->|has_role|everyone_role
admin_role-->|holder|alice
guest_role-->|holder|bobby
everyone_role-->|holder|diego
end
end
```
## Zome Fn
### create_role
```rust
struct CreateRoleInput {
role_name: String,
image: String, // EntryHash of RoleImage
role_color: String,
permissions: BTreeMap<String, Permission>
}
pub fn create_role(input: CreateRoleInput) -> ExternResult<Role>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: get permissions to make sure they exist
ACD-->>ADHT: create role image entry
ACD-->>ADHT: create role entry
ACD-->>AUI: return Role
```
### update_role
```rust
struct UpdateRoleInput {
role_name: Option<String>,
image: Option<String>,
role_color: Option<String>,
permissions: BTreeMap<String, Permission>
}
pub fn update_role(input: UpdateRoleInput) -> ExternResult<Role>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: update input
opt if image is Some
ACD-->>ADHT: update role image entry
ACD-->>ADHT: update role entry
end
ACD-->>ADHT: get permissions to make sure they exist
ACD-->>ADHT: update role entry
ACD-->>AUI: return Role
```
### assign_role
```rust
struct AssignRoleInput {
role_id: String // EntryHash of Role
assignee: Vec<AgentPubKey>
}
pub fn assign_role(input: AssignRoleInput) -> ExternResult<bool>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: get the role to make sure they exist
loop for all agents
ACD-->>ADHT: create link base agent and target role
ACD-->>ADHT: create link base role and target agent
end
ACD-->>AUI: return true
```
### deassign_role
```rust
struct DeassignRoleInput {
role_id: String // EntryHash of Role
assignee: Vec<AgentPubKey>
}
pub fn deassign_role(input: DeassignRoleInput) -> ExternResult<bool>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: get the role to make sure they exist
loop for all agents
ACD-->>ADHT: get links base agent and target role
ACD-->>ADHT: remove link base role and target agent
ACD-->>ADHT: remove link base agent and target role
end
ACD-->>AUI: return true
```
### delete_role(?)
```rust
struct DeleteRoleInput {
role_id: String, // EntryHash of Role
}
pub fn delete_role(input: DeleteRoleInput) -> ExternResult<bool>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: get the role to make sure they exist
ACD-->>ADHT: get links "has_role"
loop for all links
ACD-->>ADHT: remove links base agent and target role
ACD-->>ADHT: remove link base role and target agent
end
ACD-->>ADHT: remove path link
ACD-->>ADHT: remove entry role
ACD-->>AUI: return true
```
### get_all_roles
```rust
pub fn list_all_roles(_: ()) -> ExternResult<Vec<Role>>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: get links from all roles path
loop for all links
ACD-->>ADHT: get role entry
end
ACD-->>AUI: return Roles
```
### get_all_member_roles
```rust
struct RoleWithMembers {
role_name: String,
image: EntryHash,
role_color: String,
members: Vec<AgentPubKey>
}
pub fn list_all_member_roles(_: ()) -> ExternResult<HashMap<String, RoleWithMembers>>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
ACD-->>ADHT: get links from all roles path
loop for all links
ACD-->>ADHT: get role entry
end
loop for each Role
ACD-->>ADHT: get links "holder"
end
ACD-->>ACD: construct return value
ACD-->>AUI: return HashMap
```
### get_my_roles
```rust
pub fn get_my_roles(_: ()) -> ExternResult<Vec<Role>>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
ACD-->>ADHT: get links base AgentPubKey "has_role"
loop for all links
ACD-->>ADHT: get Role entry
end
ACD-->>ACD: construct return value
ACD-->>AUI: return Roles
```
### create_permissions
```rust
pub struct Permission {
zome_name: String,
function_name: String,
}
pub fn create_permission(input: Vec<Permission>) -> ExternResult<Vec<Permission>>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
AUI-->>ACD: input
ACD-->>ADHT: create all permissions path
ACD-->>ADHT: create all zome permission path as children
loop for all permissions input
ACD-->>ADHT: create Permission entry
ACD-->>ADHT: create link Permission entry zome path
end
ACD-->>AUI: return vector Permission
```
### list_all_permissions
```rust
struct PermissionQueryInput {
zome_id: Option<ZomeId>
}
pub fn list_all_permissions(input: PermissionQueryInput -> ExternResult<Vec<Permission>>
```
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ACD as Alice_Cell
participant ADHT as DHT
ACD-->>ADHT: get links from all permissions path
alt zome_id in input is None
loop for each zome path
ACD-->>ADHT: get all links
loop for each link
ACD-->>ADHT: get Permission entry
end
end
else zome_id in input is !None
ACD-->>ADHT: get all links for the zome id given
loop for each link
ACD-->>ADHT: get Permission entry
end
end
ACD-->>ADHT: construct return value
ACD-->>AUI: return vector Permission
```