Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}