-
Notifications
You must be signed in to change notification settings - Fork 44
/
genesis.go
113 lines (94 loc) · 3.23 KB
/
genesis.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
package keeper
import (
"github.com/desmos-labs/desmos/v4/x/subspaces/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// ExportGenesis returns the GenesisState associated with the given context
func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState {
subspaceID, err := k.GetSubspaceID(ctx)
if err != nil {
panic(err)
}
return types.NewGenesisState(
subspaceID,
k.getSubspacesData(ctx),
k.GetAllSubspaces(ctx),
k.GetAllSections(ctx),
k.GetAllPermissions(ctx),
k.GetAllUserGroups(ctx),
k.getAllUserGroupsMembers(ctx),
)
}
// getSubspacesData returns all the stored information for all subspaces
func (k Keeper) getSubspacesData(ctx sdk.Context) []types.SubspaceData {
var data []types.SubspaceData
k.IterateSubspaces(ctx, func(subspace types.Subspace) (stop bool) {
nextSectionID, err := k.GetNextSectionID(ctx, subspace.ID)
if err != nil {
panic(err)
}
nextGroupID, err := k.GetNextGroupID(ctx, subspace.ID)
if err != nil {
panic(err)
}
data = append(data, types.NewSubspaceData(subspace.ID, nextSectionID, nextGroupID))
return false
})
return data
}
// GetAllPermissions returns all the stored permissions for all subspaces
func (k Keeper) GetAllPermissions(ctx sdk.Context) []types.UserPermission {
var entries []types.UserPermission
k.IterateSubspaces(ctx, func(subspace types.Subspace) (stop bool) {
k.IterateSubspaceUserPermissions(ctx, subspace.ID, func(entry types.UserPermission) (stop bool) {
entries = append(entries, entry)
return false
})
return false
})
return entries
}
// getAllUserGroupsMembers returns all the stored user group members
func (k Keeper) getAllUserGroupsMembers(ctx sdk.Context) []types.UserGroupMemberEntry {
var entries []types.UserGroupMemberEntry
k.IterateUserGroupsMembers(ctx, func(entry types.UserGroupMemberEntry) (stop bool) {
// Skip group ID 0 to avoid exporting any member
if entry.GroupID == 0 {
return false
}
entries = append(entries, entry)
return false
})
return entries
}
// --------------------------------------------------------------------------------------------------------------------
// InitGenesis initializes the chain state based on the given GenesisState
func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) {
// Initialize the subspace id setting it to be the max id found + 1
k.SetSubspaceID(ctx, data.InitialSubspaceID)
// Initialize the subspaces data
for _, entry := range data.SubspacesData {
k.SetNextGroupID(ctx, entry.SubspaceID, entry.NextGroupID)
k.SetNextSectionID(ctx, entry.SubspaceID, entry.NextSectionID)
}
// Initialize the subspaces
for _, subspace := range data.Subspaces {
k.SaveSubspace(ctx, subspace)
}
// Initialize the sections
for _, section := range data.Sections {
k.SaveSection(ctx, section)
}
// Initialize the groups with default permission PermissionNothing
for _, group := range data.UserGroups {
k.SaveUserGroup(ctx, group)
}
// Initialize the group members
for _, entry := range data.UserGroupsMembers {
k.AddUserToGroup(ctx, entry.SubspaceID, entry.GroupID, entry.User)
}
// Initialize the permissions
for _, entry := range data.UserPermissions {
k.SetUserPermissions(ctx, entry.SubspaceID, entry.SectionID, entry.User, entry.Permissions)
}
}