44 "std"
55
66 "gno.land/p/demo/avl"
7+ "gno.land/p/demo/json"
78 "gno.land/p/teritori/role_manager"
89)
910
@@ -17,6 +18,9 @@ type Member struct {
1718 Roles []string
1819}
1920
21+ const EventAddMember = "BaseDAOAddMember"
22+ const EventRemoveMember = "BaseDAORemoveMember"
23+
2024func NewMembersStore(initialRoles []role_manager.RoleInfo, initialMembers []Member) *MembersStore {
2125 res := &MembersStore{
2226 RoleManager: role_manager.New(),
@@ -76,6 +80,11 @@ func (m *MembersStore) setRoles(roles []role_manager.RoleInfo) {
7680
7781func (m *MembersStore) setMembers(members []Member) {
7882 for _, member := range members {
83+ if ok := m.Members.Has(member.Address); !ok {
84+ std.Emit(EventAddMember,
85+ "address", member.Address,
86+ )
87+ }
7988 m.Members.Set(member.Address, struct{}{})
8089 for _, role := range member.Roles {
8190 m.RoleManager.AddRoleToUser(std.Address(member.Address), role)
@@ -87,6 +96,9 @@ func (m *MembersStore) AddMember(member string, roles []string) {
8796 if m.IsMember(member) {
8897 panic("member already exists")
8998 }
99+ std.Emit(EventAddMember,
100+ "address", member,
101+ )
90102 m.Members.Set(member, struct{}{})
91103 for _, role := range roles {
92104 m.RoleManager.AddRoleToUser(std.Address(member), role)
@@ -97,6 +109,9 @@ func (m *MembersStore) RemoveMember(member string) {
97109 if !m.IsMember(member) {
98110 panic("member does not exist")
99111 }
112+ std.Emit(EventRemoveMember,
113+ "address", member,
114+ )
100115 m.Members.Remove(member)
101116 m.RoleManager.RemoveAllRolesFromUser(std.Address(member))
102117}
@@ -126,3 +141,24 @@ func (m *MembersStore) RemoveRoleFromMember(member string, role string) {
126141 }
127142 m.RoleManager.RemoveRoleFromUser(std.Address(member), role)
128143}
144+
145+ func (m *MembersStore) GetMembersJSON() string {
146+ // XXX: replace with protoc-gen-gno
147+ members := []*json.Node{}
148+ for _, memberID := range m.GetMembers() {
149+ roles := []*json.Node{}
150+ for _, role := range m.GetMemberRoles(memberID) {
151+ roles = append(roles, json.StringNode("", role))
152+ }
153+ members = append(members, json.ObjectNode("", map[string]*json.Node{
154+ "address": json.StringNode("", memberID),
155+ "roles": json.ArrayNode("", roles),
156+ }))
157+ }
158+ node := json.ArrayNode("", members)
159+ bz, err := json.Marshal(node)
160+ if err != nil {
161+ panic(err)
162+ }
163+ return string(bz)
164+ }
0 commit comments