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