# Aggregator Zome ###### tags: `Kizuna-architecture` <style> .ui-infobar, #doc.markdown-body { max-width: 1000px; } </style> ## Data Structure ```rust= // for contacts pub struct AgentPubKeys(pub Vec<AgentPubKey>); // for username pub struct UsernameInfo { username: String, agent_id: AgentPubKey, created_at: Timestamp, entry_header_hash: HeaderHash, } // for group pub struct GroupOutput { group_id: EntryHash, group_revision_id: HeaderHash, latest_name: String, members: Vec<AgentPubKey>, creator: AgentPubKey, created: Timestamp, // group_versions: Vec<Group>, } pub struct MyGroupListWrapper(pub Vec<GroupOutput>); // for group chat pub struct BatchSize(pub u8); pub struct GroupMessageHash(pub EntryHash); pub struct ReadList(pub HashMap<String, SystemTime>); pub struct GroupMessageElement(pub Element); pub struct GroupMessageContent(pub GroupMessageElement, pub ReadList); pub struct MessagesByGroup(pub HashMap<String, Vec<GroupMessageHash>>); pub struct GroupMessagesContents(pub HashMap<String, GroupMessageContent>); pub struct GroupMessagesOutput { messages_by_group: MessagesByGroup, group_messages_contents: GroupMessagesContents, } // for p2p chat pub struct P2PMessage { author: AgentPubKey, receiver: AgentPubKey, payload: Payload, time_sent: Timestamp, reply_to: Option<EntryHash>, } pub struct P2PMessageReceipt { id: EntryHash, status: Status, } pub enum Payload { Text { payload: String, }, File { metadata: FileMetadata, file_type: FileType, }, } pub struct FileMetadata { file_name: String, file_size: u8, file_type: FileType, file_hash: String, } pub enum FileType { Image { thumbnail: SerializedBytes }, Video { thumbnail: SerializedBytes }, Others, } pub enum Status { Sent, Delivered { timestamp: Timestamp }, Read { timestamp: Timestamp }, } pub struct AgentMessages(HashMap<String, Vec<String>>); pub struct MessageBundle(P2PMessage, Vec<String>); pub struct MessageContents(HashMap<String, MessageBundle>); pub struct ReceiptContents(HashMap<String, P2PMessageReceipt>); pub struct P2PMessageHashTables(AgentMessages, MessageContents, ReceiptContents); // for preference pub struct Preference { typing_indicator: bool, read_receipt: bool, } pub struct PerAgentPreference { typing_indicator: Vec<AgentPubKey>, read_receipt: Vec<AgentPubKey>, } pub struct PerGroupPreference { typing_indicator: Vec<String>, read_receipt: Vec<String>, } // the aggregated data from other zomes pub struct AggregatedLatestData { pub user_info: UsernameInfo, // retrieved from contacts zome pub added_contacts: Vec<AgentPubKey>, pub blocked_contacts: Vec<AgentPubKey>, // from group pub groups: MyGroupListWrapper, pub latest_group_messages: GroupMessagesOutput, // from p2pmessage pub latest_p2p_messages: P2PMessageHashTables, // from preference pub global_preference: Preference, pub per_agent_preference: PerAgentPreference, pub per_group_preference: PerGroupPreference, } ``` ## Zome Fn ```rust= fn retrieve_latest_data() -> ExternResult<AggregatedLatestData> ``` ```mermaid sequenceDiagram participant UI as user_interface participant UC as user_cell UI-->>UC: retrieve_latest_data() UC-->>UC: call() get_my_username() UC-->>UC: call() list_added() UC-->>UC: call() list_blocked() UC-->>UC: call() get_latest_p2p_messages() UC-->>UC: call() get_latest_group_messages UC-->>UC: call() get_preference UC-->>UC: call() get_per_agent_preference UC-->>UC: call() get_per_group_preference UC-->>UC: construct AggregatedLatestData UC-->>UI: AggregatedLatestData ```