1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-18 11:46:23 -07:00

Ad test for pre2021 ban migration and start adding implementation

This commit is contained in:
Eggbertx 2025-01-03 23:21:16 -08:00
parent ee0b91059f
commit 9ca424f4da
6 changed files with 177 additions and 26 deletions

View file

@ -0,0 +1,124 @@
package pre2021
import (
"errors"
"net"
"strings"
"time"
"github.com/gochan-org/gochan/cmd/gochan-migration/internal/common"
"github.com/gochan-org/gochan/pkg/gcsql"
"github.com/gochan-org/gochan/pkg/gcutil"
)
type migrationBan struct {
oldID int
allowRead string
ip string
name string
nameIsRegex bool
filename string
fileChecksum string
boards string
staff string
timestamp time.Time
expires time.Time
permaban bool
reason string
banType int
staffNote string
appealAt time.Time
canAppeal bool
boardIDs []int
banID int
staffID int
filterID int
}
func (m *Pre2021Migrator) migrateBansInPlace() error {
return common.NewMigrationError("pre2021", "migrateBansInPlace not yet implemented")
}
func (m *Pre2021Migrator) migrateBansToNewDB() error {
errEv := common.LogError()
defer errEv.Discard()
tx, err := gcsql.BeginTx()
if err != nil {
errEv.Err(err).Caller().Msg("Failed to start transaction")
return err
}
defer tx.Rollback()
rows, err := m.db.QuerySQL(bansQuery)
if err != nil {
errEv.Err(err).Caller().Msg("Failed to get bans")
return err
}
defer rows.Close()
for rows.Next() {
var ban migrationBan
if err = rows.Scan(
&ban.oldID, &ban.allowRead, &ban.ip, &ban.name, &ban.nameIsRegex, &ban.filename, &ban.fileChecksum,
&ban.boards, &ban.staff, &ban.timestamp, &ban.expires, &ban.permaban, &ban.reason, &ban.banType, &ban.staffNote, &ban.appealAt, &ban.canAppeal,
); err != nil {
errEv.Err(err).Caller().Msg("Failed to scan ban row")
return err
}
if ban.boards != "" && ban.boards != "*" {
boardDirs := strings.Split(ban.boards, ",")
for _, dir := range boardDirs {
dir = strings.TrimSpace(dir)
boardID, err := gcsql.GetBoardIDFromDir(dir)
if err != nil {
if errors.Is(err, gcsql.ErrBoardDoesNotExist) {
common.Logger().Warn().Str("board", dir).Msg("Found unrecognized ban board")
continue
} else {
errEv.Err(err).Caller().Str("board", dir).Msg("Failed getting board ID from dir")
return err
}
}
ban.boardIDs = append(ban.boardIDs, boardID)
}
}
if len(ban.boardIDs) == 0 {
if ban.ip != "" {
if net.ParseIP(ban.ip) == nil {
gcutil.LogWarning().
Int("oldID", ban.oldID).
Str("ip", ban.ip).
Msg("Found ban with invalid IP address, skipping")
continue
}
migratedBan := &gcsql.IPBan{
BoardID: nil,
RangeStart: ban.ip,
RangeEnd: ban.ip,
IssuedAt: ban.timestamp,
}
migratedBan.CanAppeal = ban.canAppeal
migratedBan.AppealAt = ban.appealAt
migratedBan.ExpiresAt = ban.expires
migratedBan.Permanent = ban.permaban
migratedBan.Message = ban.reason
migratedBan.StaffNote = ban.staffNote
gcsql.NewIPBanTx(tx, migratedBan)
}
}
}
return nil
}
func (m *Pre2021Migrator) MigrateBans() error {
if m.IsMigratingInPlace() {
return m.migrateBansInPlace()
}
return m.migrateBansToNewDB()
}

View file

@ -0,0 +1,27 @@
package pre2021
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMigrateBansToNewDB(t *testing.T) {
outDir := t.TempDir()
migrator := setupMigrationTest(t, outDir, false)
if !assert.False(t, migrator.IsMigratingInPlace(), "This test should not be migrating in place") {
t.FailNow()
}
if !assert.NoError(t, migrator.MigrateBoards()) {
t.FailNow()
}
if !assert.NoError(t, migrator.MigratePosts()) {
t.FailNow()
}
if !assert.NoError(t, migrator.MigrateBans()) {
t.FailNow()
}
}

View file

