admin.gno
2.69 Kb ยท 111 lines
1package users
2
3import (
4 "std"
5
6 "gno.land/r/gov/dao"
7 susers "gno.land/r/sys/users"
8)
9
10var paused = false // XXX: replace with p/moul/authz
11
12//----------------------------------------
13// Privileged mutators.
14
15func setPaused(newPausedValue bool) {
16 crossing()
17 paused = newPausedValue
18}
19
20func updateUsername(userData *susers.UserData, newName string) error {
21 crossing()
22 // UpdateName must be called from this realm.
23 return userData.UpdateName(newName)
24}
25
26func deleteUserdata(userData *susers.UserData) error {
27 crossing()
28 // Delete must be called from this realm.
29 return userData.Delete()
30}
31
32func setRegisterPrice(newPrice int64) {
33 crossing()
34 registerPrice = newPrice
35}
36
37//----------------------------------------
38// Public API
39
40// NewSetPausedExecutor allows GovDAO to pause or unpause this realm
41func NewSetPausedExecutor(newPausedValue bool) dao.ProposalRequest {
42 cb := func() error {
43 cross(setPaused)(newPausedValue)
44 return nil
45 }
46
47 e := dao.NewSimpleExecutor(cb, "")
48
49 return dao.NewProposalRequest("Pause users/v1 realm", "", e)
50}
51
52// ProposeNewName allows GovDAO to propose a new name for an existing user
53// The associated address and all previous names of a user that changes a name
54// are preserved, and all resolve to the new name.
55func ProposeNewName(addr std.Address, newName string) dao.ProposalRequest {
56 if matched := reUsername.MatchString(newName); !matched {
57 panic(ErrInvalidUsername)
58 }
59
60 userData := susers.ResolveAddress(addr)
61 if userData == nil {
62 panic(susers.ErrUserNotExistOrDeleted)
63 }
64
65 cb := func() error {
66 err := cross(updateUsername)(userData, newName)
67 return err
68 }
69
70 e := dao.NewSimpleExecutor(cb, "")
71
72 return dao.NewProposalRequest("Propose a new name using users/v1 realm", "", e)
73}
74
75// ProposeDeleteUser allows GovDAO to propose deletion of a user
76// This will make the associated address and names unresolvable.
77// WARN: After deletion, the same address WILL NOT be able to register a new name.
78func ProposeDeleteUser(addr std.Address, desc string) dao.ProposalRequest {
79 userData := susers.ResolveAddress(addr)
80 if userData == nil {
81 panic(susers.ErrUserNotExistOrDeleted)
82 }
83
84 cb := func() error {
85 return cross(deleteUserdata)(userData)
86 }
87
88 e := dao.NewSimpleExecutor(cb, "")
89
90 return dao.NewProposalRequest("Propose deleting a name using users/v1 realm", desc, e)
91}
92
93// ProposeNewRegisterPrice allows GovDAO to update the price of registration
94func ProposeNewRegisterPrice(newPrice int64) dao.ProposalRequest {
95 if newPrice < 0 {
96 panic("invalid price")
97 }
98
99 cb := func() error {
100 cross(setRegisterPrice)(newPrice)
101 return nil
102 }
103
104 e := dao.NewSimpleExecutor(cb, "")
105
106 return dao.NewProposalRequest(
107 "Propose change the price for name registration using users/v1 realm",
108 "",
109 e,
110 )
111}