# Voting happ
> Note: this is a very minimal design for an application. Usually you'll need more DNA/zomes and complexity to cover all that you need to cover your use case
[TOC]
# Requirements
Use case: A local community group (e.g. neighborhood association, local cooperative, etc.) needs to pass a couple resolutions and have a clear tally of votes by the end of the week. All members of the app are all able to vote so you’ll want to restrict membership to community members.
Scale: less than 500 people
Time: Deadline vote by end of week
Secrecy: Vote content does not need to be hidden
# DNAs
## Voting DNA
- Membrane: closed membrane, members can join only (vetted by 1 other member).
### Posts zome
Simple Diagram:
```graphviz
digraph g {
node [
fontsize = "16"
shape = "record"
];
// Maybe this with timestamp mods?
"resolution" [label="{Resolution | { description | author | endtime | timestamp }}"]
"vote" [label="{Vote | { Yes/No | timestamp }}"]
"member" [label="{Member | { name | timestamp }}"]
"member"->"member" [label="vetted"]
"member"->"vote" [label=""]
"vote"->"resolution" [label=""]
"member"->"resolution" [label="propose"]
}
```
Entry Relationship Diagram Example:
```graphviz
digraph g {
node [
fontsize = "16"
shape = "record"
];
// Maybe this with timestamp mods?
"resolution" [label="{Resolution | { description | author | endtime | timestamp }}"]
"resolution2" [label="{Resolution 2 | { description | author | endtime | timestamp }}"]
"vote" [label="{Vote | { Yes/No | timestamp }}"]
"vote2" [label="{Vote | { Yes/No | timestamp }}"]
"vote3" [label="{Vote | { Yes/No | timestamp }}"]
"vote4" [label="{Vote | { Yes/No | timestamp }}"]
"vote5" [label="{Vote | { Yes/No | timestamp }}"]
"vote6" [label="{Vote | { Yes/No | timestamp }}"]
"member" [label="{Original Member | { name | timestamp }}"]
"member2" [label="{Member 2 | { name | timestamp }}"]
"member3" [label="{Member 3 | { name | timestamp }}"]
"member"->"member2" [label="vetted"]
"member2"->"member3" [label="vetted"]
"member"->"vote" [label=""]
"vote"->"resolution" [label=""]
"member2"->"vote2" [label=""]
"vote2"->"resolution" [label=""]
"member3"->"vote3" [label=""]
"vote3"->"resolution" [label=""]
"member"->"vote4" [label=""]
"vote4"->"resolution2" [label=""]
"member2"->"vote5" [label=""]
"vote5"->"resolution2" [label=""]
"member3"->"vote6" [label=""]
"vote6"->"resolution2" [label=""]
"member"->"resolution" [label="propose"]
"member2"->"resolution2" [label="propose"]
}
```
When querying by time, you can first get all the paths that are
#### Validation
Entries
* `resolution`:
* Create:
* Check that the member is vetted by at least one other member
* Update or Delete:
* Check that the author of the update or delete element matches the author of the original element.
* `vote`:
* Create:
* Check that the member is vetted by at least one other member & that only one vote for this resolution has been made by this member and it is before final time
* Update or Delete:
* Check that the author of the update or delete element matches the author of the original element.
Links?
* `path->vote->resolution`:
* CreateLink and DeleteLink:
* Get target resolution of link
* Check that post.author matches link.author
#### Signals
- Every time someone creates resolution, the UI will receive a signal:
- Every time someone votes, the UI will receive a signal:
```
{
"post_hash": <POST_HASH>,
"agent_pub_key": <AGENT_PUB_KEY>,
"action": "LIKE"
}
```