Skip to content

Commit 7cc6814

Browse files
committed
feat: remove support for input during migrations
1 parent 46c3ad8 commit 7cc6814

File tree

12 files changed

+24
-258
lines changed

12 files changed

+24
-258
lines changed

meteor/server/api/rest/v1/system.ts

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { BlueprintId } from '@sofie-automation/corelib/dist/dataModel/Ids'
88
import { Meteor } from 'meteor/meteor'
99
import { ClientAPI } from '@sofie-automation/meteor-lib/dist/api/client'
1010
import { MeteorCall } from '../../methods'
11-
import { MigrationStepInputResult } from '@sofie-automation/blueprints-integration'
1211

1312
class SystemServerAPI implements SystemRestAPI {
1413
async assignSystemBlueprint(
@@ -33,36 +32,20 @@ class SystemServerAPI implements SystemRestAPI {
3332
const migrationStatus = await MeteorCall.migration.getMigrationStatus()
3433
if (!migrationStatus.migrationNeeded) return ClientAPI.responseSuccess({ inputs: [] })
3534

36-
const requiredInputs: PendingMigrations = []
37-
for (const migration of migrationStatus.migration.manualInputs) {
38-
if (migration.stepId && migration.attribute) {
39-
requiredInputs.push({
40-
stepId: migration.stepId,
41-
attributeId: migration.attribute,
42-
})
43-
}
44-
}
45-
46-
return ClientAPI.responseSuccess({ inputs: requiredInputs })
35+
// Inputs are no longer supported, but need to be preserved for api compatibility
36+
return ClientAPI.responseSuccess({ inputs: [] })
4737
}
4838

4939
async applyPendingMigrations(
5040
_connection: Meteor.Connection,
51-
_event: string,
52-
inputs: MigrationData
41+
_event: string
5342
): Promise<ClientAPI.ClientResponse<void>> {
5443
const migrationStatus = await MeteorCall.migration.getMigrationStatus()
5544
if (!migrationStatus.migrationNeeded) throw new Error(`Migration does not need to be applied`)
5645

57-
const migrationData: MigrationStepInputResult[] = inputs.map((input) => ({
58-
stepId: input.stepId,
59-
attribute: input.attributeId,
60-
value: input.migrationValue,
61-
}))
6246
const result = await MeteorCall.migration.runMigration(
6347
migrationStatus.migration.chunks,
64-
migrationStatus.migration.hash,
65-
migrationData
48+
migrationStatus.migration.hash
6649
)
6750
if (result.migrationCompleted) return ClientAPI.responseSuccess(undefined)
6851
throw new Error(`Unknown error occurred`)
@@ -95,12 +78,10 @@ export function registerRoutes(registerRoute: APIRegisterHook<SystemRestAPI>): v
9578
'/system/migrations',
9679
new Map([[400, [UserErrorMessage.NoMigrationsToApply]]]),
9780
systemAPIFactory,
98-
async (serverAPI, connection, event, _params, body) => {
99-
const inputs = body.inputs
81+
async (serverAPI, connection, event, _params, _body) => {
10082
logger.info(`API POST: System migrations`)
10183

102-
check(inputs, Array)
103-
return await serverAPI.applyPendingMigrations(connection, event, inputs)
84+
return await serverAPI.applyPendingMigrations(connection, event)
10485
}
10586
)
10687

meteor/server/coreSystem/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ async function initializeCoreSystem() {
8686
const migration = await prepareMigration(true)
8787
if (migration.migrationNeeded && migration.manualStepCount === 0 && migration.chunks.length <= 1) {
8888
// Since we've determined that the migration can be done automatically, and we have a fresh system, just do the migration automatically:
89-
await runMigration(migration.chunks, migration.hash, [])
89+
await runMigration(migration.chunks, migration.hash)
9090
}
9191
}
9292
}

meteor/server/lib/rest/v1/system.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,7 @@ export interface SystemRestAPI {
4848
* @param event User event string
4949
* @param inputs Migration data to apply
5050
*/
51-
applyPendingMigrations(
52-
connection: Meteor.Connection,
53-
event: string,
54-
inputs: MigrationData
55-
): Promise<ClientAPI.ClientResponse<void>>
51+
applyPendingMigrations(connection: Meteor.Connection, event: string): Promise<ClientAPI.ClientResponse<void>>
5652
}
5753

5854
export interface PendingMigrationStep {

meteor/server/migration/__tests__/migrations.test.ts

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import { ICoreSystem, GENESIS_SYSTEM_VERSION } from '@sofie-automation/meteor-li
44
import { clearMigrationSteps, addMigrationSteps, prepareMigration, PreparedMigration } from '../databaseMigration'
55
import { CURRENT_SYSTEM_VERSION } from '../currentSystemVersion'
66
import { RunMigrationResult, GetMigrationStatusResult } from '@sofie-automation/meteor-lib/dist/api/migration'
7-
import { literal } from '@sofie-automation/corelib/dist/lib'
87
import { protectString } from '@sofie-automation/corelib/dist/protectedString'
9-
import { MigrationStepInputResult } from '@sofie-automation/blueprints-integration'
108
import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio'
119
import { MeteorCall } from '../../api/methods'
1210
import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
@@ -37,22 +35,7 @@ describe('Migrations', () => {
3735
async function getSystem() {
3836
return (await getCoreSystemAsync()) as ICoreSystem
3937
}
40-
function userInput(
41-
migrationStatus: GetMigrationStatusResult,
42-
userValues?: { [key: string]: any }
43-
): MigrationStepInputResult[] {
44-
return _.compact(
45-
_.map(migrationStatus.migration.manualInputs, (manualInput) => {
46-
if (manualInput.stepId && manualInput.attribute) {
47-
return literal<MigrationStepInputResult>({
48-
stepId: manualInput.stepId,
49-
attribute: manualInput.attribute,
50-
value: userValues && userValues[manualInput.stepId],
51-
})
52-
}
53-
})
54-
)
55-
}
38+
5639
test('System migrations, initial setup', async () => {
5740
expect((await getSystem()).version).toEqual(GENESIS_SYSTEM_VERSION)
5841

@@ -77,8 +60,7 @@ describe('Migrations', () => {
7760

7861
const migrationResult0: RunMigrationResult = await MeteorCall.migration.runMigration(
7962
migrationStatus0.migration.chunks,
80-
migrationStatus0.migration.hash,
81-
userInput(migrationStatus0)
63+
migrationStatus0.migration.hash
8264
)
8365

8466
expect(migrationResult0).toMatchObject({

meteor/server/migration/api.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
BlueprintFixUpConfigMessage,
88
} from '@sofie-automation/meteor-lib/dist/api/migration'
99
import * as Migrations from './databaseMigration'
10-
import { MigrationStepInputResult } from '@sofie-automation/blueprints-integration'
1110
import { MethodContextAPI } from '../api/methodContext'
1211
import {
1312
fixupConfigForShowStyleBase,
@@ -34,20 +33,14 @@ class ServerMigrationAPI extends MethodContextAPI implements NewMigrationAPI {
3433
return Migrations.getMigrationStatus()
3534
}
3635

37-
async runMigration(
38-
chunks: Array<MigrationChunk>,
39-
hash: string,
40-
inputResults: Array<MigrationStepInputResult>,
41-
isFirstOfPartialMigrations?: boolean | null
42-
) {
36+
async runMigration(chunks: Array<MigrationChunk>, hash: string, isFirstOfPartialMigrations?: boolean | null) {
4337
check(chunks, Array)
4438
check(hash, String)
45-
check(inputResults, Array)
4639
check(isFirstOfPartialMigrations, Match.Maybe(Boolean))
4740

4841
assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MIGRATIONS)
4942

50-
return Migrations.runMigration(chunks, hash, inputResults, isFirstOfPartialMigrations || false)
43+
return Migrations.runMigration(chunks, hash, isFirstOfPartialMigrations || false)
5144
}
5245

5346
async forceMigration(chunks: Array<MigrationChunk>) {

meteor/server/migration/databaseMigration.ts

Lines changed: 5 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import { Meteor } from 'meteor/meteor'
22
import * as semver from 'semver'
33
import {
4-
InputFunctionCore,
54
MigrateFunctionCore,
65
MigrationStep,
7-
MigrationStepInput,
8-
MigrationStepInputFilteredResult,
9-
MigrationStepInputResult,
106
ValidateFunctionCore,
117
ValidateFunction,
128
MigrateFunction,
13-
InputFunction,
149
MigrationStepCore,
15-
} from '@sofie-automation/blueprints-integration'
10+
} from '@sofie-automation/meteor-lib/dist/migrations'
1611
import _ from 'underscore'
1712
import {
1813
GetMigrationStatusResult,
@@ -24,7 +19,7 @@ import { logger } from '../logging'
2419
import { internalStoreSystemSnapshot } from '../api/snapshot'
2520
import { parseVersion, Version } from '../systemStatus/semverUtils'
2621
import { GENESIS_SYSTEM_VERSION } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem'
27-
import { clone, getHash, omit } from '@sofie-automation/corelib/dist/lib'
22+
import { getHash, omit } from '@sofie-automation/corelib/dist/lib'
2823
import { protectString } from '@sofie-automation/corelib/dist/protectedString'
2924
import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError'
3025
import { CURRENT_SYSTEM_VERSION } from './currentSystemVersion'
@@ -57,7 +52,7 @@ export function isVersionSupported(version: Version): boolean {
5752
return isSupported
5853
}
5954

60-
interface MigrationStepInternal extends MigrationStep<ValidateFunction, MigrateFunction, InputFunction> {
55+
interface MigrationStepInternal extends MigrationStep<ValidateFunction, MigrateFunction> {
6156
chunk: MigrationChunk
6257
_rank: number
6358
_version: Version // step version
@@ -94,7 +89,6 @@ export interface PreparedMigration {
9489
automaticStepCount: number
9590
manualStepCount: number
9691
ignoredStepCount: number
97-
manualInputs: MigrationStepInput[]
9892
partialMigration: boolean
9993
}
10094
export async function prepareMigration(returnAllChunks?: boolean): Promise<PreparedMigration> {
@@ -130,7 +124,6 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
130124
validate: step.validate,
131125
canBeRunAutomatically: step.canBeRunAutomatically,
132126
migrate: step.migrate,
133-
input: step.input,
134127
dependOnResultFrom: step.dependOnResultFrom,
135128
version: step.version,
136129
_version: parseVersion(step.version),
@@ -167,9 +160,6 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
167160
const ignoredSteps: { [id: string]: true } = {}
168161
let includesCoreStep = false
169162
for (const step of allMigrationSteps) {
170-
if (!step.canBeRunAutomatically && (!step.input || (Array.isArray(step.input) && !step.input.length)))
171-
throw new Meteor.Error(500, `MigrationStep "${step.id}" is manual, but no input is provided`)
172-
173163
if (step.chunk.sourceType !== MigrationStepType.CORE && includesCoreStep) {
174164
// stop here as core migrations need to be run before anything else can
175165
partialMigration = true
@@ -232,39 +222,12 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
232222
// check if there are any manual steps:
233223
// (this makes an automatic migration impossible)
234224

235-
const manualInputs: Array<MigrationStepInput> = []
236225
const stepsHash: Array<string> = []
237226
for (const step of Object.values<MigrationStepInternal>(migrationSteps)) {
238227
stepsHash.push(step.id)
239228
step.chunk._steps.push(step.id)
240229
if (!step.canBeRunAutomatically) {
241230
manualStepCount++
242-
243-
if (step.input) {
244-
let input: Array<MigrationStepInput> = []
245-
if (Array.isArray(step.input)) {
246-
input = clone(step.input)
247-
} else if (typeof step.input === 'function') {
248-
if (step.chunk.sourceType === MigrationStepType.CORE) {
249-
const inputFunction = step.input as InputFunctionCore
250-
input = inputFunction()
251-
} else throw new Meteor.Error(500, `Unknown step.chunk.sourceType "${step.chunk.sourceType}"`)
252-
}
253-
if (input.length) {
254-
for (const i of input) {
255-
if (i.label && typeof step._validateResult === 'string') {
256-
i.label = (i.label + '').replace(/\$validation/g, step._validateResult)
257-
}
258-
if (i.description && typeof step._validateResult === 'string') {
259-
i.description = (i.description + '').replace(/\$validation/g, step._validateResult)
260-
}
261-
manualInputs.push({
262-
...i,
263-
stepId: step.id,
264-
})
265-
}
266-
}
267-
}
268231
} else {
269232
automaticStepCount++
270233
}
@@ -290,15 +253,13 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
290253
automaticStepCount: automaticStepCount,
291254
manualStepCount: manualStepCount,
292255
ignoredStepCount: ignoredStepCount,
293-
manualInputs: manualInputs,
294256
partialMigration: partialMigration,
295257
}
296258
}
297259

298260
export async function runMigration(
299261
chunks: Array<MigrationChunk>,
300262
hash: string,
301-
inputResults: Array<MigrationStepInputResult>,
302263
isFirstOfPartialMigrations = true,
303264
chunksLeft = 20
304265
): Promise<RunMigrationResult> {
@@ -312,19 +273,9 @@ export async function runMigration(
312273
// Verify the input:
313274
const migration = await prepareMigration(true)
314275

315-
const manualInputsWithUserPrompt = migration.manualInputs.filter((manualInput) => {
316-
return !!(manualInput.stepId && manualInput.attribute)
317-
})
318276
if (migration.hash !== hash)
319277
throw new Meteor.Error(500, `Migration input hash differ from expected: "${hash}", "${migration.hash}"`)
320278

321-
if (manualInputsWithUserPrompt.length !== inputResults.length) {
322-
throw new Meteor.Error(
323-
500,
324-
`Migration manualInput lengths differ from expected: "${inputResults.length}", "${migration.manualInputs.length}"`
325-
)
326-
}
327-
328279
// Check that chunks match:
329280
let unmatchedChunk = migration.chunks.find((migrationChunk) => {
330281
return !chunks.find((chunk) => {
@@ -375,26 +326,16 @@ export async function runMigration(
375326
`Migration: ${migration.automaticStepCount} automatic and ${migration.manualStepCount} manual steps (${migration.ignoredStepCount} ignored).`
376327
)
377328

378-
logger.debug(inputResults)
379-
380329
for (const step of migration.steps) {
381330
try {
382-
// Prepare input from user
383-
const stepInput: MigrationStepInputFilteredResult = {}
384-
for (const ir of inputResults) {
385-
if (ir.stepId === step.id) {
386-
stepInput[ir.attribute] = ir.value
387-
}
388-
}
389-
390331
// Run the migration script
391332

392333
if (step.migrate !== undefined) {
393334
logger.info(`Running migration step "${step.id}"`)
394335

395336
if (step.chunk.sourceType === MigrationStepType.CORE) {
396337
const migration = step.migrate as MigrateFunctionCore
397-
await migration(stepInput)
338+
await migration()
398339
} else throw new Meteor.Error(500, `Unknown step.chunk.sourceType "${step.chunk.sourceType}"`)
399340
}
400341

@@ -433,13 +374,7 @@ export async function runMigration(
433374
const s = await getMigrationStatus()
434375
if (s.migration.automaticStepCount > 0 || s.migration.manualStepCount > 0) {
435376
try {
436-
const res = await runMigration(
437-
s.migration.chunks,
438-
s.migration.hash,
439-
inputResults,
440-
false,
441-
chunksLeft - 1
442-
)
377+
const res = await runMigration(s.migration.chunks, s.migration.hash, false, chunksLeft - 1)
443378
if (res.migrationCompleted) {
444379
return res
445380
}
@@ -493,7 +428,6 @@ export async function getMigrationStatus(): Promise<GetMigrationStatusResult> {
493428
migration: {
494429
canDoAutomaticMigration: migration.manualStepCount === 0,
495430

496-
manualInputs: migration.manualInputs,
497431
hash: migration.hash,
498432
chunks: migration.chunks,
499433

meteor/server/migration/lib.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import _ from 'underscore'
2-
import { MigrationStepCore } from '@sofie-automation/blueprints-integration'
2+
import { MigrationStepCore } from '@sofie-automation/meteor-lib/dist/migrations'
33
import { objectPathGet } from '@sofie-automation/corelib/dist/lib'
44
import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString'
55
import { Meteor } from 'meteor/meteor'

packages/blueprints-integration/src/api/showStyle.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import type {
2121
} from '../context/index.js'
2222
import type { IngestAdlib, ExtendedIngestRundown, IngestRundown } from '../ingest.js'
2323
import type { IBlueprintExternalMessageQueueObj } from '../message.js'
24-
import type {} from '../migrations.js'
2524
import type {
2625
IBlueprintAdLibPiece,
2726
IBlueprintResolvedPieceInstance,

packages/blueprints-integration/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ export * from './ingest.js'
99
export * from './ingest-types.js'
1010
export * from './lib.js'
1111
export * from './message.js'
12-
export * from './migrations.js'
1312
export * from './package.js'
1413
export * from './packageInfo.js'
1514
export * from './documents/index.js'

packages/meteor-lib/src/api/migration.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { MigrationStepInput, MigrationStepInputResult } from '@sofie-automation/blueprints-integration'
21
import {
32
BlueprintId,
43
CoreSystemId,
@@ -19,7 +18,6 @@ export interface NewMigrationAPI {
1918
runMigration(
2019
chunks: Array<MigrationChunk>,
2120
hash: string,
22-
inputResults: Array<MigrationStepInputResult>,
2321
isFirstOfPartialMigrations?: boolean
2422
): Promise<RunMigrationResult>
2523
forceMigration(chunks: Array<MigrationChunk>): Promise<void>
@@ -104,7 +102,6 @@ export interface GetMigrationStatusResult {
104102

105103
migration: {
106104
canDoAutomaticMigration: boolean
107-
manualInputs: Array<MigrationStepInput>
108105
hash: string
109106
automaticStepCount: number
110107
manualStepCount: number

0 commit comments

Comments
 (0)