summaryrefslogtreecommitdiff
path: root/internal/db
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db')
-rw-r--r--internal/db/admin.go19
-rw-r--r--internal/db/bundb/admin.go66
-rw-r--r--internal/db/bundb/migrations/20230828101322_admin_action_locking.go132
3 files changed, 217 insertions, 0 deletions
diff --git a/internal/db/admin.go b/internal/db/admin.go
index 717ac4b94..fcae928f6 100644
--- a/internal/db/admin.go
+++ b/internal/db/admin.go
@@ -49,4 +49,23 @@ type Admin interface {
// Ie., if the instance is hosted at 'example.org' the instance will have a domain of 'example.org'.
// This is needed for things like serving instance information through /api/v1/instance
CreateInstanceInstance(ctx context.Context) error
+
+ /*
+ ACTION FUNCS
+ */
+
+ // GetAdminAction returns the admin action with the given ID.
+ GetAdminAction(ctx context.Context, id string) (*gtsmodel.AdminAction, error)
+
+ // GetAdminActions gets all admin actions from the database.
+ GetAdminActions(ctx context.Context) ([]*gtsmodel.AdminAction, error)
+
+ // PutAdminAction puts one admin action in the database.
+ PutAdminAction(ctx context.Context, action *gtsmodel.AdminAction) error
+
+ // UpdateAdminAction updates one admin action by its ID.
+ UpdateAdminAction(ctx context.Context, action *gtsmodel.AdminAction, columns ...string) error
+
+ // DeleteAdminAction deletes admin action with the given ID.
+ DeleteAdminAction(ctx context.Context, id string) error
}
diff --git a/internal/db/bundb/admin.go b/internal/db/bundb/admin.go
index 8af08973c..e189c508e 100644
--- a/internal/db/bundb/admin.go
+++ b/internal/db/bundb/admin.go
@@ -320,3 +320,69 @@ func (a *adminDB) CreateInstanceInstance(ctx context.Context) error {
log.Infof(ctx, "created instance instance %s with id %s", host, i.ID)
return nil
}
+
+/*
+ ACTION FUNCS
+*/
+
+func (a *adminDB) GetAdminAction(ctx context.Context, id string) (*gtsmodel.AdminAction, error) {
+ action := new(gtsmodel.AdminAction)
+
+ if err := a.db.
+ NewSelect().
+ Model(action).
+ Scan(ctx); err != nil {
+ return nil, err
+ }
+
+ return action, nil
+}
+
+func (a *adminDB) GetAdminActions(ctx context.Context) ([]*gtsmodel.AdminAction, error) {
+ actions := make([]*gtsmodel.AdminAction, 0)
+
+ if err := a.db.
+ NewSelect().
+ Model(&actions).
+ Scan(ctx); err != nil {
+ return nil, err
+ }
+
+ return actions, nil
+}
+
+func (a *adminDB) PutAdminAction(ctx context.Context, action *gtsmodel.AdminAction) error {
+ _, err := a.db.
+ NewInsert().
+ Model(action).
+ Exec(ctx)
+
+ return err
+}
+
+func (a *adminDB) UpdateAdminAction(ctx context.Context, action *gtsmodel.AdminAction, columns ...string) error {
+ // Update the action's last-updated
+ action.UpdatedAt = time.Now()
+ if len(columns) != 0 {
+ columns = append(columns, "updated_at")
+ }
+
+ _, err := a.db.
+ NewUpdate().
+ Model(action).
+ Where("? = ?", bun.Ident("admin_action.id"), action.ID).
+ Column(columns...).
+ Exec(ctx)
+
+ return err
+}
+
+func (a *adminDB) DeleteAdminAction(ctx context.Context, id string) error {
+ _, err := a.db.
+ NewDelete().
+ TableExpr("? AS ?", bun.Ident("admin_actions"), bun.Ident("admin_action")).
+ Where("? = ?", bun.Ident("admin_action"), id).
+ Exec(ctx)
+
+ return err
+}
diff --git a/internal/db/bundb/migrations/20230828101322_admin_action_locking.go b/internal/db/bundb/migrations/20230828101322_admin_action_locking.go
new file mode 100644
index 000000000..b72976cc9
--- /dev/null
+++ b/internal/db/bundb/migrations/20230828101322_admin_action_locking.go
@@ -0,0 +1,132 @@
+// 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 migrations
+
+import (
+ "context"
+
+ "github.com/uptrace/bun"
+
+ oldmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20220315160814_admin_account_actions"
+ "github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
+ "github.com/superseriousbusiness/gotosocial/internal/util"
+)
+
+func init() {
+ up := func(ctx context.Context, db *bun.DB) error {
+ return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error {
+ // Select all old actions.
+ var adminAccountActions []*oldmodel.AdminAccountAction
+ if err := tx.
+ NewSelect().
+ Model(&adminAccountActions).
+ Scan(ctx); err != nil {
+ return err
+ }
+
+ // Create the new table.
+ if _, err := tx.
+ NewCreateTable().
+ Model(&gtsmodel.AdminAction{}).
+ Exec(ctx); err != nil {
+ return err
+ }
+
+ // Index new table properly.
+ for index, columns := range map[string][]string{
+ "account_actions_id_idx": {"id"},
+ // Eg., select all actions of given category.
+ "account_actions_target_category_idx": {"target_category"},
+ // Eg., select all actions targeting given id.
+ "account_actions_target_id_idx": {"target_id"},
+ // Eg., select all actions of given type.
+ "account_actions_type_idx": {"type"},
+ // Eg., select all actions by given account id.
+ "account_actions_account_id_idx": {"account_id"},
+ } {
+ if _, err := tx.
+ NewCreateIndex().
+ Table("admin_actions").
+ Index(index).
+ Column(columns...).
+ Exec(ctx); err != nil {
+ return err
+ }
+ }
+
+ // Insert old format entries into new table.
+ for _, oldAction := range adminAccountActions {
+ newAction := &gtsmodel.AdminAction{
+ ID: oldAction.ID,
+ CreatedAt: oldAction.CreatedAt,
+ UpdatedAt: oldAction.UpdatedAt,
+ TargetCategory: gtsmodel.AdminActionCategoryAccount,
+ TargetID: oldAction.TargetAccountID,
+ Type: gtsmodel.NewAdminActionType(string(oldAction.Type)),
+ AccountID: oldAction.AccountID,
+ Text: oldAction.Text,
+ SendEmail: util.Ptr(oldAction.SendEmail),
+ ReportIDs: []string{oldAction.ReportID},
+ }
+
+ if _, err := tx.
+ NewInsert().
+ Model(newAction).
+ Exec(ctx); err != nil {
+ return err
+ }
+ }
+
+ // Drop the old table.
+ if _, err := tx.
+ NewDropTable().
+ Table("admin_account_actions").
+ Exec(ctx); err != nil {
+ return err
+ }
+
+ // Drop any remaining old indexes.
+ for _, idxName := range []string{
+ "admin_account_actions_pkey",
+ "admin_account_actions_account_id_idx",
+ "admin_account_actions_target_account_id_idx",
+ "admin_account_actions_type_idx",
+ } {
+ if _, err := tx.
+ NewDropIndex().
+ Index(idxName).
+ IfExists().
+ Exec(ctx); err != nil {
+ return err
+ }
+ }
+
+ return nil
+ })
+ }
+
+ down := func(ctx context.Context, db *bun.DB) error {
+ return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error {
+ return nil
+ })
+ }
+
+ if err := Migrations.Register(up, down); err != nil {
+ panic(err)
+ }
+}