Skip to content

Commit 78b49c9

Browse files
committed
wip
1 parent ad8c458 commit 78b49c9

File tree

8 files changed

+63
-245
lines changed

8 files changed

+63
-245
lines changed

packages/job-worker/src/blueprints/context/watchedPackages.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
import {
2-
ExpectedPackageDB,
3-
ExpectedPackageDBBase,
4-
ExpectedPackageFromRundown,
5-
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
61
import { PackageInfoDB } from '@sofie-automation/corelib/dist/dataModel/PackageInfos'
72
import { JobContext } from '../../jobs'
83
import { ExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/Ids'
94
import { Filter as FilterQuery } from 'mongodb'
105
import { PackageInfo } from '@sofie-automation/blueprints-integration'
116
import { unprotectObjectArray } from '@sofie-automation/corelib/dist/protectedString'
12-
import { ExpectedPackageForIngestModel, IngestModelReadonly } from '../../ingest/model/IngestModel'
7+
import { IngestModelReadonly } from '../../ingest/model/IngestModel'
138
import { ReadonlyDeep } from 'type-fest'
9+
import {
10+
stripExpectedPackageDBToIngestExpectedPackage,
11+
type IngestExpectedPackage,
12+
} from '../../ingest/model/IngestExpectedPackage'
13+
import { ExpectedPackageDBNew } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
1414

1515
/**
1616
* This is a helper class to simplify exposing packageInfo to various places in the blueprints
1717
*/
1818
export class WatchedPackagesHelper {
19-
private readonly packages = new Map<ExpectedPackageId, ReadonlyDeep<ExpectedPackageDB>>()
19+
private readonly packages = new Map<ExpectedPackageId, ReadonlyDeep<IngestExpectedPackage>>()
2020

2121
private constructor(
22-
packages: ReadonlyDeep<ExpectedPackageDB[]>,
22+
packages: ReadonlyDeep<IngestExpectedPackage[]>,
2323
private readonly packageInfos: ReadonlyDeep<PackageInfoDB[]>
2424
) {
2525
for (const pkg of packages) {
@@ -39,21 +39,25 @@ export class WatchedPackagesHelper {
3939
* @param studioId The studio this is for
4040
* @param filter A mongo query to specify the packages that should be included
4141
*/
42-
static async create<T extends ExpectedPackageDBBase = ExpectedPackageDBBase>(
42+
static async create(
4343
context: JobContext,
44-
filter: FilterQuery<Omit<T, 'studioId'>>
44+
filter: FilterQuery<Omit<ExpectedPackageDBNew, 'studioId'>>
4545
): Promise<WatchedPackagesHelper> {
4646
// Load all the packages and the infos that are watched
4747
const watchedPackages = await context.directCollections.ExpectedPackages.findFetch({
4848
...filter,
4949
studioId: context.studioId,
50-
} as any) // TODO: don't use any here
50+
})
5151
const watchedPackageInfos = await context.directCollections.PackageInfos.findFetch({
5252
studioId: context.studioId,
5353
packageId: { $in: watchedPackages.map((p) => p._id) },
5454
})
5555

56-
return new WatchedPackagesHelper(watchedPackages, watchedPackageInfos)
56+
const watchedIngestPackages: IngestExpectedPackage[] = watchedPackages.map(
57+
stripExpectedPackageDBToIngestExpectedPackage
58+
)
59+
60+
return new WatchedPackagesHelper(watchedIngestPackages, watchedPackageInfos)
5761
}
5862

5963
/**
@@ -65,7 +69,7 @@ export class WatchedPackagesHelper {
6569
context: JobContext,
6670
ingestModel: IngestModelReadonly
6771
): Promise<WatchedPackagesHelper> {
68-
const packages: ReadonlyDeep<ExpectedPackageForIngestModel>[] = []
72+
const packages: ReadonlyDeep<IngestExpectedPackage>[] = []
6973

7074
packages.push(...ingestModel.expectedPackagesForRundownBaseline)
7175

@@ -77,7 +81,7 @@ export class WatchedPackagesHelper {
7781

7882
return this.#createFromPackages(
7983
context,
80-
packages.filter((pkg) => !!pkg.listenToPackageInfoUpdates)
84+
packages.filter((pkg) => !!pkg.package.listenToPackageInfoUpdates)
8185
)
8286
}
8387

@@ -92,7 +96,7 @@ export class WatchedPackagesHelper {
9296
ingestModel: IngestModelReadonly,
9397
segmentExternalIds: string[]
9498
): Promise<WatchedPackagesHelper> {
95-
const packages: ReadonlyDeep<ExpectedPackageFromRundown>[] = []
99+
const packages: ReadonlyDeep<IngestExpectedPackage>[] = []
96100

97101
for (const externalId of segmentExternalIds) {
98102
const segment = ingestModel.getSegmentByExternalId(externalId)
@@ -105,11 +109,11 @@ export class WatchedPackagesHelper {
105109

106110
return this.#createFromPackages(
107111
context,
108-
packages.filter((pkg) => !!pkg.listenToPackageInfoUpdates)
112+
packages.filter((pkg) => !!pkg.package.listenToPackageInfoUpdates)
109113
)
110114
}
111115

112-
static async #createFromPackages(context: JobContext, packages: ReadonlyDeep<ExpectedPackageDB>[]) {
116+
static async #createFromPackages(context: JobContext, packages: ReadonlyDeep<IngestExpectedPackage>[]) {
113117
// Load all the packages and the infos that are watched
114118
const watchedPackageInfos =
115119
packages.length > 0
@@ -127,8 +131,8 @@ export class WatchedPackagesHelper {
127131
* This is useful so that all the data for a rundown can be loaded at the start of an ingest operation, and then subsets can be taken for particular blueprint methods without needing to do more db operations.
128132
* @param func A filter to check if each package should be included
129133
*/
130-
filter(_context: JobContext, func: (pkg: ReadonlyDeep<ExpectedPackageDB>) => boolean): WatchedPackagesHelper {
131-
const watchedPackages: ReadonlyDeep<ExpectedPackageDB>[] = []
134+
filter(_context: JobContext, func: (pkg: ReadonlyDeep<IngestExpectedPackage>) => boolean): WatchedPackagesHelper {
135+
const watchedPackages: ReadonlyDeep<IngestExpectedPackage>[] = []
132136
for (const pkg of this.packages.values()) {
133137
if (func(pkg)) watchedPackages.push(pkg)
134138
}
@@ -139,7 +143,7 @@ export class WatchedPackagesHelper {
139143
return new WatchedPackagesHelper(watchedPackages, watchedPackageInfos)
140144
}
141145

142-
getPackage(packageId: ExpectedPackageId): ReadonlyDeep<ExpectedPackageDB> | undefined {
146+
getPackage(packageId: ExpectedPackageId): ReadonlyDeep<IngestExpectedPackage> | undefined {
143147
return this.packages.get(packageId)
144148
}
145149

packages/job-worker/src/ingest/__tests__/expectedPackages.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { protectString } from '@sofie-automation/corelib/dist/protectedString'
66
import { defaultPart, defaultPiece, defaultAdLibPiece } from '../../__mocks__/defaultCollectionObjects'
77
import { LAYER_IDS } from '../../__mocks__/presetCollections'
88
import { ExpectedPackage, PieceLifespan, VTContent } from '@sofie-automation/blueprints-integration'
9-
import { updateExpectedPackagesForPartModel } from '../expectedPackages'
9+
import { updateExpectedMediaAndPlayoutItemsForPartModel } from '../expectedPackages'
1010
import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context'
1111
import { ReadonlyDeep } from 'type-fest'
1212
import { IngestPartModel } from '../model/IngestPartModel'
@@ -141,7 +141,7 @@ describe('Expected Media Items', () => {
141141
},
142142
}
143143

144-
updateExpectedPackagesForPartModel(context, partModel)
144+
updateExpectedMediaAndPlayoutItemsForPartModel(context, partModel)
145145

146146
expect(setExpectedPackages).toHaveBeenCalledTimes(1)
147147
expect(setExpectedPackages.mock.calls[0][0]).toHaveLength(4)

packages/job-worker/src/ingest/expectedPackages.ts

Lines changed: 4 additions & 206 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
1-
import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction'
2-
import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece'
31
import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction'
42
import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece'
53
import {
64
ExpectedPackageDBType,
7-
ExpectedPackageDBFromPiece,
8-
ExpectedPackageDBFromBaselineAdLibPiece,
9-
ExpectedPackageDBFromAdLibAction,
10-
ExpectedPackageDBFromBaselineAdLibAction,
115
ExpectedPackageDBFromBucketAdLib,
126
ExpectedPackageDBFromBucketAdLibAction,
137
ExpectedPackageDBBase,
14-
ExpectedPackageDBFromRundownBaselineObjects,
158
getContentVersionHash,
169
getExpectedPackageId,
17-
ExpectedPackageFromRundown,
1810
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
1911
import {
20-
SegmentId,
2112
RundownId,
2213
AdLibActionId,
2314
PieceId,
@@ -26,9 +17,6 @@ import {
2617
BucketAdLibId,
2718
StudioId,
2819
} from '@sofie-automation/corelib/dist/dataModel/Ids'
29-
import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece'
30-
import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction'
31-
import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece'
3220
import { saveIntoDb } from '../db/changes'
3321
import { PlayoutModel } from '../playout/model/PlayoutModel'
3422
import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel'
@@ -41,214 +29,24 @@ import {
4129
updateExpectedPlayoutItemsForRundownBaseline,
4230
} from './expectedPlayoutItems'
4331
import { JobContext, JobStudio } from '../jobs'
44-
import { ExpectedPackageForIngestModelBaseline, IngestModel } from './model/IngestModel'
32+
import { IngestModel } from './model/IngestModel'
4533
import { IngestPartModel } from './model/IngestPartModel'
4634
import { clone } from '@sofie-automation/corelib/dist/lib'
4735

48-
export function updateExpectedPackagesForPartModel(context: JobContext, part: IngestPartModel): void {
36+
export function updateExpectedMediaAndPlayoutItemsForPartModel(context: JobContext, part: IngestPartModel): void {
4937
updateExpectedMediaItemsForPartModel(context, part)
5038
updateExpectedPlayoutItemsForPartModel(context, part)
51-
52-
const expectedPackages: ExpectedPackageFromRundown[] = [
53-
...generateExpectedPackagesForPiece(
54-
context.studio,
55-
part.part.rundownId,
56-
part.part.segmentId,
57-
part.pieces,
58-
ExpectedPackageDBType.PIECE
59-
),
60-
...generateExpectedPackagesForPiece(
61-
context.studio,
62-
part.part.rundownId,
63-
part.part.segmentId,
64-
part.adLibPieces,
65-
ExpectedPackageDBType.ADLIB_PIECE
66-
),
67-
...generateExpectedPackagesForAdlibAction(
68-
context.studio,
69-
part.part.rundownId,
70-
part.part.segmentId,
71-
part.adLibActions
72-
),
73-
]
74-
75-
part.setExpectedPackages(expectedPackages)
7639
}
7740

78-
export async function updateExpectedPackagesForRundownBaseline(
41+
export async function updateExpectedMediaAndPlayoutItemsForRundownBaseline(
7942
context: JobContext,
8043
ingestModel: IngestModel,
81-
baseline: BlueprintResultBaseline | undefined,
82-
forceBaseline = false
44+
baseline: BlueprintResultBaseline | undefined
8345
): Promise<void> {
8446
await updateExpectedMediaItemsForRundownBaseline(context, ingestModel)
8547
await updateExpectedPlayoutItemsForRundownBaseline(context, ingestModel, baseline)
86-
87-
const expectedPackages: ExpectedPackageForIngestModelBaseline[] = []
88-
89-
const preserveTypesDuringSave = new Set<ExpectedPackageDBType>()
90-
91-
// Only regenerate the baseline types if they are already loaded into memory
92-
// If the data isn't already loaded, then we haven't made any changes to the baseline adlibs
93-
// This means we can skip regenerating them as it is guaranteed there will be no changes
94-
const baselineAdlibPieceCache = forceBaseline
95-
? await ingestModel.rundownBaselineAdLibPieces.get()
96-
: ingestModel.rundownBaselineAdLibPieces.getIfLoaded()
97-
if (baselineAdlibPieceCache) {
98-
expectedPackages.push(
99-
...generateExpectedPackagesForBaselineAdlibPiece(
100-
context.studio,
101-
ingestModel.rundownId,
102-
baselineAdlibPieceCache
103-
)
104-
)
105-
} else {
106-
// We haven't regenerated anything, so preserve the values in the save
107-
preserveTypesDuringSave.add(ExpectedPackageDBType.BASELINE_ADLIB_PIECE)
108-
}
109-
const baselineAdlibActionCache = forceBaseline
110-
? await ingestModel.rundownBaselineAdLibActions.get()
111-
: ingestModel.rundownBaselineAdLibActions.getIfLoaded()
112-
if (baselineAdlibActionCache) {
113-
expectedPackages.push(
114-
...generateExpectedPackagesForBaselineAdlibAction(
115-
context.studio,
116-
ingestModel.rundownId,
117-
baselineAdlibActionCache
118-
)
119-
)
120-
} else {
121-
// We haven't regenerated anything, so preserve the values in the save
122-
preserveTypesDuringSave.add(ExpectedPackageDBType.BASELINE_ADLIB_ACTION)
123-
}
124-
125-
if (baseline) {
126-
// Fill in ids of unnamed expectedPackages
127-
setDefaultIdOnExpectedPackages(baseline.expectedPackages)
128-
129-
const bases = generateExpectedPackageBases(
130-
context.studio,
131-
ingestModel.rundownId,
132-
baseline.expectedPackages ?? []
133-
)
134-
135-
expectedPackages.push(
136-
...bases.map((item): ExpectedPackageDBFromRundownBaselineObjects => {
137-
return {
138-
...item,
139-
fromPieceType: ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS,
140-
rundownId: ingestModel.rundownId,
141-
pieceId: null,
142-
}
143-
})
144-
)
145-
} else {
146-
// We haven't regenerated anything, so preserve the values in the save
147-
preserveTypesDuringSave.add(ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS)
148-
}
149-
150-
// Preserve anything existing
151-
for (const expectedPackage of ingestModel.expectedPackagesForRundownBaseline) {
152-
if (preserveTypesDuringSave.has(expectedPackage.fromPieceType)) {
153-
expectedPackages.push(clone<ExpectedPackageForIngestModelBaseline>(expectedPackage))
154-
}
155-
}
156-
157-
ingestModel.setExpectedPackagesForRundownBaseline(expectedPackages)
15848
}
15949

160-
function generateExpectedPackagesForPiece(
161-
studio: ReadonlyDeep<JobStudio>,
162-
rundownId: RundownId,
163-
segmentId: SegmentId,
164-
pieces: ReadonlyDeep<Piece | AdLibPiece>[],
165-
type: ExpectedPackageDBType.PIECE | ExpectedPackageDBType.ADLIB_PIECE
166-
) {
167-
const packages: ExpectedPackageDBFromPiece[] = []
168-
for (const piece of pieces) {
169-
const partId = 'startPartId' in piece ? piece.startPartId : piece.partId
170-
if (piece.expectedPackages && partId) {
171-
const bases = generateExpectedPackageBases(studio, piece._id, piece.expectedPackages)
172-
for (const base of bases) {
173-
packages.push({
174-
...base,
175-
rundownId,
176-
segmentId,
177-
partId,
178-
pieceId: piece._id,
179-
fromPieceType: type,
180-
})
181-
}
182-
}
183-
}
184-
return packages
185-
}
186-
function generateExpectedPackagesForBaselineAdlibPiece(
187-
studio: ReadonlyDeep<JobStudio>,
188-
rundownId: RundownId,
189-
pieces: ReadonlyDeep<RundownBaselineAdLibItem[]>
190-
) {
191-
const packages: ExpectedPackageDBFromBaselineAdLibPiece[] = []
192-
for (const piece of pieces) {
193-
if (piece.expectedPackages) {
194-
const bases = generateExpectedPackageBases(studio, piece._id, piece.expectedPackages)
195-
for (const base of bases) {
196-
packages.push({
197-
...base,
198-
rundownId,
199-
pieceId: piece._id,
200-
fromPieceType: ExpectedPackageDBType.BASELINE_ADLIB_PIECE,
201-
})
202-
}
203-
}
204-
}
205-
return packages
206-
}
207-
function generateExpectedPackagesForAdlibAction(
208-
studio: ReadonlyDeep<JobStudio>,
209-
rundownId: RundownId,
210-
segmentId: SegmentId,
211-
actions: ReadonlyDeep<AdLibAction[]>
212-
) {
213-
const packages: ExpectedPackageDBFromAdLibAction[] = []
214-
for (const action of actions) {
215-
if (action.expectedPackages) {
216-
const bases = generateExpectedPackageBases(studio, action._id, action.expectedPackages)
217-
for (const base of bases) {
218-
packages.push({
219-
...base,
220-
rundownId,
221-
segmentId,
222-
partId: action.partId,
223-
pieceId: action._id,
224-
fromPieceType: ExpectedPackageDBType.ADLIB_ACTION,
225-
})
226-
}
227-
}
228-
}
229-
return packages
230-
}
231-
function generateExpectedPackagesForBaselineAdlibAction(
232-
studio: ReadonlyDeep<JobStudio>,
233-
rundownId: RundownId,
234-
actions: ReadonlyDeep<RundownBaselineAdLibAction[]>
235-
) {
236-
const packages: ExpectedPackageDBFromBaselineAdLibAction[] = []
237-
for (const action of actions) {
238-
if (action.expectedPackages) {
239-
const bases = generateExpectedPackageBases(studio, action._id, action.expectedPackages)
240-
for (const base of bases) {
241-
packages.push({
242-
...base,
243-
rundownId,
244-
pieceId: action._id,
245-
fromPieceType: ExpectedPackageDBType.BASELINE_ADLIB_ACTION,
246-
})
247-
}
248-
}
249-
}
250-
return packages
251-
}
25250
function generateExpectedPackagesForBucketAdlib(studio: ReadonlyDeep<JobStudio>, adlibs: BucketAdLib[]) {
25351
const packages: ExpectedPackageDBFromBucketAdLib[] = []
25452
for (const adlib of adlibs) {

0 commit comments

Comments
 (0)