@ -11,7 +11,7 @@ import (
"github.com/rs/zerolog"
)
type postTable struct {
type migrationPost struct {
gcsql.Post
autosage bool
bumped time.Time
@ -40,7 +40,7 @@ func (m *Pre2021Migrator) MigratePosts() error {
return m.migratePostsToNewDB()
}
func (m *Pre2021Migrator) migratePost(tx *sql.Tx, post *postTable, errEv *zerolog.Event) error {
func (m *Pre2021Migrator) migratePost(tx *sql.Tx, post *migrationPost, errEv *zerolog.Event) error {
var err error
if post.oldParentID == 0 {
@ -103,7 +103,7 @@ func (m *Pre2021Migrator) migratePostsToNewDB() error {
var missingBoardIDs []int
var migratedThreads int
for rows.Next() {
var thread postTable
var thread migrationPost
if err = rows.Scan(
&thread.oldID, &thread.oldBoardID, &thread.oldParentID, &thread.Name, &thread.Tripcode, &thread.Email,
&thread.Subject, &thread.Message, &thread.MessageRaw, &thread.Password, &thread.filename,
@ -143,7 +143,7 @@ func (m *Pre2021Migrator) migratePostsToNewDB() error {
defer replyRows.Close()
for replyRows.Next() {
var reply postTable
var reply migrationPost
if err = replyRows.Scan(
&reply.oldID, &reply.oldBoardID, &reply.oldParentID, &reply.Name, &reply.Tripcode, &reply.Email,
&reply.Subject, &reply.Message, &reply.MessageRaw, &reply.Password, &reply.filename,

View file

@ -89,9 +89,9 @@ func (m *Pre2021Migrator) MigrateDB() (bool, error) {
// if err = m.MigrateStaff("password"); err != nil {
// return false, err
// }
// if err = m.MigrateBans(); err != nil {
// return false, err
// }
if err = m.MigrateBans(); err != nil {
return false, err
}
// if err = m.MigrateAnnouncements(); err != nil {
// return false, err
// }
@ -103,10 +103,6 @@ func (*Pre2021Migrator) MigrateStaff(_ string) error {
return nil
}
func (*Pre2021Migrator) MigrateBans() error {
return nil
}
func (*Pre2021Migrator) MigrateAnnouncements() error {
return nil
}

View file

@ -13,4 +13,7 @@ filename_original, file_checksum, filesize, image_w, image_h, thumb_w, thumb_h,
bumped, stickied, locked FROM DBPREFIXposts WHERE deleted_timestamp IS NULL`
threadsQuery = postsQuery + " AND parentid = 0"
bansQuery = `SELECT id, allow_read, COALESCE(ip, '') as ip, name, name_is_regex, filename, file_checksum, boards, staff,
timestamp, expires, permaban, reason, type, staff_note, appeal_at, can_appeal FROM DBPREFIXbanlist`
)

View file

@ -25,7 +25,7 @@ type Ban interface {
Deactivate(int) error
}
func NewIPBan(ban *IPBan) error {
func NewIPBanTx(tx *sql.Tx, ban *IPBan) error {
const query = `INSERT INTO DBPREFIXip_ban
(staff_id, board_id, banned_for_post_id, copy_post_text, is_thread_ban,
is_active, range_start, range_end, appeal_at, expires_at,
@ -34,27 +34,28 @@ func NewIPBan(ban *IPBan) error {
if ban.ID > 0 {
return ErrBanAlreadyInserted
}
_, err := ExecTxSQL(tx, query, ban.StaffID, ban.BoardID, ban.BannedForPostID, ban.CopyPostText,
ban.IsThreadBan, ban.IsActive, ban.RangeStart, ban.RangeEnd, ban.AppealAt,
ban.ExpiresAt, ban.Permanent, ban.StaffNote, ban.Message, ban.CanAppeal)
if err != nil {
return err
}
ban.ID, err = getLatestID("DBPREFIXip_ban", tx)
return err
}
func NewIPBan(ban *IPBan) error {
tx, err := BeginTx()
if err != nil {
return err
}
defer tx.Rollback()
stmt, err := PrepareSQL(query, tx)
if err != nil {
return err
}
defer stmt.Close()
if _, err = stmt.Exec(
ban.StaffID, ban.BoardID, ban.BannedForPostID, ban.CopyPostText,
ban.IsThreadBan, ban.IsActive, ban.RangeStart, ban.RangeEnd, ban.AppealAt,
ban.ExpiresAt, ban.Permanent, ban.StaffNote, ban.Message, ban.CanAppeal,
); err != nil {
return err
}
ban.ID, err = getLatestID("DBPREFIXip_ban", tx)
if err != nil {
if err = NewIPBanTx(tx, ban); err != nil {
return err
}
return tx.Commit()
}