actions.gno
3.79 Kb ยท 153 lines
1package basedao
2
3import (
4 "errors"
5
6 "gno.land/p/moul/md"
7 "gno.land/p/nt/ufmt"
8 "gno.land/p/samcrew/daokit"
9)
10
11// ADD MEMBER
12
13const ActionAddMemberKind = "gno.land/p/samcrew/basedao.AddMember"
14
15type ActionAddMember struct {
16 Address address
17 Roles []string
18}
19
20func (a *ActionAddMember) String() string {
21 return ufmt.Sprintf("Add member %s with roles %v", a.Address, a.Roles)
22}
23
24func NewAddMemberHandler(dao *DAOPrivate) daokit.ActionHandler {
25 return daokit.NewActionHandler(ActionAddMemberKind, func(ipayload interface{}) {
26 payload, ok := ipayload.(*ActionAddMember)
27 if !ok {
28 panic(errors.New("invalid payload type"))
29 }
30 dao.Members.AddMember(payload.Address.String(), payload.Roles)
31 })
32}
33
34func NewAddMemberAction(payload *ActionAddMember) daokit.Action {
35 return daokit.NewAction(ActionAddMemberKind, payload)
36}
37
38// REMOVE MEMBER
39
40const ActionRemoveMemberKind = "gno.land/p/samcrew/basedao.RemoveMember"
41
42func NewRemoveMemberHandler(dao *DAOPrivate) daokit.ActionHandler {
43 return daokit.NewActionHandler(ActionRemoveMemberKind, func(ipayload interface{}) {
44 addr, ok := ipayload.(address)
45 if !ok {
46 panic(errors.New("invalid payload type"))
47 }
48 dao.Members.RemoveMember(addr.String())
49 })
50}
51
52func NewRemoveMemberAction(addr address) daokit.Action {
53 return daokit.NewAction(ActionRemoveMemberKind, addr)
54}
55
56// ASSIGN ROLE
57
58const ActionAssignRoleKind = "gno.land/p/samcrew/basedao.AssignRole"
59
60type ActionAssignRole struct {
61 Address address
62 Role string
63}
64
65func (a *ActionAssignRole) String() string {
66 return ufmt.Sprintf("Assign role %q to user %s", a.Role, a.Address)
67}
68
69func NewAssignRoleHandler(dao *DAOPrivate) daokit.ActionHandler {
70 return daokit.NewActionHandler(ActionAssignRoleKind, func(i interface{}) {
71 payload, ok := i.(*ActionAssignRole)
72 if !ok {
73 panic(errors.New("invalid payload type"))
74 }
75 dao.Members.AddRoleToMember(payload.Address.String(), payload.Role)
76 })
77}
78
79func NewAssignRoleAction(payload *ActionAssignRole) daokit.Action {
80 return daokit.NewAction(ActionAssignRoleKind, payload)
81}
82
83// UNASSIGN ROLE
84
85const ActionUnassignRoleKind = "gno.land/p/samcrew/basedao.UnassignRole"
86
87type ActionUnassignRole struct {
88 Address address
89 Role string
90}
91
92func (a *ActionUnassignRole) String() string {
93 return ufmt.Sprintf("Remove role %q from user %s", a.Role, a.Address)
94}
95
96func NewUnassignRoleHandler(dao *DAOPrivate) daokit.ActionHandler {
97 return daokit.NewActionHandler(ActionUnassignRoleKind, func(i interface{}) {
98 payload, ok := i.(*ActionUnassignRole)
99 if !ok {
100 panic(errors.New("invalid payload type"))
101 }
102 dao.Members.RemoveRoleFromMember(payload.Address.String(), payload.Role)
103 })
104}
105
106func NewUnassignRoleAction(payload *ActionUnassignRole) daokit.Action {
107 return daokit.NewAction(ActionUnassignRoleKind, payload)
108}
109
110// EDIT PROFILE
111
112const ActionEditProfileKind = "gno.land/p/samcrew/basedao.EditProfile"
113
114type ActionEditProfile struct {
115 kv [][2]string
116}
117
118func (a *ActionEditProfile) String() string {
119 elems := []string{}
120 for _, v := range a.kv {
121 elems = append(elems, v[0]+": "+v[1])
122 }
123 return md.BulletList(elems)
124}
125
126func NewEditProfileAction(kv ...[2]string) daokit.Action {
127 return daokit.NewAction(ActionEditProfileKind, &ActionEditProfile{kv: kv})
128}
129
130func NewEditProfileHandler(setter ProfileStringSetter, allowedFields []string) daokit.ActionHandler {
131 return daokit.NewActionHandler(ActionEditProfileKind, func(i interface{}) {
132 action, ok := i.(*ActionEditProfile)
133 if !ok {
134 panic(errors.New("invalid action type"))
135 }
136 for _, elem := range action.kv {
137 k, v := elem[0], elem[1]
138 if len(allowedFields) > 0 && !stringSliceContains(allowedFields, k) {
139 panic(ufmt.Errorf("unauthorized field %q", k))
140 }
141 setter(cross, k, v)
142 }
143 })
144}
145
146func stringSliceContains(s []string, target string) bool {
147 for _, elem := range s {
148 if elem == target {
149 return true
150 }
151 }
152 return false
153}