Skip to content

Commit b6a7f90

Browse files
authored
Merge pull request Sofie-Automation#1262 from bbc/upstream/routeset-config-defined-in-blueprints
feat: routeset config defined in blueprints
2 parents 985f4f4 + 0bd2d4d commit b6a7f90

File tree

62 files changed

+2037
-1262
lines changed

Some content is hidden

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

62 files changed

+2037
-1262
lines changed

meteor/__mocks__/defaultCollectionObjects.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ export function defaultStudio(_id: StudioId): DBStudio {
112112
fallbackPartDuration: DEFAULT_FALLBACK_PART_DURATION,
113113
},
114114
_rundownVersionHash: '',
115-
routeSets: {},
116-
routeSetExclusivityGroups: {},
115+
routeSetsWithOverrides: wrapDefaultObject({}),
116+
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
117117
packageContainers: {},
118118
previewContainerIds: [],
119119
thumbnailContainerIds: [],

meteor/server/api/deviceTriggers/StudioDeviceTriggerManager.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class StudioDeviceTriggerManager {
5656
return
5757
}
5858

59-
const context = createCurrentContextFromCache(cache)
59+
const context = createCurrentContextFromCache(cache, studioId)
6060
const actionManager = StudioActionManagers.get(studioId)
6161
if (!actionManager)
6262
throw new Meteor.Error(
@@ -271,7 +271,7 @@ function convertDocument(doc: ReadonlyObjectDeep<DBTriggeredActions>): UITrigger
271271
})
272272
}
273273

