# Group Roles (Same DHT)
###### tags: `Kizuna-architecture`
## User Story
- [As an admin, I want to remove a member from the group so that I can control members of the group](https://beyonder.atlassian.net/browse/KIZUNA-74)
- [As an admin, I want to add a member to the group so that that user can join in the conversation](https://beyonder.atlassian.net/browse/KIZUNA-71)
## Comments/todo/questions
- this design assumes synchronicity among agents
- no error handling yet
- It's better to use events sourced pattern (change the entry structure)
- We need to achieve idempotency. i.e. even if some agents did not successfully get notified to join the the group should, the invited agent should still be able to join. The other agents should be notified later again.
- How do we update shared keys when a member joins or leave(or do we have pairwise keys with every member?)
- newly joined agents wont probably be able to read the messages sent before
## Entry Definitions
```rust
struct Group {
uuid: String,
name: String,
created: Timestamp,
creator: AgentPubKey, // for now this is the only admin
members: Vec<AgentPubKey>
}
// private entry commited in source chain
pub struct Groups {
group: Vec<Group>,
blocked: Vec<Group>
}
```
#### Add Flow
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ALD as Alice_Lobby_DNA
participant BUI as Bobby_UI
participant BLD as Bobby_Lobby_DNA
participant CUI as Charlie_UI
participant CLD as Charlie_Lobby_DNA
participant DUI as Diego_UI
participant DLD as Diego_Lobby_DNA
participant LDHT as Lobby_DHT
AUI-->>AUI: invite diego to the group
AUI-->>ALD: call add_member with agentpubkey of diego and the groupinfo
alt capgrant available
par alice to bob
ALD-->>BLD: call_remote add_member
BLD-->>BLD: update group and add diego's pubkey to receivers
BLD-->>ALD: return add sucess
and alice to charlie
note right of CLD: same process
end
ALD-->>DLD: notify join in a group
DLD-->>DUI: emit_signal that group was joined
DUI-->>DUI: show the accept, delete, block banner
end
```
#### Remove Flow
```mermaid
sequenceDiagram
participant AUI as Alice_UI
participant ALD as Alice_Lobby_DNA
participant BUI as Bobby_UI
participant BLD as Bobby_Lobby_DNA
participant CUI as Charlie_UI
participant CLD as Charlie_Lobby_DNA
participant DUI as Diego_UI
participant DLD as Diego_Lobby_DNA
participant LDHT as Lobby_DHT
AUI-->>AUI: remove diego from the group
AUI-->>ALD: call remove_member with agentpubkey of diego and the groupinfo
alt capgrant available
par alice to bob
ALD-->>BLD: call_remote remove_member
BLD-->>BLD: update group and remove diego's pubkey
BLD-->>ALD: return remove sucess
and alice to charlie
note right of CLD: same process
end
ALD-->>DLD: call_remote remove_from_group
DLD-->>DLD: remove cap_grant of admin for add_member and remove_member and remove_from_group
DLD-->>DLD: remove group from Groups
DLD-->>DUI: emit_signal that group was removed
DUI-->>DUI: disable send chat to that group
end
```