Skip to content

Commit 877306a

Browse files
committed
feat: remove support for input during migrations
1 parent 469af0b commit 877306a

File tree

13 files changed

+60
-295
lines changed

13 files changed

+60
-295
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: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ 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 { MigrationStepCore, MigrationStepInputResult } from '@sofie-automation/blueprints-integration'
8+
import { MigrationStepCore } from '@sofie-automation/blueprints-integration'
109
import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio'
1110
import { MeteorCall } from '../../api/methods'
1211
import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
@@ -36,22 +35,7 @@ describe('Migrations', () => {
3635
async function getSystem() {
3736
return (await getCoreSystemAsync()) as ICoreSystem
3837
}
39-
function userInput(
40-
migrationStatus: GetMigrationStatusResult,
41-
userValues?: { [key: string]: any }
42-
): MigrationStepInputResult[] {
43-
return _.compact(
44-
_.map(migrationStatus.migration.manualInputs, (manualInput) => {
45-
if (manualInput.stepId && manualInput.attribute) {
46-
return literal<MigrationStepInputResult>({
47-
stepId: manualInput.stepId,
48-
attribute: manualInput.attribute,
49-
value: userValues && userValues[manualInput.stepId],
50-
})
51-
}
52-
})
53-
)
54-
}
38+
5539
test('System migrations, initial setup', async () => {
5640
expect((await getSystem()).version).toEqual(GENESIS_SYSTEM_VERSION)
5741

@@ -76,8 +60,7 @@ describe('Migrations', () => {
7660

7761
const migrationResult0: RunMigrationResult = await MeteorCall.migration.runMigration(
7862
migrationStatus0.migration.chunks,
79-
migrationStatus0.migration.hash,
80-
userInput(migrationStatus0)
63+
migrationStatus0.migration.hash
8164
)
8265

8366
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
@@ -92,7 +87,6 @@ export interface PreparedMigration {
9287
automaticStepCount: number
9388
manualStepCount: number
9489
ignoredStepCount: number
95-
manualInputs: MigrationStepInput[]
9690
partialMigration: boolean
9791
}
9892
export async function prepareMigration(returnAllChunks?: boolean): Promise<PreparedMigration> {
@@ -128,7 +122,6 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
128122
validate: step.validate.bind(step),
129123
canBeRunAutomatically: step.canBeRunAutomatically,
130124
migrate: step.migrate?.bind(step),
131-
input: step.input,
132125
dependOnResultFrom: step.dependOnResultFrom,
133126
version: step.version,
134127
_version: parseVersion(step.version),
@@ -165,9 +158,6 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
165158
const ignoredSteps: { [id: string]: true } = {}
166159
let includesCoreStep = false
167160
for (const step of allMigrationSteps) {
168-
if (!step.canBeRunAutomatically && (!step.input || (Array.isArray(step.input) && !step.input.length)))
169-
throw new Meteor.Error(500, `MigrationStep "${step.id}" is manual, but no input is provided`)
170-
171161
if (step.chunk.sourceType !== MigrationStepType.CORE && includesCoreStep) {
172162
// stop here as core migrations need to be run before anything else can
173163
partialMigration = true
@@ -230,39 +220,12 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
230220
// check if there are any manual steps:
231221
// (this makes an automatic migration impossible)
232222

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

296258
export async function runMigration(
297259
chunks: Array<MigrationChunk>,
298260
hash: string,
299-
inputResults: Array<MigrationStepInputResult>,
300261
isFirstOfPartialMigrations = true,
301262
chunksLeft = 20
302263
): Promise<RunMigrationResult> {
@@ -310,19 +271,9 @@ export async function runMigration(
310271
// Verify the input:
311272
const migration = await prepareMigration(true)
312273

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

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

376-
logger.debug(inputResults)
377-
378327
for (const step of migration.steps) {
379328
try {
380-
// Prepare input from user
381-
const stepInput: MigrationStepInputFilteredResult = {}
382-
for (const ir of inputResults) {
383-
if (ir.stepId === step.id) {
384-
stepInput[ir.attribute] = ir.value
385-
}
386-
}
387-
388329
// Run the migration script
389330

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

393334
if (step.chunk.sourceType === MigrationStepType.CORE) {
394335
const migration = step.migrate as MigrateFunctionCore
395-
await migration(stepInput)
336+
await migration()
396337
} else throw new Meteor.Error(500, `Unknown step.chunk.sourceType "${step.chunk.sourceType}"`)
397338
}
398339

@@ -431,13 +372,7 @@ export async function runMigration(
431372
const s = await getMigrationStatus()
432373
if (s.migration.automaticStepCount > 0 || s.migration.manualStepCount > 0) {
433374
try {
434-
const res = await runMigration(
435-
s.migration.chunks,
436-
s.migration.hash,
437-
inputResults,
438-
false,
439-
chunksLeft - 1
440-
)
375+
const res = await runMigration(s.migration.chunks, s.migration.hash, false, chunksLeft - 1)
441376
if (res.migrationCompleted) {
442377
return res
443378
}
@@ -491,7 +426,6 @@ export async function getMigrationStatus(): Promise<GetMigrationStatusResult> {
491426
migration: {
492427
canDoAutomaticMigration: migration.manualStepCount === 0,
493428

494-
manualInputs: migration.manualInputs,
495429
hash: migration.hash,
496430
chunks: migration.chunks,
497431

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'

0 commit comments

Comments
 (0)