diff --git a/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.down.sql b/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.down.sql new file mode 100644 index 00000000000..e0ac49d1ecf --- /dev/null +++ b/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.down.sql @@ -0,0 +1 @@ +SELECT 1; diff --git a/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.up.sql b/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.up.sql new file mode 100644 index 00000000000..156ca4edc4e --- /dev/null +++ b/server/services/store/sqlstore/migrations/000040_fix_fileinfo_soft_deletes.up.sql @@ -0,0 +1,8 @@ +{{if .plugin}} + UPDATE FileInfo + SET DeleteAt = 0 + WHERE CreatorId = 'boards' + AND DeleteAt != 0; +{{else}} +SELECT 1; +{{end}} diff --git a/server/services/store/sqlstore/migrationstests/fixtures/test40FixFileinfoSoftDeletes.sql b/server/services/store/sqlstore/migrationstests/fixtures/test40FixFileinfoSoftDeletes.sql new file mode 100644 index 00000000000..6abc8f1451c --- /dev/null +++ b/server/services/store/sqlstore/migrationstests/fixtures/test40FixFileinfoSoftDeletes.sql @@ -0,0 +1,9 @@ +INSERT INTO FileInfo +(Id, CreatorId, CreateAt, UpdateAt, DeleteAt) +VALUES +('fileinfo-1', 'user-id', 1, 1, 1000), +('fileinfo-2', 'user-id', 1, 1, 1000), +('fileinfo-3', 'user-id', 1, 1, 0), +('fileinfo-4', 'boards', 1, 1, 2000), +('fileinfo-5', 'boards', 1, 1, 2000), +('fileinfo-6', 'boards', 1, 1, 0); diff --git a/server/services/store/sqlstore/migrationstests/migration40_test.go b/server/services/store/sqlstore/migrationstests/migration40_test.go new file mode 100644 index 00000000000..66ce1faeab9 --- /dev/null +++ b/server/services/store/sqlstore/migrationstests/migration40_test.go @@ -0,0 +1,48 @@ +package migrationstests + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test40FixFileinfoSoftDeletes(t *testing.T) { + th, tearDown := SetupPluginTestHelper(t) + defer tearDown() + + th.f.MigrateToStep(39). + ExecFile("./fixtures/test40FixFileinfoSoftDeletes.sql"). + MigrateToStep(40) + + type FileInfo struct { + Id string + DeleteAt int + } + + getFileInfo := func(t *testing.T, id string) FileInfo { + t.Helper() + fileInfo := FileInfo{} + + query := "SELECT id, deleteat FROM FileInfo WHERE id = $1" + if th.IsMySQL() { + query = "SELECT Id as id, DeleteAt as deleteat FROM FileInfo WHERE Id = ?" + } + + err := th.f.DB().Get(&fileInfo, query, id) + require.NoError(t, err) + + return fileInfo + } + + t.Run("the file infos that don't belong to boards will not be restored", func(t *testing.T) { + require.Equal(t, 1000, getFileInfo(t, "fileinfo-1").DeleteAt) + require.Equal(t, 1000, getFileInfo(t, "fileinfo-2").DeleteAt) + require.Empty(t, getFileInfo(t, "fileinfo-3").DeleteAt) + }) + + t.Run("the file infos that belong to boards should correctly be restored", func(t *testing.T) { + require.Empty(t, getFileInfo(t, "fileinfo-3").DeleteAt) + require.Empty(t, getFileInfo(t, "fileinfo-4").DeleteAt) + require.Empty(t, getFileInfo(t, "fileinfo-5").DeleteAt) + }) +}