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}