Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}