# Subreddits zome ## User stories - An agent should be able to create a subreddit - An agent should be able to update the admins of the subreddit - A subreddit's admin should be able to update the subreddit's info - Any agent should be able to subscribe to a subreddit ## Entry structure This first anchor type is from [holochain_anchors](https://github.com/holochain/holochain_anchors) ```rust Entry "anchor" { struct Anchor { anchor_type: String, anchor_text: Option<String> } Links: { anchor->post agent_id->anchor|subscribed_to| anchor->agent_id|subscribers| } } Entry "subreddit" { struct Subreddit { name: String, admins: Vec<Address>, description: String, image: String, // base64 encoded last_header_address: Option<Address> // To avoid update entry cycles } Links: { anchor->subreddit|last_version| } } ``` Anchors will contain this: ```rust { anchor_type: "subreddit", anchor_text: "<SUBREDDIT_NAME>" } ``` > There is one piece of rivalrous data: the name of the subreddit. We cannot guarantee that only one subreddit entry with the same name will exist in the DHT (think network partitions), and we don't have the specific implementation of the DHT conflict resolution callback mechanism (will only work on updates...?, can also work on attaching links...?). > So in the future this needs to be updated, maybe to force agents to update an already existing entry that only contains the name, and thus triggering the conflict resolution callback. ## Entry relationship diagram ```mermaid graph TD subgraph postszome subgraph anchors all_subreddits-->holochain_anchor all_subreddits-->ethereum_anchor end subgraph agents alice_id-->|subscribed_to|holochain_anchor holochain_anchor-->|subscribers|alice_id end subgraph subreddits ethereum_anchor-->|last_version|ethereum_subredditv1 ethereum_anchor-->ethereum_subredditv0 ethereum_subredditv0==>ethereum_subredditv1 holochain_anchor-->holochain_subredditv0 end subgraph posts holochain_anchor-->post1 end end ``` ## Validation ### Entries * `anchors`: * Create is always valid * Update or Delete is not valid * `subreddit`: * Create or Update is valid if any of the agent_address signing it is contained inside the current administrator vector * Delete not valid ### Links * `anchor->subreddit`: * AddLink valid if is signed by any of the admins contained in the subreddit target entry * RemoveLink not valid * `agent_id->anchor` & `anchor->agent_id`: only valid if the agent is signing * `anchor->post` valid always since anyone can post and repost any post to any subreddit