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