Skip to content

Commit 94d8f6b

Browse files
committed
feat: change structure of ExpectedPackage documents
This is a preparation step for the documents having multiple owners. In the current iteration, each document will remain with one owner.
1 parent ba382ae commit 94d8f6b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1583
-881
lines changed

meteor/server/api/__tests__/cleanup.test.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ async function setDefaultDatatoDB(env: DefaultEnvironment, now: number) {
193193
startSegmentId: segmentId,
194194
timelineObjectsString: '' as any,
195195
}
196-
const pieceId = await Pieces.mutableCollection.insertAsync(piece)
196+
await Pieces.mutableCollection.insertAsync(piece)
197197

198198
await AdLibActions.mutableCollection.insertAsync({
199199
_id: getRandomId(),
@@ -256,21 +256,12 @@ async function setDefaultDatatoDB(env: DefaultEnvironment, now: number) {
256256
})
257257
const packageId = await ExpectedPackages.mutableCollection.insertAsync({
258258
_id: getRandomId(),
259-
blueprintPackageId: '',
260-
bucketId,
261-
content: {} as any,
262-
contentVersionHash: '',
263-
created: 0,
264-
fromPieceType: '' as any,
265-
layers: [],
266-
pieceId,
267-
rundownId,
268-
segmentId,
269-
sideEffect: {} as any,
270259
studioId,
271-
sources: {} as any,
272-
type: '' as any,
273-
version: {} as any,
260+
rundownId,
261+
bucketId: null,
262+
created: 0,
263+
package: {} as any,
264+
ingestSources: [] as any,
274265
})
275266
await ExpectedPackageWorkStatuses.insertAsync({
276267
_id: getRandomId(),

meteor/server/api/ingest/debug.ts

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { QueueStudioJob } from '../../worker/worker'
88
import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio'
99
import { RundownPlaylistId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1010
import { MeteorDebugMethods } from '../../methods'
11-
import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
1211

1312
MeteorDebugMethods({
1413
/**
@@ -47,31 +46,4 @@ MeteorDebugMethods({
4746
segmentExternalId: segment.externalId,
4847
})
4948
},
50-
/**
51-
* Regenerate all the expected packages for all rundowns in the system.
52-
* Additionally it will recreate any expectedMediaItems and expectedPlayoutItems.
53-
* This shouldn't be necessary as ingest will do this for each rundown as part of its workflow
54-
*/
55-
debug_recreateExpectedPackages: async () => {
56-
const rundowns = (await Rundowns.findFetchAsync(
57-
{},
58-
{
59-
projection: {
60-
_id: 1,
61-
studioId: 1,
62-
source: 1,
63-
},
64-
}
65-
)) as Array<Pick<DBRundown, '_id' | 'studioId' | 'source'>>
66-
67-
await Promise.all(
68-
rundowns
69-
.filter((rundown) => rundown.source.type !== 'snapshot')
70-
.map(async (rundown) =>
71-
runIngestOperation(rundown.studioId, IngestJobs.ExpectedPackagesRegenerate, {
72-
rundownId: rundown._id,
73-
})
74-
)
75-
)
76-
},
7749
})

meteor/server/api/ingest/packageInfo.ts

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import {
2-
ExpectedPackageDBFromBucketAdLib,
3-
ExpectedPackageDBFromBucketAdLibAction,
4-
ExpectedPackageDBFromStudioBaselineObjects,
52
ExpectedPackageDBType,
6-
ExpectedPackageFromRundown,
7-
ExpectedPackageFromRundownBaseline,
3+
ExpectedPackageDB,
4+
ExpectedPackageIngestSourceBucket,
85
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
96
import { PackageInfoDB } from '@sofie-automation/corelib/dist/dataModel/PackageInfos'
107
import { ExpectedPackages, Rundowns } from '../../collections'
@@ -28,51 +25,58 @@ export async function onUpdatedPackageInfo(packageId: ExpectedPackageId, _doc: P
2825
return
2926
}
3027

31-
if (pkg.listenToPackageInfoUpdates) {
32-
switch (pkg.fromPieceType) {
33-
case ExpectedPackageDBType.PIECE:
34-
case ExpectedPackageDBType.ADLIB_PIECE:
35-
case ExpectedPackageDBType.ADLIB_ACTION:
36-
case ExpectedPackageDBType.BASELINE_ADLIB_PIECE:
37-
case ExpectedPackageDBType.BASELINE_ADLIB_ACTION:
38-
case ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS:
39-
onUpdatedPackageInfoForRundownDebounce(pkg)
40-
break
41-
case ExpectedPackageDBType.BUCKET_ADLIB:
42-
case ExpectedPackageDBType.BUCKET_ADLIB_ACTION:
43-
onUpdatedPackageInfoForBucketItemDebounce(pkg)
44-
break
45-
case ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS:
46-
onUpdatedPackageInfoForStudioBaselineDebounce(pkg)
47-
break
48-
default:
49-
assertNever(pkg)
50-
break
28+
if (pkg.package.listenToPackageInfoUpdates) {
29+
for (const source of pkg.ingestSources) {
30+
switch (source.fromPieceType) {
31+
case ExpectedPackageDBType.PIECE:
32+
case ExpectedPackageDBType.ADLIB_PIECE:
33+
case ExpectedPackageDBType.ADLIB_ACTION:
34+
case ExpectedPackageDBType.BASELINE_ADLIB_PIECE:
35+
case ExpectedPackageDBType.BASELINE_ADLIB_ACTION:
36+
case ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS:
37+
onUpdatedPackageInfoForRundownDebounce(pkg)
38+
break
39+
case ExpectedPackageDBType.BUCKET_ADLIB:
40+
case ExpectedPackageDBType.BUCKET_ADLIB_ACTION:
41+
onUpdatedPackageInfoForBucketItemDebounce(pkg, source)
42+
break
43+
case ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS:
44+
onUpdatedPackageInfoForStudioBaselineDebounce(pkg)
45+
break
46+
default:
47+
assertNever(source)
48+
break
49+
}
5150
}
5251
}
5352
}
5453

5554
const pendingRundownPackageUpdates = new Map<RundownId, Array<ExpectedPackageId>>()
56-
function onUpdatedPackageInfoForRundownDebounce(pkg: ExpectedPackageFromRundown | ExpectedPackageFromRundownBaseline) {
57-
const existingEntry = pendingRundownPackageUpdates.get(pkg.rundownId)
55+
function onUpdatedPackageInfoForRundownDebounce(pkg: ExpectedPackageDB) {
56+
if (!pkg.rundownId) {
57+
logger.error(`Updating ExpectedPackage "${pkg._id}" for Rundown "${pkg.rundownId}" not possible`)
58+
return
59+
}
60+
61+
const rundownId = pkg.rundownId
62+
63+
const existingEntry = pendingRundownPackageUpdates.get(rundownId)
5864
if (existingEntry) {
5965
// already queued, add to the batch
6066
existingEntry.push(pkg._id)
6167
} else {
62-
pendingRundownPackageUpdates.set(pkg.rundownId, [pkg._id])
68+
pendingRundownPackageUpdates.set(rundownId, [pkg._id])
6369
}
6470

6571
// TODO: Scaling - this won't batch correctly if package manager directs calls to multiple instances
6672
lazyIgnore(
67-
`onUpdatedPackageInfoForRundown_${pkg.rundownId}`,
73+
`onUpdatedPackageInfoForRundown_${rundownId}`,
6874
() => {
69-
const packageIds = pendingRundownPackageUpdates.get(pkg.rundownId)
75+
const packageIds = pendingRundownPackageUpdates.get(rundownId)
7076
if (packageIds) {
71-
pendingRundownPackageUpdates.delete(pkg.rundownId)
72-
onUpdatedPackageInfoForRundown(pkg.rundownId, packageIds).catch((e) => {
73-
logger.error(
74-
`Updating ExpectedPackages for Rundown "${pkg.rundownId}" failed: ${stringifyError(e)}`
75-
)
77+
pendingRundownPackageUpdates.delete(rundownId)
78+
onUpdatedPackageInfoForRundown(rundownId, packageIds).catch((e) => {
79+
logger.error(`Updating ExpectedPackages for Rundown "${rundownId}" failed: ${stringifyError(e)}`)
7680
})
7781
}
7882
},
@@ -107,19 +111,24 @@ async function onUpdatedPackageInfoForRundown(
107111
})
108112
}
109113

110-
function onUpdatedPackageInfoForBucketItemDebounce(
111-
pkg: ExpectedPackageDBFromBucketAdLib | ExpectedPackageDBFromBucketAdLibAction
112-
) {
114+
function onUpdatedPackageInfoForBucketItemDebounce(pkg: ExpectedPackageDB, source: ExpectedPackageIngestSourceBucket) {
115+
if (!pkg.bucketId) {
116+
logger.error(`Updating ExpectedPackage "${pkg._id}" for Bucket "${pkg.bucketId}" not possible`)
117+
return
118+
}
119+
120+
const bucketId = pkg.bucketId
121+
113122
lazyIgnore(
114-
`onUpdatedPackageInfoForBucket_${pkg.studioId}_${pkg.bucketId}_${pkg.pieceExternalId}`,
123+
`onUpdatedPackageInfoForBucket_${pkg.studioId}_${bucketId}_${source.pieceExternalId}`,
115124
() => {
116125
runIngestOperation(pkg.studioId, IngestJobs.BucketItemRegenerate, {
117-
bucketId: pkg.bucketId,
118-
externalId: pkg.pieceExternalId,
126+
bucketId: bucketId,
127+
externalId: source.pieceExternalId,
119128
}).catch((err) => {
120129
logger.error(
121-
`Updating ExpectedPackages for Bucket "${pkg.bucketId}" Item "${
122-
pkg.pieceExternalId
130+
`Updating ExpectedPackages for Bucket "${bucketId}" Item "${
131+
source.pieceExternalId
123132
}" failed: ${stringifyError(err)}`
124133
)
125134
})
@@ -128,7 +137,7 @@ function onUpdatedPackageInfoForBucketItemDebounce(
128137
)
129138
}
130139

131-
function onUpdatedPackageInfoForStudioBaselineDebounce(pkg: ExpectedPackageDBFromStudioBaselineObjects) {
140+
function onUpdatedPackageInfoForStudioBaselineDebounce(pkg: ExpectedPackageDB) {
132141
lazyIgnore(
133142
`onUpdatedPackageInfoForStudioBaseline_${pkg.studioId}`,
134143
() => {

meteor/server/api/integration/expectedPackages.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
} from '../../collections'
3434
import { logger } from '../../logging'
3535
import _ from 'underscore'
36+
import { ExpectedPackageDB } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
3637

3738
export namespace PackageManagerIntegration {
3839
export async function updateExpectedPackageWorkStatuses(
@@ -98,9 +99,17 @@ export namespace PackageManagerIntegration {
9899
const fromPackageIds = workStatus.fromPackages.map((p) => p.id)
99100
if (fromPackageIds.length) {
100101
ps.push(
101-
ExpectedPackages.findOneAsync({
102-
_id: { $in: fromPackageIds },
103-
}).then((expPackage) => {
102+
ExpectedPackages.findOneAsync(
103+
{
104+
_id: { $in: fromPackageIds },
105+
},
106+
{
107+
projection: {
108+
_id: 1,
109+
studioId: 1,
110+
},
111+
}
112+
).then((expPackage: Pick<ExpectedPackageDB, '_id' | 'studioId'> | undefined) => {
104113
if (!expPackage)
105114
throw new Meteor.Error(404, `ExpectedPackages "${fromPackageIds}" not found`)
106115

meteor/server/collections/packages-media.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,17 @@ export const ExpectedPackages = createAsyncOnlyReadOnlyMongoCollection<ExpectedP
3232
)
3333
registerIndex(ExpectedPackages, {
3434
studioId: 1,
35-
fromPieceType: 1,
3635
})
3736
registerIndex(ExpectedPackages, {
3837
studioId: 1,
39-
pieceId: 1,
38+
rundownId: 1,
39+
})
40+
registerIndex(ExpectedPackages, {
41+
studioId: 1,
42+
bucketId: 1,
4043
})
4144
registerIndex(ExpectedPackages, {
4245
rundownId: 1,
43-
pieceId: 1,
4446
})
4547

4648
export const ExpectedPackageWorkStatuses = createAsyncOnlyMongoCollection<ExpectedPackageWorkStatus>(

meteor/server/migration/1_50_0.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ import { JSONBlobStringify, JSONSchema, TSR } from '@sofie-automation/blueprints
3333
import { DEFAULT_MINIMUM_TAKE_SPAN } from '@sofie-automation/shared-lib/dist/core/constants'
3434
import { PartId } from '@sofie-automation/shared-lib/dist/core/model/Ids'
3535
import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString'
36-
import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
3736
import { AdLibActionId, PieceId, RundownBaselineAdLibActionId } from '@sofie-automation/corelib/dist/dataModel/Ids'
3837
import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece'
3938
import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece'
4039
import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction'
40+
import * as PackagesPreR53 from '@sofie-automation/corelib/dist/dataModel/Old/ExpectedPackagesR52'
4141

4242
// Release 50
4343

@@ -155,9 +155,9 @@ const oldDeviceTypeToNewMapping = {
155155
}
156156

157157
const EXPECTED_PACKAGE_TYPES_ADDED_PART_ID = [
158-
ExpectedPackageDBType.PIECE,
159-
ExpectedPackageDBType.ADLIB_PIECE,
160-
ExpectedPackageDBType.ADLIB_ACTION,
158+
PackagesPreR53.ExpectedPackageDBType.PIECE,
159+
PackagesPreR53.ExpectedPackageDBType.ADLIB_PIECE,
160+
PackagesPreR53.ExpectedPackageDBType.ADLIB_ACTION,
161161
]
162162

163163
export const addSteps = addMigrationSteps('1.50.0', [
@@ -871,10 +871,10 @@ export const addSteps = addMigrationSteps('1.50.0', [
871871
return false
872872
},
873873
migrate: async () => {
874-
const objects = await ExpectedPackages.findFetchAsync({
874+
const objects = (await ExpectedPackages.findFetchAsync({
875875
fromPieceType: { $in: EXPECTED_PACKAGE_TYPES_ADDED_PART_ID as any }, // Force the types, as the query does not match due to the interfaces
876876
partId: { $exists: false },
877-
})
877+
})) as unknown as Array<PackagesPreR53.ExpectedPackageDB>
878878

879879
const neededPieceIds: Array<PieceId | AdLibActionId | RundownBaselineAdLibActionId> = _.compact(
880880
objects.map((obj) => obj.pieceId)

0 commit comments

Comments
 (0)