Skip to content

Commit 0e54356

Browse files
justandrasjstarpl
andauthored
chore: shared rundown state cache resolution helpers (Sofie-Automation#1695)
--------- Co-authored-by: Jan Starzak <jan.starzak@gmail.com>
1 parent 589d677 commit 0e54356

173 files changed

Lines changed: 1725 additions & 1577 deletions

File tree

Some content is hidden

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

meteor/__mocks__/defaultCollectionObjects.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { Piece, EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/
1010
import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece'
1111
import { getRundownId } from '../server/api/ingest/lib'
1212
import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
13-
import { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
1413
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
1514
import {
1615
PartId,
@@ -31,6 +30,7 @@ import {
3130
DEFAULT_FALLBACK_PART_DURATION,
3231
DEFAULT_MINIMUM_TAKE_SPAN,
3332
} from '@sofie-automation/shared-lib/dist/core/constants'
33+
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
3434

3535
export function defaultRundownPlaylist(_id: RundownPlaylistId, studioId: StudioId): DBRundownPlaylist {
3636
return {

meteor/__mocks__/helpers/database.ts

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint'
3939
import { ICoreSystem, SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem'
4040
import { stripVersion } from '../../server/systemStatus/semverUtils'
4141
import { internalUploadBlueprint } from '../../server/api/blueprints/api'
42-
import { literal, getRandomId, getRandomString, Complete, normalizeArray } from '@sofie-automation/corelib/dist/lib'
42+
import { literal, getRandomId, getRandomString, normalizeArray } from '@sofie-automation/corelib/dist/lib'
4343
import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString'
4444
import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
4545
import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment'
@@ -59,7 +59,6 @@ import {
5959
applyAndValidateOverrides,
6060
wrapDefaultObject,
6161
} from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
62-
import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles'
6362
import {
6463
BlueprintId,
6564
RundownId,
@@ -888,18 +887,3 @@ export async function setupMockWorker(doc?: Partial<WorkerStatus>): Promise<{
888887

889888
return { worker, workerThreadStatuses: [workerThreadStatus0, workerThreadStatus1] }
890889
}
891-
892-
// const studioBlueprint
893-
// const showStyleBlueprint
894-
// const showStyleVariant
895-
896-
export function convertToUIShowStyleBase(showStyleBase: DBShowStyleBase): UIShowStyleBase {
897-
return literal<Complete<UIShowStyleBase>>({
898-
_id: showStyleBase._id,
899-
name: showStyleBase.name,
900-
hotkeyLegend: showStyleBase.hotkeyLegend,
901-
sourceLayers: applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj,
902-
outputLayers: applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj,
903-
abChannelDisplay: showStyleBase.abChannelDisplay,
904-
})
905-
}

meteor/server/__tests__/cronjobs.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import {
2121
import { SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem'
2222
import * as lib from '../lib/lib'
2323
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
24-
import { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
2524
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
2625
import { Meteor } from 'meteor/meteor'
2726
import { EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece'
@@ -76,6 +75,7 @@ import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment'
7675
import { Settings } from '../Settings'
7776
import { SofieIngestCacheType } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache'
7877
import { ObjectOverrideSetOp, ObjectWithOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
78+
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
7979

8080
describe('cronjobs', () => {
8181
let env: DefaultEnvironment

meteor/server/api/rest/v1/ingest.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,19 @@ class IngestServerAPI implements IngestRestAPI {
439439
return ClientAPI.responseSuccess(rundown)
440440
}
441441

442+
/**
443+
* Create a rundown through the REST ingest API.
444+
*
445+
* Note about playlist handling:
446+
*
447+
* Rundowns in Sofie are not owned by playlists. A playlist is merely a container
448+
* that may group multiple rundowns, and a rundown may move between playlists or
449+
* exist without an explicitly defined playlist.
450+
*
451+
* For this reason we intentionally do NOT include the playlistId when checking
452+
* if a rundown already exists. The `externalId` of a rundown is expected to be
453+
* unique within a studio, regardless of which playlist it belongs to.
454+
*/
442455
/**
443456
* Create a rundown through the REST ingest API.
444457
*
@@ -468,6 +481,8 @@ class IngestServerAPI implements IngestRestAPI {
468481
this.validateRundown(rawIngestRundown)
469482
await this.validateAPIPayloadsForRundown(studio.blueprintId, rawIngestRundown)
470483

484+
// IMPORTANT: Do not scope rundown existence checks by playlistId.
485+
// Rundowns are unique per studio, not per playlist.
471486
// IMPORTANT: Do not scope rundown existence checks by playlistId.
472487
// Rundowns are unique per studio, not per playlist.
473488
const existingRundown = await Rundowns.findOneAsync({

meteor/server/collections/rundown.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataM
1010
import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece'
1111
import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj'
1212
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
13-
import { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
1413
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
1514
import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment'
1615
import { createAsyncOnlyReadOnlyMongoCollection } from './collection'
1716
import { registerIndex } from './indices'
17+
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
1818

1919
export const AdLibActions = createAsyncOnlyReadOnlyMongoCollection<AdLibAction>(CollectionName.AdLibActions)
2020
registerIndex(AdLibActions, {

meteor/server/publications/ingestStatus/reactiveContentCache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import type { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
22
import { ReactiveCacheCollection } from '../lib/ReactiveCacheCollection'
33
import { literal } from '@sofie-automation/corelib/dist/lib'
44
import type { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mongo'
5-
import type { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
65
import type { NrcsIngestDataCacheObj } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache'
76
import type { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
87
import type { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
98
import type { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
9+
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
1010

1111
export type PlaylistCompact = Pick<
1212
DBRundownPlaylist,

meteor/server/publications/segmentPartNotesUI/reactiveContentCache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ReactiveCacheCollection } from '../lib/ReactiveCacheCollection'
44
import { literal } from '@sofie-automation/corelib/dist/lib'
55
import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mongo'
66
import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
7-
import { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
7+
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
88

99
export type RundownFields = '_id' | 'playlistId' | 'source'
1010
export const rundownFieldSpecifier = literal<MongoFieldSpecifierOnesStrict<Pick<Rundown, RundownFields>>>({

meteor/server/publications/showStyleUI.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mo
33
import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
44
import { ReadonlyDeep } from 'type-fest'
55
import { CustomCollectionName, MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
6-
import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles'
7-
import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
6+
import { DBShowStyleBase, UIShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
87
import { Complete, literal } from '@sofie-automation/corelib/dist/lib'
98
import {
109
meteorCustomPublish,

meteor/server/publications/studioUI.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mo
33
import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
44
import { ReadonlyDeep } from 'type-fest'
55
import { CustomCollectionName, MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
6-
import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios'
7-
import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio'
6+
import { DBStudio, UIStudio } from '@sofie-automation/corelib/dist/dataModel/Studio'
87
import { Complete, literal } from '@sofie-automation/corelib/dist/lib'
98
import {
109
CustomPublishCollection,

packages/corelib/src/dataModel/Part.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { PartId, RundownId, SegmentId } from './Ids.js'
44
import { PartNote } from './Notes.js'
55
import { ReadonlyDeep } from 'type-fest'
66
import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions.js'
7+
import { PartInstanceLimited } from './PartInstance.js'
8+
import { PieceExtended } from './Piece.js'
79

810
export interface PartInvalidReason {
911
message: ITranslatableMessage
@@ -49,6 +51,16 @@ export interface DBPart extends Omit<IBlueprintPart, 'userEditOperations'> {
4951
userEditProperties?: CoreUserEditingProperties
5052
}
5153

54+
export interface PartExtended {
55+
partId: PartId
56+
instance: PartInstanceLimited
57+
/** Pieces belonging to this part */
58+
pieces: Array<PieceExtended>
59+
renderedDuration: number
60+
startsAt: number
61+
willProbablyAutoNext: boolean
62+
}
63+
5264
export function isPartPlayable(part: Pick<ReadonlyDeep<DBPart>, 'invalid' | 'floated'>): boolean {
5365
return !part.invalid && !part.floated
5466
}

0 commit comments

Comments
 (0)