summaryrefslogtreecommitdiff
path: root/internal/gtsmodel/adminaction.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-09-04 15:55:17 +0200
committerLibravatar GitHub <noreply@github.com>2023-09-04 14:55:17 +0100
commit3ed1ca68e52527f74103e1a57ae48ae533508c3a (patch)
treed6113d71d6f88a3d99bbd2215ead6ca1d4fa6153 /internal/gtsmodel/adminaction.go
parent[chore]: Bump golang.org/x/image from 0.11.0 to 0.12.0 (#2178) (diff)
downloadgotosocial-3ed1ca68e52527f74103e1a57ae48ae533508c3a.tar.xz
[feature] Store admin actions in the db, prevent conflicting actions (#2167)
Diffstat (limited to 'internal/gtsmodel/adminaction.go')
-rw-r--r--internal/gtsmodel/adminaction.go145
1 files changed, 145 insertions, 0 deletions
diff --git a/internal/gtsmodel/adminaction.go b/internal/gtsmodel/adminaction.go
new file mode 100644
index 000000000..c6c598b32
--- /dev/null
+++ b/internal/gtsmodel/adminaction.go
@@ -0,0 +1,145 @@
+// GoToSocial
+// Copyright (C) GoToSocial Authors admin@gotosocial.org
+// SPDX-License-Identifier: AGPL-3.0-or-later
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package gtsmodel
+
+import (
+ "path"
+ "time"
+)
+
+// AdminActionCategory describes the category
+// of entity that this admin action targets.
+type AdminActionCategory uint8
+
+// Only ever add new action categories to the *END* of the list
+// below, DO NOT insert them before/between other entries!
+
+const (
+ AdminActionCategoryUnknown AdminActionCategory = iota
+ AdminActionCategoryAccount
+ AdminActionCategoryDomain
+)
+
+func (c AdminActionCategory) String() string {
+ switch c {
+ case AdminActionCategoryAccount:
+ return "account"
+ case AdminActionCategoryDomain:
+ return "domain"
+ default:
+ return "unknown"
+ }
+}
+
+func NewAdminActionCategory(in string) AdminActionCategory {
+ switch in {
+ case "account":
+ return AdminActionCategoryAccount
+ case "domain":
+ return AdminActionCategoryDomain
+ default:
+ return AdminActionCategoryUnknown
+ }
+}
+
+// AdminActionType describes a type of
+// action taken on an entity by an admin.
+type AdminActionType uint8
+
+// Only ever add new action types to the *END* of the list
+// below, DO NOT insert them before/between other entries!
+
+const (
+ AdminActionUnknown AdminActionType = iota
+ AdminActionDisable
+ AdminActionReenable
+ AdminActionSilence
+ AdminActionUnsilence
+ AdminActionSuspend
+ AdminActionUnsuspend
+)
+
+func (t AdminActionType) String() string {
+ switch t {
+ case AdminActionDisable:
+ return "disable"
+ case AdminActionReenable:
+ return "reenable"
+ case AdminActionSilence:
+ return "silence"
+ case AdminActionUnsilence:
+ return "unsilence"
+ case AdminActionSuspend:
+ return "suspend"
+ case AdminActionUnsuspend:
+ return "unsuspend"
+ default:
+ return "unknown"
+ }
+}
+
+func NewAdminActionType(in string) AdminActionType {
+ switch in {
+ case "disable":
+ return AdminActionDisable
+ case "reenable":
+ return AdminActionReenable
+ case "silence":
+ return AdminActionSilence
+ case "unsilence":
+ return AdminActionUnsilence
+ case "suspend":
+ return AdminActionSuspend
+ case "unsuspend":
+ return AdminActionUnsuspend
+ default:
+ return AdminActionUnknown
+ }
+}
+
+// AdminAction models an action taken by an instance administrator towards an account, domain, etc.
+type AdminAction struct {
+ ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // ID of this item in the database.
+ CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // Creation time of this item.
+ UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // Last updated time of this item.
+ CompletedAt time.Time `bun:"type:timestamptz,nullzero"` // Completion time of this item.
+ TargetCategory AdminActionCategory `bun:",nullzero,notnull"` // Category of the entity targeted by this action.
+ TargetID string `bun:",nullzero,notnull"` // Identifier of the target. May be a ULID (in case of accounts), or a domain name (in case of domains).
+ Target interface{} `bun:"-"` // Target of the action. Might be a domain string, might be an account.
+ Type AdminActionType `bun:",nullzero,notnull"` // Type of action that was taken.
+ AccountID string `bun:"type:CHAR(26),notnull,nullzero"` // Who performed this admin action.
+ Account *Account `bun:"rel:has-one"` // Account corresponding to accountID
+ Text string `bun:",nullzero"` // Free text field for explaining why this action was taken, or adding a note about this action.
+ SendEmail *bool `bun:",nullzero,notnull,default:false"` // Send an email to the target account's user to explain what happened (local accounts only).
+ ReportIDs []string `bun:"reports,array"` // IDs of any reports cited when creating this action.
+ Reports []*Report `bun:"-"` // Reports corresponding to ReportIDs.
+ Errors []string `bun:",array"` // String value of any error(s) encountered while processing. May be helpful for admins to debug.
+}
+
+// Key returns a key for the AdminAction which is
+// unique only on its TargetCategory and TargetID
+// fields. This key can be used to check if this
+// AdminAction overlaps with another action performed
+// on the same target, regardless of the Type of
+// either this or the other action.
+func (a *AdminAction) Key() string {
+ return path.Join(
+ a.TargetCategory.String(),
+ a.TargetID,
+ )
+}