fix(auth): 注册邮箱与公告 - 放宽公告正文并增加域名白名单
This commit is contained in:
@@ -54,6 +54,26 @@ var schemaMigrations = []migration{
|
||||
{version: 7, name: "asset_library_folders", checksum: assetLibraryFoldersChecksum, apply: migrateSchemaV7},
|
||||
}
|
||||
|
||||
// reconcileLegacyMigrationV6 repairs databases created while asset folders were
|
||||
// temporarily assigned to migration 6 before resource playback became migration 6.
|
||||
// The schema changes are additive and the transaction keeps the record update atomic.
|
||||
func reconcileLegacyMigrationV6(tx *gorm.DB, applied schemaMigration, expected migration) error {
|
||||
if expected.version != 6 || applied.Name != "asset_library_folders" || applied.Checksum != assetLibraryFoldersChecksum {
|
||||
return nil
|
||||
}
|
||||
if err := migrateSchemaV6(tx); err != nil {
|
||||
return fmt.Errorf("补齐资源播放副本结构:%w", err)
|
||||
}
|
||||
if err := tx.Model(&schemaMigration{}).Where("version = ?", applied.Version).Updates(map[string]any{
|
||||
"name": expected.name,
|
||||
"checksum": expected.checksum,
|
||||
"applied_at": applied.AppliedAt,
|
||||
}).Error; err != nil {
|
||||
return fmt.Errorf("修复数据库迁移 %d 记录:%w", applied.Version, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func migrateSchemaV2(tx *gorm.DB) error {
|
||||
return tx.Exec("CREATE INDEX IF NOT EXISTS idx_schema_migrations_applied_at ON schema_migrations (applied_at)").Error
|
||||
}
|
||||
@@ -169,6 +189,12 @@ func MigrateSchema(db *gorm.DB) error {
|
||||
var applied schemaMigration
|
||||
err := tx.First(&applied, "version = ?", item.version).Error
|
||||
if err == nil {
|
||||
if err := reconcileLegacyMigrationV6(tx, applied, item); err != nil {
|
||||
return err
|
||||
}
|
||||
if applied.Version == item.version && applied.Name == "asset_library_folders" && item.version == 6 {
|
||||
continue
|
||||
}
|
||||
if err := validateMigrationRecord(applied, item); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -133,6 +133,48 @@ func TestMigrateSchemaV4AddsResourceUploadKeyToExistingSchema(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestMigrateSchemaRepairsLegacyAssetFoldersMigrationOrder(t *testing.T) {
|
||||
db, err := Open(Config{Driver: "sqlite", DSN: "file:migration-legacy-v6-order?mode=memory&cache=shared"})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.Resource{}, &model.Asset{}, &model.AssetFolder{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := db.AutoMigrate(&schemaMigration{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, item := range schemaMigrations[:5] {
|
||||
if err := db.Create(&schemaMigration{Version: item.version, Name: item.name, Checksum: item.checksum, AppliedAt: time.Now().UTC()}).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
if err := db.Create(&schemaMigration{Version: 6, Name: "asset_library_folders", Checksum: assetLibraryFoldersChecksum, AppliedAt: time.Now().UTC()}).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := MigrateSchema(db); err != nil {
|
||||
t.Fatalf("repair legacy migration order: %v", err)
|
||||
}
|
||||
if !db.Migrator().HasColumn(&model.Resource{}, "playback_status") || !db.Migrator().HasColumn(&model.Resource{}, "playback_object_key") || !db.Migrator().HasColumn(&model.Resource{}, "playback_error") {
|
||||
t.Fatal("legacy database did not receive resource playback columns")
|
||||
}
|
||||
status, err := ReadSchemaStatus(db)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !status.Ready || status.Current != CurrentSchemaVersion {
|
||||
t.Fatalf("unexpected repaired schema status: %#v", status)
|
||||
}
|
||||
var applied schemaMigration
|
||||
if err := db.First(&applied, "version = ?", 6).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if applied.Name != "resource_playback_variant" || applied.Checksum != resourcePlaybackChecksum {
|
||||
t.Fatalf("migration 6 after repair = %#v", applied)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMigrateSchemaRollsBackFailedMigration(t *testing.T) {
|
||||
db, err := Open(Config{Driver: "sqlite", DSN: "file:migration-rollback?mode=memory&cache=shared"})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user