channel Signup {
out accounts(acDB:Map, signUp(aid:Str)) = insert(acDB, aid, {"notifications": nil})
}
channel HasRead(aid:Str) {
out accounts.{aid}.notifications(ntMap:Map, hasRead(gid:Str)) = delete(ntMap, gid)
}
channel CreateGroup {
out groups(grDB:Map, createGroup(gid:Str)) = insert(grDB, gid, {"members": nil, "messages": nil})
}
channel AddGroupMember(gid:Str) {
out groups.{gid}.members(memList:List, addGroupMember(aid:Str)) = append(memList, aid)
}
channel PostMessage(gid:Str) {
out groups.{gid}.messages(mesList:List, postMessage(message:Str)) = append(mesList, message)
}
channel Notify(gid:Str) {
in groups.{gid}.messages(prevMesList, notify(m)) = mesList
for EachMember(mno:Int) {
ref groups.{gid}.members.{mno}(m.{mno}:Str, notify(m))
out accounts.{m.{mno}:Str}.notifications(prevNtMap:Map, notify(m)) = insert(prevNtMap, gid, true)
}
}