From cf707893cc1c375222f20bd8f3de68476f978ed2 Mon Sep 17 00:00:00 2001 From: kim Date: Wed, 13 Nov 2024 15:29:56 +0000 Subject: [PATCH] add migration to add the StatusEdit{} table --- .../20241113152126_add_status_edits_table.go | 48 ++++++++++++++++++ .../statusedit.go | 50 +++++++++++++++++++ testrig/db.go | 1 + 3 files changed, 99 insertions(+) create mode 100644 internal/db/bundb/migrations/20241113152126_add_status_edits_table.go create mode 100644 internal/db/bundb/migrations/20241113152126_add_status_edits_table/statusedit.go diff --git a/internal/db/bundb/migrations/20241113152126_add_status_edits_table.go b/internal/db/bundb/migrations/20241113152126_add_status_edits_table.go new file mode 100644 index 000000000..f14012d78 --- /dev/null +++ b/internal/db/bundb/migrations/20241113152126_add_status_edits_table.go @@ -0,0 +1,48 @@ +// 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 . + +package migrations + +import ( + "context" + + gtsmodel "github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations/20241113152126_add_status_edits_table" + + "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 { + _, err := tx.NewCreateTable(). + IfNotExists(). + Model((*gtsmodel.StatusEdit)(nil)). + Exec(ctx) + return err + }) + } + + 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) + } +} diff --git a/internal/db/bundb/migrations/20241113152126_add_status_edits_table/statusedit.go b/internal/db/bundb/migrations/20241113152126_add_status_edits_table/statusedit.go new file mode 100644 index 000000000..6d8f7c45d --- /dev/null +++ b/internal/db/bundb/migrations/20241113152126_add_status_edits_table/statusedit.go @@ -0,0 +1,50 @@ +// 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 . + +package gtsmodel + +import ( + "time" + + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +// StatusEdit represents a **historical** view of a Status +// after a received edit. The Status itself will always +// contain the latest up-to-date information. +// +// Note that stored status edits may not exactly match that +// of the origin server, they are a best-effort by receiver +// to store version history. There is no AP history endpoint. +type StatusEdit struct { + ID string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // ID of this item in the database. + Content string `bun:""` // Content of status at time of edit; likely html-formatted but not guaranteed. + ContentWarning string `bun:",nullzero"` // Content warning of status at time of edit. + Text string `bun:""` // Original status text, without formatting, at time of edit. + Language string `bun:",nullzero"` // Status language at time of edit. + Sensitive *bool `bun:",nullzero,notnull,default:false"` // Status sensitive flag at time of edit. + AttachmentIDs []string `bun:",array"` // Database IDs of media attachments associated with status at time of edit. + Attachments []*gtsmodel.MediaAttachment `bun:"-"` // Media attachments relating to .AttachmentIDs field (not always populated). + PollOptions []string `bun:",array"` // Poll options of status at time of edit, only set if status contains a poll. + PollVotes []int `bun:",array"` // Poll vote count at time of status edit, only set if poll votes were reset. + StatusID string `bun:"type:CHAR(26),nullzero,notnull"` // The originating status ID this is a historical edit of. + CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // The creation time of this version of the status content (according to receiving server). + + // We don't bother having a *gtsmodel.Status model here + // as the StatusEdit is always just attached to a Status, + // so it doesn't need a self-reference back to it. +} diff --git a/testrig/db.go b/testrig/db.go index 92d963e89..bfe0c9822 100644 --- a/testrig/db.go +++ b/testrig/db.go @@ -52,6 +52,7 @@ var testModels = []interface{}{ >smodel.Status{}, >smodel.StatusToEmoji{}, >smodel.StatusToTag{}, + >smodel.StatusEdit{}, >smodel.StatusFave{}, >smodel.StatusBookmark{}, >smodel.Tag{},