[bugfix] Ensure pending_approval set on statuses + status faves (#3415)

* [bugfix] Ensure pending_approval set on statuses + status faves

* set PendingApproval on boosts

* assume not pending approval
This commit is contained in:
tobi 2024-10-11 15:21:45 +02:00 committed by GitHub
parent a504d8a105
commit cb9008fb41
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 109 additions and 13 deletions

View file

@ -40,7 +40,7 @@ func init() {
table string table string
column string column string
columnType string columnType string
defaultVal string extra string
} }
for _, spec := range []spec{ for _, spec := range []spec{
// Statuses. // Statuses.
@ -48,19 +48,19 @@ func init() {
table: "statuses", table: "statuses",
column: "interaction_policy", column: "interaction_policy",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
{ {
table: "statuses", table: "statuses",
column: "pending_approval", column: "pending_approval",
columnType: "BOOLEAN", columnType: "BOOLEAN",
defaultVal: "DEFAULT false", extra: "NOT NULL DEFAULT false",
}, },
{ {
table: "statuses", table: "statuses",
column: "approved_by_uri", column: "approved_by_uri",
columnType: "varchar", columnType: "varchar",
defaultVal: "", extra: "",
}, },
// Status faves. // Status faves.
@ -68,13 +68,13 @@ func init() {
table: "status_faves", table: "status_faves",
column: "pending_approval", column: "pending_approval",
columnType: "BOOLEAN", columnType: "BOOLEAN",
defaultVal: "DEFAULT false", extra: "NOT NULL DEFAULT false",
}, },
{ {
table: "status_faves", table: "status_faves",
column: "approved_by_uri", column: "approved_by_uri",
columnType: "varchar", columnType: "varchar",
defaultVal: "", extra: "",
}, },
// Columns that must be added to the // Columns that must be added to the
@ -85,31 +85,31 @@ func init() {
table: "account_settings", table: "account_settings",
column: "interaction_policy_direct", column: "interaction_policy_direct",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
{ {
table: "account_settings", table: "account_settings",
column: "interaction_policy_mutuals_only", column: "interaction_policy_mutuals_only",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
{ {
table: "account_settings", table: "account_settings",
column: "interaction_policy_followers_only", column: "interaction_policy_followers_only",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
{ {
table: "account_settings", table: "account_settings",
column: "interaction_policy_unlocked", column: "interaction_policy_unlocked",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
{ {
table: "account_settings", table: "account_settings",
column: "interaction_policy_public", column: "interaction_policy_public",
columnType: "JSONB", columnType: "JSONB",
defaultVal: "", extra: "",
}, },
} { } {
exists, err := doesColumnExist(ctx, tx, exists, err := doesColumnExist(ctx, tx,
@ -130,9 +130,9 @@ func init() {
} }
qStr := "ALTER TABLE ? ADD COLUMN ? ?" qStr := "ALTER TABLE ? ADD COLUMN ? ?"
if spec.defaultVal != "" { if spec.extra != "" {
qStr += " ?" qStr += " ?"
args = append(args, bun.Safe(spec.defaultVal)) args = append(args, bun.Safe(spec.extra))
} }
log.Infof(ctx, "adding column '%s' to '%s'...", spec.column, spec.table) log.Infof(ctx, "adding column '%s' to '%s'...", spec.column, spec.table)

View file

@ -0,0 +1,80 @@
// 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/superseriousbusiness/gotosocial/internal/log"
"github.com/uptrace/bun"
)
func init() {
up := func(ctx context.Context, db *bun.DB) error {
return db.RunInTx(ctx, nil, func(ctx context.Context, tx bun.Tx) error {
// Previous versions of 20240620074530_interaction_policy.go
// didn't set NOT NULL on gtsmodel.Status.PendingApproval and
// gtsmodel.StatusFave.PendingApproval, resulting in NULL being
// set for that column for some statuses. Correct for this.
log.Info(ctx, "correcting pending_approval on statuses table...")
res, err := tx.
NewUpdate().
Table("statuses").
Set("? = ?", bun.Ident("pending_approval"), false).
Where("? IS NULL", bun.Ident("pending_approval")).
Exec(ctx)
if err != nil {
return err
}
rows, err := res.RowsAffected()
if err == nil {
log.Infof(ctx, "corrected %d entries", rows)
}
log.Info(ctx, "correcting pending_approval on status_faves table...")
res, err = tx.
NewUpdate().
Table("status_faves").
Set("? = ?", bun.Ident("pending_approval"), false).
Where("? IS NULL", bun.Ident("pending_approval")).
Exec(ctx)
if err != nil {
return err
}
rows, err = res.RowsAffected()
if err == nil {
log.Infof(ctx, "corrected %d entries", rows)
}
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)
}
}

View file

@ -78,6 +78,10 @@ func (p *Processor) Create(
Sensitive: &form.Sensitive, Sensitive: &form.Sensitive,
CreatedWithApplicationID: application.ID, CreatedWithApplicationID: application.ID,
Text: form.Status, Text: form.Status,
// Assume not pending approval; this may
// change when permissivity is checked.
PendingApproval: util.Ptr(false),
} }
if form.Poll != nil { if form.Poll != nil {

View file

@ -432,6 +432,10 @@ func (c *Converter) ASStatusToStatus(ctx context.Context, statusable ap.Statusab
status.ApprovedByURI = approvedByURI.String() status.ApprovedByURI = approvedByURI.String()
} }
// Assume not pending approval; this may
// change when permissivity is checked.
status.PendingApproval = util.Ptr(false)
// status.Sensitive // status.Sensitive
sensitive := ap.ExtractSensitive(statusable) sensitive := ap.ExtractSensitive(statusable)
status.Sensitive = &sensitive status.Sensitive = &sensitive
@ -531,6 +535,10 @@ func (c *Converter) ASLikeToFave(ctx context.Context, likeable ap.Likeable) (*gt
StatusID: target.ID, StatusID: target.ID,
Status: target, Status: target,
URI: uri, URI: uri,
// Assume not pending approval; this may
// change when permissivity is checked.
PendingApproval: util.Ptr(false),
}, nil }, nil
} }
@ -656,6 +664,10 @@ func (c *Converter) ASAnnounceToStatus(
boost.MentionIDs = make([]string, 0) boost.MentionIDs = make([]string, 0)
boost.EmojiIDs = make([]string, 0) boost.EmojiIDs = make([]string, 0)
// Assume not pending approval; this may
// change when permissivity is checked.
boost.PendingApproval = util.Ptr(false)
// Remaining fields on the boost will be // Remaining fields on the boost will be
// taken from the target status; it's not // taken from the target status; it's not
// our job to do all that dereferencing here. // our job to do all that dereferencing here.