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}