274-
function createCurrentContextFromCache(cache: ContentCache): ReactivePlaylistActionContext {
274+
function createCurrentContextFromCache(cache: ContentCache, studioId: StudioId): ReactivePlaylistActionContext {
275275
const rundownPlaylist = cache.RundownPlaylists.findOne({
276276
activationId: {
277277
$exists: true,
@@ -301,6 +301,7 @@ function createCurrentContextFromCache(cache: ContentCache): ReactivePlaylistAct
301301
: []
302302

303303
return {
304+
studioId: new DummyReactiveVar(studioId),
304305
currentPartInstanceId: new DummyReactiveVar(currentPartInstance?._id ?? null),
305306
currentPartId: new DummyReactiveVar(currentPartInstance?.part._id ?? null),
306307
nextPartId: new DummyReactiveVar(nextPartInstance?.part._id ?? null),

meteor/server/api/deviceTriggers/triggersContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ function createContextForRundownPlaylistChain(
132132
}
133133

134134
return {
135+
studioId: new DummyReactiveVar(studioId),
135136
rundownPlaylistId: new DummyReactiveVar(playlist?._id),
136137
rundownPlaylist: new DummyReactiveVar(playlist),
137138
currentRundownId: new DummyReactiveVar(currentPartInstance?.rundownId ?? playlist.rundownIdsInOrder[0] ?? null),

meteor/server/api/ingest/mosDevice/actions.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { MOS } from '@sofie-automation/corelib'
21
import { logger } from '../../../logging'
32
import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
43
import { Meteor } from 'meteor/meteor'
@@ -13,7 +12,7 @@ import { generateRundownSource, getPeripheralDeviceFromRundown, runIngestOperati
1312
import { IngestJobs } from '@sofie-automation/corelib/dist/worker/ingest'
1413
import { DEFAULT_MOS_TIMEOUT_TIME } from '@sofie-automation/shared-lib/dist/core/constants'
1514
import { executePeripheralDeviceFunctionWithCustomTimeout } from '../../peripheralDevice/executeFunction'
16-
import { getMosTypes } from '@mos-connection/helper'
15+
import { MOS } from '@sofie-automation/meteor-lib/dist/mos'
1716

1817
export namespace MOSDeviceActions {
1918
export async function reloadRundown(
@@ -73,7 +72,7 @@ export namespace MOSDeviceActions {
7372
if (!mosPayload.Body)
7473
throw new Meteor.Error(500, `Part Cache for "${partCache.externalId}" missing FullStory content!`)
7574

76-
const mosTypes = getMosTypes(false)
75+
const mosTypes = MOS.getMosTypes(false)
7776

7877
const story = mosPayload.Body.find(
7978
(item) =>
Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
/* tslint:disable:no-use-before-declare */
2-
import { Meteor } from 'meteor/meteor'
3-
import * as _ from 'underscore'
4-
import { StudioRouteBehavior } from '@sofie-automation/corelib/dist/dataModel/Studio'
52
import { PackageInfo } from '../../coreSystem'
63
import { StudioContentAccess } from '../../security/studio'
74
import { shouldUpdateStudioBaselineInner } from '@sofie-automation/corelib/dist/studio/baseline'
8-
import { logger } from '../../logging'
9-
import { Blueprints, RundownPlaylists, Studios, Timeline } from '../../collections'
5+
import { Blueprints, RundownPlaylists, Timeline } from '../../collections'
6+
import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio'
7+
import { QueueStudioJob } from '../../worker/worker'
108

119
export namespace ServerPlayoutAPI {
1210
export async function shouldUpdateStudioBaseline(access: StudioContentAccess): Promise<string | false> {
@@ -38,32 +36,12 @@ export namespace ServerPlayoutAPI {
3836
export async function switchRouteSet(
3937
access: StudioContentAccess,
4038
routeSetId: string,
41-
state: boolean
39+
state: boolean | 'toggle'
4240
): Promise<void> {
43-
logger.debug(`switchRouteSet "${access.studioId}" "${routeSetId}"=${state}`)
44-
45-
const studio = access.studio
46-
47-
if (studio.routeSets[routeSetId] === undefined)
48-
throw new Meteor.Error(404, `RouteSet "${routeSetId}" not found!`)
49-
const routeSet = studio.routeSets[routeSetId]
50-
if (routeSet.behavior === StudioRouteBehavior.ACTIVATE_ONLY && state === false)
51-
throw new Meteor.Error(400, `RouteSet "${routeSetId}" is ACTIVATE_ONLY`)
52-
53-
const modification: Record<string, any> = {}
54-
modification[`routeSets.${routeSetId}.active`] = state
55-
56-
if (studio.routeSets[routeSetId].exclusivityGroup && state === true) {
57-
_.each(studio.routeSets, (otherRouteSet, otherRouteSetId) => {
58-
if (otherRouteSetId === routeSetId) return
59-
if (otherRouteSet.exclusivityGroup === routeSet.exclusivityGroup) {
60-
modification[`routeSets.${otherRouteSetId}.active`] = false
61-
}
62-
})
63-
}
64-
65-
await Studios.updateAsync(studio._id, {
66-
$set: modification,
41+
const queuedJob = await QueueStudioJob(StudioJobs.SwitchRouteSet, access.studioId, {
42+
routeSetId,
43+
state,
6744
})
45+
await queuedJob.complete
6846
}
6947
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,9 @@ export async function studioFrom(apiStudio: APIStudio, existingId?: StudioId): P
276276
supportedShowStyleBase: apiStudio.supportedShowStyleBase?.map((id) => protectString<ShowStyleBaseId>(id)) ?? [],
277277
organizationId: null,
278278
mappingsWithOverrides: wrapDefaultObject({}),
279-
routeSets: {},
279+
routeSetsWithOverrides: wrapDefaultObject({}),
280280
_rundownVersionHash: '',
281-
routeSetExclusivityGroups: {},
281+
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
282282
packageContainers: {},
283283
previewContainerIds: [],
284284
thumbnailContainerIds: [],

meteor/server/api/studio/api.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ export async function insertStudioInner(organizationId: OrganizationId | null, n
5050
minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN,
5151
},
5252
_rundownVersionHash: '',
53-
routeSets: {},
54-
routeSetExclusivityGroups: {},
53+
routeSetsWithOverrides: wrapDefaultObject({}),
54+
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
5555
packageContainers: {},
5656
thumbnailContainerIds: [],
5757
previewContainerIds: [],
@@ -141,7 +141,7 @@ Studios.observeChanges(
141141
{
142142
fields: {
143143
mappingsWithOverrides: 1,
144-
routeSets: 1,
144+
routeSetsWithOverrides: 1,
145145
},
146146
}
147147
)

meteor/server/api/userActions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ class ServerUserActionAPI
11141114
eventTime: Time,
11151115
studioId: StudioId,
11161116
routeSetId: string,
1117-
state: boolean
1117+
state: boolean | 'toggle'
11181118
): Promise<ClientAPI.ClientResponse<void>> {
11191119
return ServerClientAPI.runUserActionInLog(
11201120
this,
@@ -1125,7 +1125,7 @@ class ServerUserActionAPI
11251125
async () => {
11261126
check(studioId, String)
11271127
check(routeSetId, String)
1128-
check(state, Boolean)
1128+
check(state, Match.OneOf('toggle', Boolean))
11291129

11301130
const access = await StudioContentWriteAccess.routeSet(this, studioId)
11311131
return ServerPlayoutAPI.switchRouteSet(access, routeSetId, state)

meteor/server/migration/0_1_0.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,8 @@ export const addSteps = addMigrationSteps('0.1.0', [
445445
mappingsWithOverrides: wrapDefaultObject({}),
446446
blueprintConfigWithOverrides: wrapDefaultObject({}),
447447
_rundownVersionHash: '',
448-
routeSets: {},
449-
routeSetExclusivityGroups: {},
448+
routeSetsWithOverrides: wrapDefaultObject({}),
449+
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
450450
packageContainers: {},
451451
thumbnailContainerIds: [],
452452
previewContainerIds: [],

meteor/server/migration/1_42_0.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)