permissions.gno

package permissions

import (
	"chain/runtime"

	"gno.land/p/gnoland/boards/exts/permissions"

	"gno.land/r/gnoland/boards2/v1"
)

var (
	// Admin is the address of the current realm admin.
	Admin address = "g1rp7cmetn27eqlpjpc4vuusf8kaj746tysc0qgh" // GovDAO T1 multisig

	// OpenAccountAmount is the ugnot required in an account for open board interactions.
	// This requirement is only for non board members.
	OpenAccountAmount int64 = 3_000_000_000
)

// SetAdmin sets a new realm admin address.
func SetAdmin(_ realm, admin address) {
	caller := runtime.PreviousRealm().Address()
	if caller != Admin {
		panic("unauthorized")
	}

	Admin = admin
}

// SetOpenAccountAmount sets the required amount in ugnot for open board interactions.
func SetOpenAccountAmount(_ realm, amount int64) {
	caller := runtime.PreviousRealm().Address()
	if caller != Admin {
		panic("unauthorized")
	}

	if amount < 0 {
		panic("invalid amount")
	}

	OpenAccountAmount = amount
}

// New creates custom permissions for open boards.
func New(owner address) *permissions.Permissions {
	perms := permissions.New(
		permissions.UseSingleUserRole(),
		permissions.WithSuperRole(boards2.RoleOwner),
	)
	perms.SetPublicPermissions(
		boards2.PermissionThreadCreate,
		boards2.PermissionThreadRepost,
		boards2.PermissionReplyCreate,
	)
	perms.AddRole(
		boards2.RoleAdmin,
		boards2.PermissionBoardRename,
		boards2.PermissionBoardFlaggingUpdate,
		boards2.PermissionMemberInvite,
		boards2.PermissionMemberInviteRevoke,
		boards2.PermissionMemberRemove,
		boards2.PermissionThreadCreate,
		boards2.PermissionThreadEdit,
		boards2.PermissionThreadDelete,
		boards2.PermissionThreadRepost,
		boards2.PermissionThreadFlag,
		boards2.PermissionThreadFreeze,
		boards2.PermissionReplyCreate,
		boards2.PermissionReplyDelete,
		boards2.PermissionReplyFlag,
		boards2.PermissionRoleChange,
		boards2.PermissionUserBan,
		boards2.PermissionUserUnban,
	)
	perms.AddRole(
		boards2.RoleModerator,
		boards2.PermissionThreadCreate,
		boards2.PermissionThreadEdit,
		boards2.PermissionThreadRepost,
		boards2.PermissionThreadFlag,
		boards2.PermissionReplyCreate,
		boards2.PermissionReplyFlag,
		boards2.PermissionUserBan,
		boards2.PermissionUserUnban,
	)
	perms.AddRole(
		boards2.RoleGuest,
		boards2.PermissionThreadRepost,
		boards2.PermissionReplyCreate,
	)
	perms.SetUserRoles(owner, boards2.RoleOwner)
	perms.ValidateFunc(boards2.PermissionBoardRename, validateOpenBoardRename)
	perms.ValidateFunc(boards2.PermissionMemberInvite, validateOpenMemberInvite)
	perms.ValidateFunc(boards2.PermissionRoleChange, validateOpenRoleChange)
	perms.ValidateFunc(boards2.PermissionThreadCreate, validateOpenThreadCreate)
	perms.ValidateFunc(boards2.PermissionReplyCreate, validateOpenReplyCreate)
	return perms
}