public_freeze.gno
2.51 Kb ยท 102 lines
1package boards2
2
3import (
4 "chain"
5 "chain/runtime"
6 "strconv"
7
8 "gno.land/p/gnoland/boards"
9
10 "gno.land/r/gnoland/boards2/v1/permissions"
11)
12
13// FreezeBoard freezes a board so no more threads and comments can be created or modified.
14func FreezeBoard(_ realm, boardID boards.ID) {
15 setBoardReadonly(boardID, true)
16}
17
18// UnfreezeBoard removes frozen status from a board.
19func UnfreezeBoard(_ realm, boardID boards.ID) {
20 setBoardReadonly(boardID, false)
21}
22
23// IsBoardFrozen checks if a board has been frozen.
24func IsBoardFrozen(boardID boards.ID) bool {
25 board := mustGetBoard(boardID)
26 return board.Readonly
27}
28
29// FreezeThread freezes a thread so thread cannot be replied, modified or deleted.
30//
31// Fails if board is frozen.
32func FreezeThread(_ realm, boardID, threadID boards.ID) {
33 setThreadReadonly(boardID, threadID, true)
34}
35
36// UnfreezeThread removes frozen status from a thread.
37//
38// Fails if board is frozen.
39func UnfreezeThread(_ realm, boardID, threadID boards.ID) {
40 setThreadReadonly(boardID, threadID, false)
41}
42
43// IsThreadFrozen checks if a thread has been frozen.
44//
45// Returns true if board is frozen.
46func IsThreadFrozen(boardID, threadID boards.ID) bool {
47 board := mustGetBoard(boardID)
48 thread := mustGetThread(board, threadID)
49 return board.Readonly || thread.Readonly
50}
51
52func setBoardReadonly(boardID boards.ID, readonly bool) {
53 assertRealmIsNotLocked()
54
55 board := mustGetBoard(boardID)
56 if readonly {
57 assertBoardIsNotFrozen(board)
58 }
59
60 caller := runtime.PreviousRealm().Address()
61 args := boards.Args{caller, board.ID, readonly}
62 board.Permissions.WithPermission(cross, caller, permissions.PermissionBoardFreeze, args, func(realm) {
63 assertRealmIsNotLocked()
64
65 board.Readonly = readonly
66
67 chain.Emit(
68 "BoardFreeze",
69 "caller", caller.String(),
70 "boardID", board.ID.String(),
71 "frozen", strconv.FormatBool(readonly),
72 )
73 })
74}
75
76func setThreadReadonly(boardID, threadID boards.ID, readonly bool) {
77 assertRealmIsNotLocked()
78
79 board := mustGetBoard(boardID)
80 assertBoardIsNotFrozen(board)
81
82 thread := mustGetThread(board, threadID)
83 if readonly {
84 assertThreadIsNotFrozen(thread)
85 }
86
87 caller := runtime.PreviousRealm().Address()
88 args := boards.Args{caller, board.ID, thread.ID, readonly}
89 board.Permissions.WithPermission(cross, caller, permissions.PermissionThreadFreeze, args, func(realm) {
90 assertRealmIsNotLocked()
91
92 thread.Readonly = readonly
93
94 chain.Emit(
95 "ThreadFreeze",
96 "caller", caller.String(),
97 "boardID", board.ID.String(),
98 "threadID", thread.ID.String(),
99 "frozen", strconv.FormatBool(readonly),
100 )
101 })
102}