@@ -32,6 +32,22 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund
3232import { RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown'
3333import { SofieIngestDataCacheObj } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache'
3434
35+ class IdMapWithGenerator < V extends ProtectedString < any > > extends Map < V , V > {
36+ getOrGenerate ( key : V ) : V {
37+ return this . getOrGenerateAndWarn ( key , '' )
38+ }
39+
40+ getOrGenerateAndWarn ( key : V , name : string ) : V {
41+ const existing = this . get ( key )
42+ if ( existing ) return existing
43+
44+ const newValue = getRandomId < V > ( )
45+ this . set ( key , newValue )
46+ if ( name ) logger . warn ( `Couldn't find "${ name } " when restoring snapshot` )
47+ return newValue
48+ }
49+ }
50+
3551/**
3652 * Generate the Playlist owned portions of a Playlist snapshot
3753 */
@@ -244,7 +260,7 @@ export async function handleRestorePlaylistSnapshot(
244260 rd . _id = getRandomId ( )
245261 rundownIdMap . set ( oldId , rd . _id )
246262 }
247- const partIdMap = new Map < PartId , PartId > ( )
263+ const partIdMap = new IdMapWithGenerator < PartId > ( )
248264 for ( const part of snapshot . parts ) {
249265 const oldId = part . _id
250266 part . _id = part . externalId ? getPartId ( getNewRundownId ( part . rundownId ) , part . externalId ) : getRandomId ( )
@@ -253,35 +269,37 @@ export async function handleRestorePlaylistSnapshot(
253269 }
254270
255271 const partInstanceOldRundownIdMap = new Map < PartInstanceId , RundownId > ( )
256- const partInstanceIdMap = new Map < PartInstanceId , PartInstanceId > ( )
272+ const partInstanceIdMap = new IdMapWithGenerator < PartInstanceId > ( )
257273 for ( const partInstance of snapshot . partInstances ) {
258274 const oldId = partInstance . _id
259275 partInstance . _id = getRandomId ( )
260276 partInstanceIdMap . set ( oldId , partInstance . _id )
261277
262- partInstance . part . _id = partIdMap . get ( partInstance . part . _id ) || getRandomId ( )
278+ partInstance . part . _id = partIdMap . getOrGenerate ( partInstance . part . _id )
263279 partInstanceOldRundownIdMap . set ( oldId , partInstance . rundownId )
264280 }
265- const segmentIdMap = new Map < SegmentId , SegmentId > ( )
281+ const segmentIdMap = new IdMapWithGenerator < SegmentId > ( )
266282 for ( const segment of snapshot . segments ) {
267283 const oldId = segment . _id
268284 segment . _id = getSegmentId ( getNewRundownId ( segment . rundownId ) , segment . externalId )
269285 segmentIdMap . set ( oldId , segment . _id )
270286 }
271287 type AnyPieceId = PieceId | AdLibActionId | RundownBaselineAdLibActionId
272- const pieceIdMap = new Map < AnyPieceId , AnyPieceId > ( )
288+ const pieceIdMap = new IdMapWithGenerator < AnyPieceId > ( )
273289 for ( const piece of snapshot . pieces ) {
274290 const oldId = piece . _id
275291 piece . startRundownId = getNewRundownId ( piece . startRundownId )
276292 if ( piece . startPartId ) {
277- piece . startPartId =
278- partIdMap . get ( piece . startPartId ) ||
279- getRandomIdAndWarn ( `piece.startPartId=${ piece . startPartId } of piece=${ piece . _id } ` )
293+ piece . startPartId = partIdMap . getOrGenerateAndWarn (
294+ piece . startPartId ,
295+ `piece.startPartId=${ piece . startPartId } of piece=${ piece . _id } `
296+ )
280297 }
281298 if ( piece . startSegmentId ) {
282- piece . startSegmentId =
283- segmentIdMap . get ( piece . startSegmentId ) ||
284- getRandomIdAndWarn ( `piece.startSegmentId=${ piece . startSegmentId } of piece=${ piece . _id } ` )
299+ piece . startSegmentId = segmentIdMap . getOrGenerateAndWarn (
300+ piece . startSegmentId ,
301+ `piece.startSegmentId=${ piece . startSegmentId } of piece=${ piece . _id } `
302+ )
285303 }
286304 piece . _id = getRandomId ( )
287305 pieceIdMap . set ( oldId , piece . _id )
@@ -301,10 +319,11 @@ export async function handleRestorePlaylistSnapshot(
301319 for ( const pieceInstance of snapshot . pieceInstances ) {
302320 pieceInstance . _id = getRandomId ( )
303321
304- pieceInstance . piece . _id = ( pieceIdMap . get ( pieceInstance . piece . _id ) || getRandomId ( ) ) as PieceId // Note: don't warn if not found, as the piece may have been deleted
322+ pieceInstance . piece . _id = pieceIdMap . getOrGenerate ( pieceInstance . piece . _id ) as PieceId // Note: don't warn if not found, as the piece may have been deleted
305323 if ( pieceInstance . infinite ) {
306- pieceInstance . infinite . infinitePieceId =
307- ( pieceIdMap . get ( pieceInstance . infinite . infinitePieceId ) as PieceId ) || getRandomId ( ) // Note: don't warn if not found, as the piece may have been deleted
324+ pieceInstance . infinite . infinitePieceId = pieceIdMap . getOrGenerate (
325+ pieceInstance . infinite . infinitePieceId
326+ ) as PieceId // Note: don't warn if not found, as the piece may have been deleted
308327 }
309328 }
310329
@@ -335,9 +354,10 @@ export async function handleRestorePlaylistSnapshot(
335354 case ExpectedPackageDBType . BASELINE_ADLIB_PIECE :
336355 case ExpectedPackageDBType . BASELINE_ADLIB_ACTION :
337356 case ExpectedPackageDBType . BASELINE_PIECE : {
338- expectedPackage . pieceId =
339- pieceIdMap . get ( expectedPackage . pieceId ) ||
340- getRandomIdAndWarn ( `expectedPackage.pieceId=${ expectedPackage . pieceId } ` )
357+ expectedPackage . pieceId = pieceIdMap . getOrGenerateAndWarn (
358+ expectedPackage . pieceId ,
359+ `expectedPackage.pieceId=${ expectedPackage . pieceId } `
360+ )
341361
342362 expectedPackage . _id = getExpectedPackageId ( expectedPackage . pieceId , expectedPackage . blueprintPackageId )
343363
@@ -388,13 +408,13 @@ export async function handleRestorePlaylistSnapshot(
388408 }
389409
390410 if ( obj . partId ) {
391- obj . partId = partIdMap . get ( obj . partId ) || getRandomId ( )
411+ obj . partId = partIdMap . getOrGenerate ( obj . partId )
392412 }
393413 if ( obj . segmentId ) {
394- obj . segmentId = segmentIdMap . get ( obj . segmentId ) || getRandomId ( )
414+ obj . segmentId = segmentIdMap . getOrGenerate ( obj . segmentId )
395415 }
396416 if ( obj . partInstanceId ) {
397- obj . partInstanceId = partInstanceIdMap . get ( obj . partInstanceId ) || getRandomId ( )
417+ obj . partInstanceId = partInstanceIdMap . getOrGenerate ( obj . partInstanceId )
398418 }
399419
400420 if ( updateOwnId ) {
@@ -521,11 +541,6 @@ export async function handleRestorePlaylistSnapshot(
521541 }
522542}
523543
524- function getRandomIdAndWarn < T extends ProtectedString < any > > ( name : string ) : T {
525- logger . warn ( `Couldn't find "${ name } " when restoring snapshot` )
526- return getRandomId < T > ( )
527- }
528-
529544function fixupImportedSelectedPartInstanceIds (
530545 snapshot : CoreRundownPlaylistSnapshot ,
531546 rundownIdMap : Map < RundownId , RundownId > ,
0 commit comments