Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}