Skip to content

Commit 3c4e7f4

Browse files
committed
wip
1 parent 9797041 commit 3c4e7f4

File tree

7 files changed

+163
-101
lines changed

7 files changed

+163
-101
lines changed

packages/corelib/src/dataModel/ExpectedPackages.ts

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
AdLibActionId,
66
BucketAdLibActionId,
77
BucketAdLibId,
8+
BucketId,
89
ExpectedPackageId,
910
PartId,
1011
PieceId,
@@ -71,8 +72,10 @@ export interface ExpectedPackageDBNew {
7172
/** The studio of the Rundown of the Piece this package belongs to */
7273
studioId: StudioId
7374

74-
/** The rundown this package belongs to, if any */
75+
/** The rundown this package belongs to, if any. Must not be set when bucketId is set */
7576
rundownId: RundownId | null
77+
/** The bucket this package belongs to, if any. Must not be set when rundownId is set */
78+
bucketId: BucketId | null
7679

7780
/** Hash that changes whenever the content or version changes. See getContentVersionHash() */
7881
contentVersionHash: string
@@ -90,6 +93,21 @@ export interface ExpectedPackageDBNew {
9093
// }
9194
}
9295

96+
export interface ExpectedPackageIngestSourceBucketPiece {
97+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB
98+
/** The Bucket adlib this package belongs to */
99+
pieceId: BucketAdLibId
100+
/** The `externalId` of the Bucket adlib this package belongs to */
101+
pieceExternalId: string
102+
}
103+
export interface ExpectedPackageIngestSourceBucketAdlibAction {
104+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION
105+
/** The Bucket adlib-action this package belongs to */
106+
pieceId: BucketAdLibActionId
107+
/** The `externalId` of the Bucket adlib-action this package belongs to */
108+
pieceExternalId: string
109+
}
110+
93111
export interface ExpectedPackageIngestSourcePiece {
94112
fromPieceType: ExpectedPackageDBType.PIECE | ExpectedPackageDBType.ADLIB_PIECE
95113
/** The Piece this package belongs to */
@@ -123,11 +141,16 @@ export interface ExpectedPackageIngestSourceBaselineObjects {
123141
}
124142

125143
export interface ExpectedPackageIngestSourceStudioBaseline {
144+
// Future: Technically this is a playout source, but for now it needs to be treated as an ingest source
126145
fromPieceType: ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS
127146
}
128147

129148
export type ExpectedPackageIngestSourcePart = ExpectedPackageIngestSourcePiece | ExpectedPackageIngestSourceAdlibAction
130149

150+
export type ExpectedPackageIngestSourceBucket =
151+
| ExpectedPackageIngestSourceBucketPiece
152+
| ExpectedPackageIngestSourceBucketAdlibAction
153+
131154
export type ExpectedPackageIngestSourceRundownBaseline =
132155
| ExpectedPackageIngestSourceBaselineAdlibPiece
133156
| ExpectedPackageIngestSourceBaselineAdlibAction
@@ -136,25 +159,9 @@ export type ExpectedPackageIngestSourceRundownBaseline =
136159
export type ExpectedPackageIngestSource =
137160
| ExpectedPackageIngestSourcePart
138161
| ExpectedPackageIngestSourceRundownBaseline
162+
| ExpectedPackageIngestSourceBucket
139163
| ExpectedPackageIngestSourceStudioBaseline
140164

141-
// export interface ExpectedPackageDBFromBucketAdLib extends ExpectedPackageDBBase {
142-
// fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB
143-
// bucketId: BucketId
144-
// /** The Bucket adlib this package belongs to */
145-
// pieceId: BucketAdLibId
146-
// /** The `externalId` of the Bucket adlib this package belongs to */
147-
// pieceExternalId: string
148-
// }
149-
// export interface ExpectedPackageDBFromBucketAdLibAction extends ExpectedPackageDBBase {
150-
// fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION
151-
// bucketId: BucketId
152-
// /** The Bucket adlib-action this package belongs to */
153-
// pieceId: BucketAdLibActionId
154-
// /** The `externalId` of the Bucket adlib-action this package belongs to */
155-
// pieceExternalId: string
156-
// }
157-
158165
export function getContentVersionHash(expectedPackage: ReadonlyDeep<Omit<ExpectedPackage.Any, '_id'>>): string {
159166
return hashObj({
160167
content: expectedPackage.content,
@@ -180,28 +187,28 @@ export function getExpectedPackageId(
180187
return protectString(`${ownerId}_${getHash(localExpectedPackageId)}`)
181188
}
182189

183-
export function getExpectedPackageIdTmp(
184-
/** Preferably a RundownId, but StudioId is allowed when not owned by a rundown */
185-
parentId: RundownId | StudioId,
186-
owner: ExpectedPackageIngestSource,
190+
export function getExpectedPackageIdFromIngestSource(
191+
/** Preferably a RundownId or BucketId, but StudioId is allowed when not owned by a rundown or bucket */
192+
parentId: RundownId | StudioId | BucketId,
193+
source: ExpectedPackageIngestSource,
187194
/** The locally unique id of the expectedPackage */
188195
localExpectedPackageId: ExpectedPackage.Base['_id']
189196
): ExpectedPackageId {
190197
let ownerId: string
191-
const ownerPieceType = owner.fromPieceType
192-
switch (owner.fromPieceType) {
198+
const ownerPieceType = source.fromPieceType
199+
switch (source.fromPieceType) {
193200
case ExpectedPackageDBType.PIECE:
194201
case ExpectedPackageDBType.ADLIB_PIECE:
195-
ownerId = unprotectString(owner.pieceId)
202+
ownerId = unprotectString(source.pieceId)
196203
break
197204
case ExpectedPackageDBType.ADLIB_ACTION:
198-
ownerId = unprotectString(owner.pieceId)
205+
ownerId = unprotectString(source.pieceId)
199206
break
200207
case ExpectedPackageDBType.BASELINE_ADLIB_PIECE:
201-
ownerId = unprotectString(owner.pieceId)
208+
ownerId = unprotectString(source.pieceId)
202209
break
203210
case ExpectedPackageDBType.BASELINE_ADLIB_ACTION:
204-
ownerId = unprotectString(owner.pieceId)
211+
ownerId = unprotectString(source.pieceId)
205212
break
206213
case ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS:
207214
ownerId = 'rundownBaselineObjects'
@@ -210,7 +217,7 @@ export function getExpectedPackageIdTmp(
210217
ownerId = 'studioBaseline'
211218
break
212219
default:
213-
assertNever(owner)
220+
assertNever(source)
214221
throw new Error(`Unknown fromPieceType "${ownerPieceType}"`)
215222
}
216223
return protectString(`${parentId}_${ownerId}_${getHash(localExpectedPackageId)}`)

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

Lines changed: 116 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,12 @@ import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/Buck
22
import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece'
33
import {
44
ExpectedPackageDBType,
5-
ExpectedPackageDBFromBucketAdLib,
6-
ExpectedPackageDBFromBucketAdLibAction,
7-
ExpectedPackageDBBase,
85
getContentVersionHash,
9-
getExpectedPackageId,
6+
ExpectedPackageDBNew,
7+
getExpectedPackageIdFromIngestSource,
8+
ExpectedPackageIngestSource,
109
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
11-
import {
12-
RundownId,
13-
AdLibActionId,
14-
PieceId,
15-
RundownBaselineAdLibActionId,
16-
BucketAdLibActionId,
17-
BucketAdLibId,
18-
StudioId,
19-
} from '@sofie-automation/corelib/dist/dataModel/Ids'
10+
import { AdLibActionId, PieceId, BucketId } from '@sofie-automation/corelib/dist/dataModel/Ids'
2011
import { saveIntoDb } from '../db/changes'
2112
import { PlayoutModel } from '../playout/model/PlayoutModel'
2213
import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel'
@@ -47,97 +38,152 @@ export async function updateExpectedMediaAndPlayoutItemsForRundownBaseline(
4738
await updateExpectedPlayoutItemsForRundownBaseline(context, ingestModel, baseline)
4839
}
4940

50-
function generateExpectedPackagesForBucketAdlib(studio: ReadonlyDeep<JobStudio>, adlibs: BucketAdLib[]) {
51-
const packages: ExpectedPackageDBFromBucketAdLib[] = []
52-
for (const adlib of adlibs) {
53-
if (adlib.expectedPackages) {
54-
const bases = generateExpectedPackageBases(studio, adlib._id, adlib.expectedPackages)
55-
for (const base of bases) {
56-
packages.push({
57-
...base,
58-
bucketId: adlib.bucketId,
41+
function generateExpectedPackagesForBucketAdlib(studio: ReadonlyDeep<JobStudio>, adlib: BucketAdLib) {
42+
const packages: ExpectedPackageDBNew[] = []
43+
44+
if (adlib.expectedPackages) {
45+
packages.push(
46+
...generateBucketExpectedPackages(
47+
studio,
48+
adlib.bucketId,
49+
{
50+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB,
5951
pieceId: adlib._id,
6052
pieceExternalId: adlib.externalId,
61-
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB,
62-
})
63-
}
64-
}
53+
},
54+
adlib.expectedPackages
55+
)
56+
)
6557
}
58+
6659
return packages
6760
}
68-
function generateExpectedPackagesForBucketAdlibAction(
69-
studio: ReadonlyDeep<JobStudio>,
70-
adlibActions: BucketAdLibAction[]
71-
) {
72-
const packages: ExpectedPackageDBFromBucketAdLibAction[] = []
73-
for (const action of adlibActions) {
74-
if (action.expectedPackages) {
75-
const bases = generateExpectedPackageBases(studio, action._id, action.expectedPackages)
76-
for (const base of bases) {
77-
packages.push({
78-
...base,
79-
bucketId: action.bucketId,
61+
function generateExpectedPackagesForBucketAdlibAction(studio: ReadonlyDeep<JobStudio>, action: BucketAdLibAction) {
62+
const packages: ExpectedPackageDBNew[] = []
63+
64+
if (action.expectedPackages) {
65+
packages.push(
66+
...generateBucketExpectedPackages(
67+
studio,
68+
action.bucketId,
69+
{
70+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION,
8071
pieceId: action._id,
8172
pieceExternalId: action.externalId,
82-
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION,
83-
})
84-
}
85-
}
73+
},
74+
action.expectedPackages
75+
)
76+
)
8677
}
78+
8779
return packages
8880
}
89-
function generateExpectedPackageBases(
81+
function generateBucketExpectedPackages(
9082
studio: ReadonlyDeep<JobStudio>,
91-
ownerId:
92-
| PieceId
93-
| AdLibActionId
94-
| RundownBaselineAdLibActionId
95-
| BucketAdLibId
96-
| BucketAdLibActionId
97-
| RundownId
98-
| StudioId,
83+
bucketId: BucketId,
84+
source: ExpectedPackageIngestSource,
9985
expectedPackages: ReadonlyDeep<ExpectedPackage.Any[]>
100-
) {
101-
const bases: Omit<ExpectedPackageDBBase, 'pieceId' | 'fromPieceType'>[] = []
86+
): ExpectedPackageDBNew[] {
87+
const bases: ExpectedPackageDBNew[] = []
10288

10389
for (let i = 0; i < expectedPackages.length; i++) {
10490
const expectedPackage = expectedPackages[i]
10591
const id = expectedPackage._id || '__unnamed' + i
10692

10793
bases.push({
108-
...clone<ExpectedPackage.Any>(expectedPackage),
109-
_id: getExpectedPackageId(ownerId, id),
110-
blueprintPackageId: id,
94+
_id: getExpectedPackageIdFromIngestSource(bucketId, source, id),
95+
package: {
96+
...clone<ExpectedPackage.Any>(expectedPackage),
97+
_id: id,
98+
},
11199
contentVersionHash: getContentVersionHash(expectedPackage),
112100
studioId: studio._id,
113-
created: Date.now(),
101+
rundownId: null,
102+
bucketId: bucketId,
103+
created: Date.now(), // This will be preserved during the `saveIntoDb`
104+
ingestSources: [source],
114105
})
115106
}
107+
116108
return bases
117109
}
118110

119111
export async function updateExpectedPackagesForBucketAdLibPiece(
120112
context: JobContext,
121113
adlib: BucketAdLib
122114
): Promise<void> {
123-
const packages = generateExpectedPackagesForBucketAdlib(context.studio, [adlib])
115+
const packages = generateExpectedPackagesForBucketAdlib(context.studio, adlib)
124116

125-
await saveIntoDb(context, context.directCollections.ExpectedPackages, { pieceId: adlib._id }, packages)
117+
await saveIntoDb(
118+
context,
119+
context.directCollections.ExpectedPackages,
120+
{
121+
studioId: context.studioId,
122+
bucketId: adlib.bucketId,
123+
// Note: This assumes that there is only one ingest source for each piece
124+
ingestSources: {
125+
$elemMatch: {
126+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB,
127+
pieceId: adlib._id,
128+
},
129+
},
130+
},
131+
packages,
132+
{
133+
beforeDiff: (obj, oldObj) => {
134+
return {
135+
...obj,
136+
// Preserve old created timestamp
137+
created: oldObj.created,
138+
}
139+
},
140+
}
141+
)
126142
}
127143

128144
export async function updateExpectedPackagesForBucketAdLibAction(
129145
context: JobContext,
130146
action: BucketAdLibAction
131147
): Promise<void> {
132-
const packages = generateExpectedPackagesForBucketAdlibAction(context.studio, [action])
148+
const packages = generateExpectedPackagesForBucketAdlibAction(context.studio, action)
133149

134-
await saveIntoDb(context, context.directCollections.ExpectedPackages, { pieceId: action._id }, packages)
150+
await saveIntoDb(
151+
context,
152+
context.directCollections.ExpectedPackages,
153+
{
154+
studioId: context.studioId,
155+
bucketId: action.bucketId,
156+
// Note: This assumes that there is only one ingest source for each piece
157+
ingestSources: {
158+
$elemMatch: {
159+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION,
160+
pieceId: action._id,
161+
},
162+
},
163+
},
164+
packages,
165+
{
166+
beforeDiff: (obj, oldObj) => {
167+
return {
168+
...obj,
169+
// Preserve old created timestamp
170+
created: oldObj.created,
171+
}
172+
},
173+
}
174+
)
135175
}
176+
136177
export async function cleanUpExpectedPackagesForBucketAdLibs(context: JobContext, adLibIds: PieceId[]): Promise<void> {
137178
if (adLibIds.length > 0) {
138179
await context.directCollections.ExpectedPackages.remove({
139-
pieceId: {
140-
$in: adLibIds,
180+
studioId: context.studioId,
181+
// Note: This assumes that there is only one ingest source for each piece
182+
ingestSources: {
183+
$elemMatch: {
184+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB,
185+
pieceId: { $in: adLibIds },
186+
},
141187
},
142188
})
143189
}
@@ -148,8 +194,13 @@ export async function cleanUpExpectedPackagesForBucketAdLibsActions(
148194
): Promise<void> {
149195
if (adLibIds.length > 0) {
150196
await context.directCollections.ExpectedPackages.remove({
151-
pieceId: {
152-
$in: adLibIds,
197+
studioId: context.studioId,
198+
// Note: This assumes that there is only one ingest source for each piece
199+
ingestSources: {
200+
$elemMatch: {
201+
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB,
202+
pieceId: { $in: adLibIds },
203+
},
153204
},
154205
})
155206
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import {
22
ExpectedPackageDBType,
3-
ExpectedPackageIngestSourcePart,
43
ExpectedPackageIngestSourceRundownBaseline,
54
getContentVersionHash,
6-
getExpectedPackageIdTmp,
5+
getExpectedPackageIdFromIngestSource,
76
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
87
import { BlueprintId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
98
import { RundownNote } from '@sofie-automation/corelib/dist/dataModel/Notes'
@@ -354,7 +353,7 @@ function generateExpectedPackagesForBaseline(
354353
source: ExpectedPackageIngestSourceRundownBaseline
355354
): IngestExpectedPackage<ExpectedPackageIngestSourceRundownBaseline> => {
356355
return {
357-
_id: getExpectedPackageIdTmp(rundownId, source, expectedPackage._id),
356+
_id: getExpectedPackageIdFromIngestSource(rundownId, source, expectedPackage._id),
358357

359358
contentVersionHash: getContentVersionHash(expectedPackage),
360359

0 commit comments

Comments
 (0)