Search Apps Documentation Source Content File Folder Download Copy Actions Download

public_lock.gno

1.64 Kb · 60 lines
 1package boards2
 2
 3import (
 4	"chain"
 5	"strconv"
 6
 7	"gno.land/p/gnoland/boards"
 8)
 9
10// LockRealm locks the realm making it readonly.
11//
12// WARNING: Realm can't be unlocked once locked.
13//
14// Realm can also be locked without locking realm members.
15// Realm members can be locked when locking the realm or afterwards.
16// This is relevant for two reasons, one so that members can be modified after the lock.
17// The other is for realm owners, who can delete threads and comments after the lock.
18func LockRealm(cur realm, lockRealmMembers bool) {
19	assertRealmMembersAreNotLocked()
20
21	// If realm members are not being locked assert that realm is not locked.
22	// Members can be locked after locking the realm, in a second `LockRealm` call.
23	if !lockRealmMembers {
24		assertRealmIsNotLocked()
25	}
26
27	caller := cur.Previous().Address()
28	gPerms.WithPermission(caller, PermissionRealmLock, boards.Args{}, func() {
29		gLocked.realm = true
30		gLocked.realmMembers = lockRealmMembers
31
32		chain.Emit(
33			"RealmLocked",
34			"caller", caller.String(),
35			"lockRealmMembers", strconv.FormatBool(lockRealmMembers),
36		)
37	})
38}
39
40// IsRealmLocked checks if boards realm has been locked.
41func IsRealmLocked() bool {
42	return gLocked.realm
43}
44
45// AreRealmMembersLocked checks if realm members have been locked.
46func AreRealmMembersLocked() bool {
47	return gLocked.realmMembers
48}
49
50func assertRealmIsNotLocked() { // TODO: Add filtests for locked realm case to all public functions
51	if gLocked.realm {
52		panic("realm is locked")
53	}
54}
55
56func assertRealmMembersAreNotLocked() { // TODO: Add filtests for locked members case to all public member functions
57	if gLocked.realmMembers {
58		panic("realm and members are locked")
59	}
60}