Skip to content

Commit 18894f2

Browse files
committed
wip: fix types
1 parent e4a2cee commit 18894f2

File tree

8 files changed

+109
-89
lines changed

8 files changed

+109
-89
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,6 @@ function generateExpectedPackagesForBaseline(
357357

358358
contentVersionHash: getContentVersionHash(expectedPackage),
359359

360-
created: null,
361-
362360
package: expectedPackage,
363361

364362
ingestSources: [source],

packages/job-worker/src/ingest/model/IngestExpectedPackage.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ExpectedPackage, Time } from '@sofie-automation/blueprints-integration'
1+
import type { ExpectedPackage } from '@sofie-automation/blueprints-integration'
22
import type {
33
ExpectedPackageDBNew,
44
ExpectedPackageDBType,
@@ -21,9 +21,6 @@ export interface IngestExpectedPackage<
2121
/** Hash that changes whenever the content or version changes. See getContentVersionHash() */
2222
contentVersionHash: string
2323

24-
/** The time this expectedPackage was created. This can be null when it has not yet been written to mongodb */
25-
created: Time | null
26-
2724
package: ReadonlyDeep<ExpectedPackage.Any>
2825

2926
// HACK: Temporary single item
@@ -36,7 +33,6 @@ export function stripExpectedPackageDBToIngestExpectedPackage(
3633
return {
3734
_id: expectedPackage._id,
3835
contentVersionHash: expectedPackage.contentVersionHash,
39-
created: expectedPackage.created,
4036
package: expectedPackage.package,
4137
ingestSources: expectedPackage.ingestSources as any, // nocommit - avoid this cast?
4238
}

packages/job-worker/src/ingest/model/implementation/DocumentChangeTracker.ts

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ export class DocumentChangeTracker<TDoc extends { _id: ProtectedString<any> }> {
9898
return Array.from(this.#deletedIds.values())
9999
}
100100

101+
getDocumentsToSave(): ReadonlyMap<TDoc['_id'], TDoc> {
102+
return this.#documentsToSave
103+
}
104+
101105
/**
102106
* Generate the mongodb BulkWrite operations for the documents known to this tracker
103107
* @returns mongodb BulkWrite operations
@@ -125,35 +129,4 @@ export class DocumentChangeTracker<TDoc extends { _id: ProtectedString<any> }> {
125129

126130
return ops
127131
}
128-
129-
/**
130-
* Generate the mongodb BulkWrite operations for the documents known to this tracker
131-
* @returns mongodb BulkWrite operations
132-
*/
133-
generateWriteOpsWithTransform<TDoc2 extends { _id: ProtectedString<any> } = TDoc>(
134-
transformDocs: (doc: TDoc[]) => TDoc2[]
135-
): AnyBulkWriteOperation<TDoc2>[] {
136-
const ops: AnyBulkWriteOperation<TDoc2>[] = []
137-
138-
const transformedDocs = transformDocs(Array.from(this.#documentsToSave.values()))
139-
for (const doc of transformedDocs) {
140-
ops.push({
141-
replaceOne: {
142-
filter: { _id: doc._id },
143-
replacement: doc,
144-
upsert: true,
145-
},
146-
})
147-
}
148-
149-
if (this.#deletedIds.size > 0) {
150-
ops.push({
151-
deleteMany: {
152-
filter: { _id: { $in: Array.from(this.#deletedIds) as any } },
153-
},
154-
})
155-
}
156-
157-
return ops
158-
}
159132
}

packages/job-worker/src/ingest/model/implementation/ExpectedPackagesStore.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,6 @@ import {
1818
import type { IngestExpectedPackage } from '../IngestExpectedPackage'
1919
import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
2020

21-
function mutateExpectedPackage<TPackageSource extends { fromPieceType: ExpectedPackageDBType }>(
22-
oldObj: IngestExpectedPackage<TPackageSource>,
23-
newObj: IngestExpectedPackage<TPackageSource>
24-
): IngestExpectedPackage<TPackageSource> {
25-
return {
26-
...newObj,
27-
// Retain the created property
28-
created: oldObj.created,
29-
}
30-
}
31-
3221
export class ExpectedPackagesStore<TPackageSource extends { fromPieceType: ExpectedPackageDBType }> {
3322
#expectedMediaItems: ExpectedMediaItemRundown[]
3423
#expectedPlayoutItems: ExpectedPlayoutItemRundown[]
@@ -148,8 +137,7 @@ export class ExpectedPackagesStore<TPackageSource extends { fromPieceType: Expec
148137
diffAndReturnLatestObjects(
149138
this.#expectedPackagesWithChanges,
150139
oldStore.#expectedPackages,
151-
this.#expectedPackages,
152-
mutateExpectedPackage
140+
this.#expectedPackages
153141
)
154142
}
155143

@@ -183,8 +171,7 @@ export class ExpectedPackagesStore<TPackageSource extends { fromPieceType: Expec
183171
this.#expectedPackages = diffAndReturnLatestObjects(
184172
this.#expectedPackagesWithChanges,
185173
this.#expectedPackages,
186-
expectedPackages,
187-
mutateExpectedPackage
174+
expectedPackages
188175
)
189176
}
190177
}

packages/job-worker/src/ingest/model/implementation/IngestModelImpl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ export class IngestModelImpl implements IngestModel, IngestDatabasePersistedMode
659659
partIds.add(part.part._id)
660660
}
661661

662-
const saveHelper = new SaveIngestModelHelper()
662+
const saveHelper = new SaveIngestModelHelper(this.rundownId)
663663
for (const [segmentId, segment] of this.segmentsImpl.entries()) {
664664
saveHelper.addSegment(segment.segmentModel, segment.deleted)
665665
if (segment.deleted) {

packages/job-worker/src/ingest/model/implementation/IngestSegmentModelImpl.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,6 @@ function generateExpectedPackagesForPart(
280280

281281
contentVersionHash: getContentVersionHash(expectedPackage),
282282

283-
created: null,
284-
285283
package: expectedPackage,
286284

287285
ingestSources: [source],

packages/job-worker/src/ingest/model/implementation/SaveIngestModel.ts

Lines changed: 95 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ import { DocumentChangeTracker } from './DocumentChangeTracker'
1313
import { logger } from '../../../logging'
1414
import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString'
1515
import { IngestExpectedPackage } from '../IngestExpectedPackage'
16+
import { AnyBulkWriteOperation } from 'mongodb'
17+
import { ExpectedPackageId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
18+
import { Complete, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib'
1619

1720
export class SaveIngestModelHelper {
21+
readonly #rundownId: RundownId
22+
1823
#expectedPackages = new DocumentChangeTracker<IngestExpectedPackage<any>>()
1924
#expectedPlayoutItems = new DocumentChangeTracker<ExpectedPlayoutItem>()
2025
#expectedMediaItems = new DocumentChangeTracker<ExpectedMediaItem>()
@@ -25,6 +30,10 @@ export class SaveIngestModelHelper {
2530
#adLibPieces = new DocumentChangeTracker<AdLibPiece>()
2631
#adLibActions = new DocumentChangeTracker<AdLibAction>()
2732

33+
constructor(rundownId: RundownId) {
34+
this.#rundownId = rundownId
35+
}
36+
2837
addExpectedPackagesStore<TPackageSource extends { fromPieceType: ExpectedPackageDBType }>(
2938
store: ExpectedPackagesStore<TPackageSource>,
3039
deleteAll?: boolean
@@ -75,10 +84,10 @@ export class SaveIngestModelHelper {
7584
}
7685

7786
return [
78-
context.directCollections.ExpectedPackages.bulkWrite(
79-
this.#expectedPackages.generateWriteOpsWithTransform((docs) =>
80-
transformIngestExpectedPackageToDb(context, docs)
81-
)
87+
writeExpectedPackagesChangesForRundown(
88+
context,
89+
this.#rundownId,
90+
Array.from(this.#expectedPackages.getDocumentsToSave().values())
8291
),
8392
context.directCollections.ExpectedPlayoutItems.bulkWrite(this.#expectedPlayoutItems.generateWriteOps()),
8493
context.directCollections.ExpectedMediaItems.bulkWrite(this.#expectedMediaItems.generateWriteOps()),
@@ -92,14 +101,87 @@ export class SaveIngestModelHelper {
92101
}
93102
}
94103

95-
async function transformIngestExpectedPackageToDb(
104+
export async function writeExpectedPackagesChangesForRundown(
96105
context: JobContext,
97-
docs: IngestExpectedPackage<any>[]
98-
): Promise<ExpectedPackageDBNew[]> {
99-
return docs.map((doc) => ({
100-
...doc,
101-
studioId: context.studioId,
102-
rundownId: null,
103-
bucketId: null,
104-
}))
106+
rundownId: RundownId | null,
107+
documentsToSave: IngestExpectedPackage<any>[]
108+
): Promise<void> {
109+
const existingDocs = (await context.directCollections.ExpectedPackages.findFetch(
110+
{
111+
studioId: context.studioId,
112+
rundownId: rundownId,
113+
bucketId: null,
114+
},
115+
{
116+
projection: {
117+
_id: 1,
118+
// Future: playoutSources
119+
},
120+
}
121+
)) as Pick<ExpectedPackageDBNew, '_id' | 'created'>[]
122+
const existingDocsMap = normalizeArrayToMap(existingDocs, '_id')
123+
124+
// Generate any insert and update operations
125+
const ops: AnyBulkWriteOperation<ExpectedPackageDBNew>[] = []
126+
for (const doc of documentsToSave) {
127+
const newDbDoc: Complete<Omit<ExpectedPackageDBNew, '_id'>> = {
128+
// Future: omit 'playoutSources from this doc
129+
studioId: context.studioId,
130+
rundownId: rundownId,
131+
bucketId: null,
132+
created: Date.now(),
133+
contentVersionHash: doc.contentVersionHash,
134+
package: doc.package,
135+
ingestSources: doc.ingestSources,
136+
}
137+
138+
const existingDoc = existingDocsMap.get(doc._id)
139+
if (existingDoc) {
140+
// Document already exists, perform an update to preserve other fields
141+
ops.push({
142+
updateOne: {
143+
filter: { _id: doc._id },
144+
update: {
145+
$set: {
146+
// Update every field that we want to define
147+
...newDbDoc,
148+
},
149+
},
150+
},
151+
})
152+
} else {
153+
// Insert this new document
154+
ops.push({
155+
insertOne: {
156+
document: {
157+
...newDbDoc,
158+
_id: doc._id,
159+
},
160+
},
161+
})
162+
}
163+
}
164+
165+
// Look over the existing documents, and see is no longer referenced
166+
const documentsToSaveMap = normalizeArrayToMap(documentsToSave, '_id')
167+
const idsToDelete: ExpectedPackageId[] = []
168+
169+
for (const doc of existingDocs) {
170+
// Skip if this document is in the list of documents to save
171+
if (documentsToSaveMap.has(doc._id)) continue
172+
173+
// Future: check for playoutSources
174+
idsToDelete.push(doc._id)
175+
}
176+
177+
// const idsToDelete = changeTracker.getDeletedIds()
178+
if (idsToDelete.length > 0) {
179+
ops.push({
180+
deleteMany: {
181+
filter: { _id: { $in: idsToDelete as any } },
182+
},
183+
})
184+
}
185+
186+
if (ops.length > 0) await context.directCollections.ExpectedPackages.bulkWrite(ops)
105187
}

packages/job-worker/src/studio/model/StudioBaselineHelper.ts

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
import { JobContext } from '../../jobs'
22
import {
3-
ExpectedPackageDBNew,
43
ExpectedPackageDBType,
54
ExpectedPackageIngestSource,
5+
ExpectedPackageIngestSourceStudioBaseline,
66
getContentVersionHash,
77
getExpectedPackageIdFromIngestSource,
88
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
99
import { ExpectedPlayoutItemStudio } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem'
1010
import { saveIntoDb } from '../../db/changes'
1111
import { ReadonlyDeep } from 'type-fest'
1212
import { ExpectedPackage } from '@sofie-automation/blueprints-integration'
13+
import type { IngestExpectedPackage } from '../../ingest/model/IngestExpectedPackage'
14+
import { writeExpectedPackagesChangesForRundown } from '../../ingest/model/implementation/SaveIngestModel'
1315

1416
export class StudioBaselineHelper {
1517
readonly #context: JobContext
1618

17-
#pendingExpectedPackages: ExpectedPackageDBNew[] | undefined
19+
#pendingExpectedPackages: IngestExpectedPackage<ExpectedPackageIngestSourceStudioBaseline>[] | undefined
1820
#pendingExpectedPlayoutItems: ExpectedPlayoutItemStudio[] | undefined
1921

2022
constructor(context: JobContext) {
@@ -27,16 +29,12 @@ export class StudioBaselineHelper {
2729

2830
setExpectedPackages(packages: ReadonlyDeep<ExpectedPackage.Any>[]): void {
2931
const source: ExpectedPackageIngestSource = { fromPieceType: ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS }
32+
3033
this.#pendingExpectedPackages = packages.map((expectedPackage) => ({
3134
_id: getExpectedPackageIdFromIngestSource(this.#context.studioId, source, expectedPackage._id),
3235

33-
studioId: this.#context.studioId,
34-
rundownId: null,
35-
3636
contentVersionHash: getContentVersionHash(expectedPackage),
3737

38-
created: Date.now(), // nocommit - avoid churn on this?
39-
4038
package: expectedPackage,
4139

4240
ingestSources: [source],
@@ -57,19 +55,7 @@ export class StudioBaselineHelper {
5755
)
5856
: undefined,
5957
this.#pendingExpectedPackages
60-
? saveIntoDb<ExpectedPackageDBNew>(
61-
this.#context,
62-
this.#context.directCollections.ExpectedPackages,
63-
{
64-
studioId: this.#context.studioId,
65-
rundownId: null,
66-
bucketId: null,
67-
},
68-
this.#pendingExpectedPackages,
69-
{
70-
// nocommit - preserve created timestamps
71-
}
72-
)
58+
? writeExpectedPackagesChangesForRundown(this.#context, null, this.#pendingExpectedPackages)
7359
: undefined,
7460
])
7561

0 commit comments

Comments
 (0)