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:
parent
ee0b91059f
commit
9ca424f4da
6 changed files with 177 additions and 26 deletions
124
cmd/gochan-migration/internal/pre2021/bans.go
Normal file
124
cmd/gochan-migration/internal/pre2021/bans.go
Normal 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()
|
||||
}
|
27
cmd/gochan-migration/internal/pre2021/bans_test.go
Normal file
27
cmd/gochan-migration/internal/pre2021/bans_test.go
Normal 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()
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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`
|
||||
)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue