diff options
author | 2023-09-04 15:55:17 +0200 | |
---|---|---|
committer | 2023-09-04 14:55:17 +0100 | |
commit | 3ed1ca68e52527f74103e1a57ae48ae533508c3a (patch) | |
tree | d6113d71d6f88a3d99bbd2215ead6ca1d4fa6153 /internal/gtsmodel/adminaction.go | |
parent | [chore]: Bump golang.org/x/image from 0.11.0 to 0.12.0 (#2178) (diff) | |
download | gotosocial-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.go | 145 |
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, + ) +} |