/
member.go
170 lines (139 loc) · 4.43 KB
/
member.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package keeper
import (
"encoding/binary"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/gitopia/gitopia/v3/x/gitopia/types"
)
// GetMemberCount get the total number of member
func (k Keeper) GetMemberCount(ctx sdk.Context) uint64 {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.KeyPrefix(types.MemberCountKey)
bz := store.Get(byteKey)
// Count doesn't exist: no element
if bz == nil {
return 0
}
// Parse bytes
return binary.BigEndian.Uint64(bz)
}
// SetMemberCount set the total number of member
func (k Keeper) SetMemberCount(ctx sdk.Context, count uint64) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.KeyPrefix(types.MemberCountKey)
bz := make([]byte, 8)
binary.BigEndian.PutUint64(bz, count)
store.Set(byteKey, bz)
}
// AppendMember appends a member in the store with a new id and update the count
func (k Keeper) AppendMember(
ctx sdk.Context,
member types.Member,
) uint64 {
// Create the member
count := k.GetMemberCount(ctx)
// Set the ID of the appended value
member.Id = count
daoStore := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(member.DaoAddress)),
)
appendedValue := k.cdc.MustMarshal(&member)
daoStore.Set([]byte(member.Address), appendedValue)
k.SetUserDao(ctx, types.UserDao{
UserAddress: member.Address,
DaoAddress: member.DaoAddress,
})
// Update member count
k.SetMemberCount(ctx, count+1)
return count
}
// SetMember set a specific member in the store
func (k Keeper) SetMember(ctx sdk.Context, member types.Member) {
store := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(member.DaoAddress)),
)
b := k.cdc.MustMarshal(&member)
store.Set([]byte(member.Address), b)
}
// GetDaoMember returns a member from its id
func (k Keeper) GetDaoMember(ctx sdk.Context, daoAddress string, memberAddress string) (val types.Member, found bool) {
store := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(daoAddress)),
)
b := store.Get([]byte(memberAddress))
if b == nil {
return val, false
}
k.cdc.MustUnmarshal(b, &val)
return val, true
}
// RemoveDaoMember removes a member from the store
func (k Keeper) RemoveDaoMember(ctx sdk.Context, daoAddress string, memberAddress string) {
store := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(daoAddress)),
)
userDaoStore := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetUserDaoKeyForUserAddress(memberAddress)),
)
store.Delete([]byte(memberAddress))
userDaoStore.Delete([]byte(daoAddress))
}
// GetAllMember returns all member
func (k Keeper) GetAllMember(ctx sdk.Context) (list []types.Member) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.MemberKey))
iterator := sdk.KVStorePrefixIterator(store, []byte{})
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var val types.Member
k.cdc.MustUnmarshal(iterator.Value(), &val)
list = append(list, val)
}
return
}
// GetAllDaoMember returns all dao member
func (k Keeper) GetAllDaoMember(ctx sdk.Context, daoAddress string) (list []types.Member) {
store := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(daoAddress)),
)
iterator := sdk.KVStorePrefixIterator(store, []byte{})
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var val types.Member
k.cdc.MustUnmarshal(iterator.Value(), &val)
list = append(list, val)
}
return
}
// GetDaoOwner returns all dao owner
func (k Keeper) GetAllDaoOwner(ctx sdk.Context, daoAddress string) (list []types.Member) {
store := prefix.NewStore(
ctx.KVStore(k.storeKey),
types.KeyPrefix(types.GetMemberKeyForDaoAddress(daoAddress)),
)
iterator := sdk.KVStorePrefixIterator(store, []byte{})
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var val types.Member
k.cdc.MustUnmarshal(iterator.Value(), &val)
if val.Role == types.MemberRole_OWNER {
list = append(list, val)
}
}
return
}
// GetMemberIDBytes returns the byte representation of the ID
func GetMemberIDBytes(id uint64) []byte {
bz := make([]byte, 8)
binary.BigEndian.PutUint64(bz, id)
return bz
}
// GetMemberIDFromBytes returns ID in uint64 format from a byte array
func GetMemberIDFromBytes(bz []byte) uint64 {
return binary.BigEndian.Uint64(bz)
}