Skip to content

Commit 650b264

Browse files
committed
fix: strip support for multiple studios from test tools
1 parent 0c60e8a commit 650b264

9 files changed

Lines changed: 46 additions & 154 deletions

File tree

meteor/server/publications/studio.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
import { triggerWriteAccessBecauseNoCheckNecessary } from '../security/securityVerify'
3636
import { checkAccessAndGetPeripheralDevice } from '../security/check'
3737
import { assertConnectionHasOneOfPermissions } from '../security/auth'
38+
import { fetchStudioIds } from '../optimizations'
3839

3940
meteorPublish(CorelibPubSub.studios, async function (studioIds: StudioId[] | null, _token: string | undefined) {
4041
check(studioIds, Match.Maybe(Array))
@@ -131,12 +132,14 @@ meteorCustomPublish(
131132
meteorCustomPublish(
132133
MeteorPubSub.mappingsForStudio,
133134
PeripheralDevicePubSubCollectionsNames.studioMappings,
134-
async function (pub, studioId: StudioId, _token: string | undefined) {
135-
check(studioId, String)
136-
135+
async function (pub) {
137136
assertConnectionHasOneOfPermissions(this.connection, 'testing')
138137

139-
await createObserverForMappingsPublication(pub, studioId)
138+
// Find the first studioId. There should only be one, but we don't know what it will be
139+
const studioIds = await fetchStudioIds({})
140+
if (studioIds.length < 1) throw new Error('No studios found')
141+
142+
await createObserverForMappingsPublication(pub, studioIds[0])
140143
}
141144
)
142145

meteor/server/publications/timeline.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Meteor } from 'meteor/meteor'
21
import { getRoutedTimeline } from '@sofie-automation/meteor-lib/dist/collections/Timeline'
32
import {
43
RoutedTimeline,
@@ -19,7 +18,7 @@ import {
1918
TriggerUpdate,
2019
} from '../lib/customPublication'
2120
import { getActiveRoutes } from '@sofie-automation/meteor-lib/dist/collections/Studios'
22-
import { fetchStudioLight } from '../optimizations'
21+
import { fetchStudioIds, fetchStudioLight } from '../optimizations'
2322
import { FastTrackObservers, setupFastTrackObserver } from './fastTrack'
2423
import { logger } from '../logging'
2524
import { getRandomId, literal } from '@sofie-automation/corelib/dist/lib'
@@ -39,15 +38,10 @@ import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settin
3938
import { checkAccessAndGetPeripheralDevice } from '../security/check'
4039
import { assertConnectionHasOneOfPermissions } from '../security/auth'
4140

42-
meteorPublish(CorelibPubSub.timelineDatastore, async function (studioId: StudioId, _token: string | undefined) {
41+
meteorPublish(CorelibPubSub.timelineDatastore, async function () {
4342
assertConnectionHasOneOfPermissions(this.connection, 'testing')
4443

45-
if (!studioId) throw new Meteor.Error(400, 'selector argument missing')
46-
const modifier: FindOptions<DBTimelineDatastoreEntry> = {
47-
fields: {},
48-
}
49-
50-
return TimelineDatastore.findWithCursor({ studioId }, modifier)
44+
return TimelineDatastore.findWithCursor({})
5145
})
5246

5347
meteorCustomPublish(
@@ -85,10 +79,14 @@ meteorPublish(
8579
meteorCustomPublish(
8680
MeteorPubSub.timelineForStudio,
8781
PeripheralDevicePubSubCollectionsNames.studioTimeline,
88-
async function (pub, studioId: StudioId, _token: string | undefined) {
82+
async function (pub) {
8983
assertConnectionHasOneOfPermissions(this.connection, 'testing')
9084

91-
await createObserverForTimelinePublication(pub, studioId)
85+
// Find the first studioId. There should only be one, but we don't know what it will be
86+
const studioIds = await fetchStudioIds({})
87+
if (studioIds.length < 1) throw new Error('No studios found')
88+
89+
await createObserverForTimelinePublication(pub, studioIds[0])
9290
}
9391
)
9492

packages/corelib/src/pubsub.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ export interface CorelibPubSubTypes {
316316
studioIds: StudioId[] | null,
317317
token?: string
318318
) => CollectionName.Studios
319-
[CorelibPubSub.timelineDatastore]: (studioId: StudioId, token?: string) => CollectionName.TimelineDatastore
319+
[CorelibPubSub.timelineDatastore]: () => CollectionName.TimelineDatastore
320320
[CorelibPubSub.buckets]: (studioId: StudioId, bucketId: BucketId | null, token?: string) => CollectionName.Buckets
321321
[CorelibPubSub.bucketAdLibPieces]: (
322322
studioId: StudioId,

packages/meteor-lib/src/api/pubsub.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,8 @@ export interface MeteorPubSubTypes {
177177

178178
// custom publications:
179179

180-
[MeteorPubSub.mappingsForStudio]: (
181-
studioId: StudioId,
182-
token?: string
183-
) => PeripheralDevicePubSubCollectionsNames.studioMappings
184-
[MeteorPubSub.timelineForStudio]: (
185-
studioId: StudioId,
186-
token?: string
187-
) => PeripheralDevicePubSubCollectionsNames.studioTimeline
180+
[MeteorPubSub.mappingsForStudio]: () => PeripheralDevicePubSubCollectionsNames.studioMappings
181+
[MeteorPubSub.timelineForStudio]: () => PeripheralDevicePubSubCollectionsNames.studioTimeline
188182

189183
[MeteorPubSub.ingestDeviceRundownStatusTestTool]: (
190184
peripheralDeviceId: PeripheralDeviceId

packages/webui/src/client/ui/TestTools/Mappings.tsx

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,14 @@ import { omit } from '@sofie-automation/corelib/dist/lib'
44
import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString'
55
import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
66
import { makeTableOfObject } from '../../lib/utilComponents.js'
7-
import { StudioSelect } from './StudioSelect.js'
87
import { MappingExt } from '@sofie-automation/corelib/dist/dataModel/Studio'
98
import { LookaheadMode, TSR } from '@sofie-automation/blueprints-integration'
10-
import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids'
119
import { useTranslation } from 'react-i18next'
1210
import Row from 'react-bootstrap/Row'
1311
import Col from 'react-bootstrap/Col'
1412
import { StudioMappings } from './collections'
1513

16-
interface IMappingsViewProps {
17-
match?: {
18-
params?: {
19-
studioId: StudioId
20-
}
21-
}
22-
}
23-
function MappingsView(props: Readonly<IMappingsViewProps>): JSX.Element {
14+
export function MappingsView(): JSX.Element {
2415
const { t } = useTranslation()
2516

2617
return (
@@ -29,25 +20,16 @@ function MappingsView(props: Readonly<IMappingsViewProps>): JSX.Element {
2920
<h1>{t('Routed Mappings')}</h1>
3021
</header>
3122
<div className="my-5">
32-
{props.match && props.match.params && <ComponentMappingsTable studioId={props.match.params.studioId} />}
23+
<ComponentMappingsTable />
3324
</div>
3425
</div>
3526
)
3627
}
3728

38-
interface ComponentMappingsTableProps {
39-
studioId: StudioId
40-
}
41-
function ComponentMappingsTable({ studioId }: Readonly<ComponentMappingsTableProps>): JSX.Element {
42-
useSubscription(MeteorPubSub.mappingsForStudio, studioId)
29+
function ComponentMappingsTable(): JSX.Element {
30+
useSubscription(MeteorPubSub.mappingsForStudio)
4331

44-
const mappingsObj = useTracker(
45-
() => {
46-
return StudioMappings.findOne(studioId)
47-
},
48-
[studioId],
49-
null
50-
)
32+
const mappingsObj = useTracker(() => StudioMappings.findOne(), [], null)
5133

5234
const mappingsItems = mappingsObj ? _.sortBy(Object.entries<MappingExt>(mappingsObj.mappings), (o) => o[0]) : []
5335

@@ -100,9 +82,3 @@ function ComponentMappingsTableRow({ id, obj }: Readonly<ComponentMappingsTableR
10082
</tr>
10183
)
10284
}
103-
104-
function MappingsStudioSelect(): JSX.Element {
105-
return <StudioSelect path="mappings" title="Mappings" />
106-
}
107-
108-
export { MappingsView, MappingsStudioSelect }

packages/webui/src/client/ui/TestTools/StudioSelect.tsx

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

packages/webui/src/client/ui/TestTools/Timeline.tsx

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { useSubscription, useTracker } from '../../lib/ReactMeteorData/react-met
33
import _ from 'underscore'
44
import { deserializeTimelineBlob, TimelineHash } from '@sofie-automation/corelib/dist/dataModel/Timeline'
55
import { applyToArray, clone, normalizeArray } from '@sofie-automation/corelib/dist/lib'
6-
import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString'
76
import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
87
import {
98
TimelineState,
@@ -16,44 +15,35 @@ import {
1615
} from 'superfly-timeline'
1716
import { TimelineContentObject, transformTimeline } from '@sofie-automation/corelib/dist/playout/timeline'
1817
import { useCurrentTime } from '../../lib/lib.js'
19-
import { StudioSelect } from './StudioSelect.js'
2018
import { useTranslation } from 'react-i18next'
21-
import { useParams } from 'react-router-dom'
2219
import { useCallback, useEffect, useMemo, useState } from 'react'
2320
import Classnames from 'classnames'
24-
import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids.js'
2521
import Row from 'react-bootstrap/Row'
2622
import Col from 'react-bootstrap/Col'
2723
import Button from 'react-bootstrap/Button'
2824
import Form from 'react-bootstrap/Form'
2925
import { StudioTimeline } from './collections'
3026

31-
interface TimelineViewRouteParams {
32-
studioId: string | undefined
33-
}
34-
function TimelineView(): JSX.Element {
27+
export function TimelineView(): JSX.Element {
3528
const { t } = useTranslation()
3629

37-
const { studioId } = useParams<TimelineViewRouteParams>()
38-
3930
return (
4031
<div className="mx-5">
4132
<header className="my-2">
4233
<h1>{t('Timeline')}</h1>
4334
</header>
44-
<div className="my-5">{studioId && <ComponentTimelineSimulate studioId={protectString(studioId)} />}</div>
35+
<div className="my-5">
36+
<ComponentTimelineSimulate />
37+
</div>
4538
</div>
4639
)
4740
}
4841

49-
interface ITimelineSimulateProps {
50-
studioId: StudioId
51-
}
52-
function ComponentTimelineSimulate({ studioId }: Readonly<ITimelineSimulateProps>) {
53-
useSubscription(MeteorPubSub.timelineForStudio, studioId)
42+
function ComponentTimelineSimulate() {
43+
useSubscription(MeteorPubSub.timelineForStudio)
5444

5545
const now = useCurrentTime()
56-
const tlComplete = useTracker(() => StudioTimeline.findOne(studioId), [studioId])
46+
const tlComplete = useTracker(() => StudioTimeline.findOne(), [])
5747

5848
const [resolvedTimeline, errorMsgResolve] = useMemo(() => {
5949
try {
@@ -466,9 +456,3 @@ function TimelineChangesLog({ resolvedTl, timelineHash }: Readonly<TimelineChang
466456
</Row>
467457
)
468458
}
469-
470-
function TimelineStudioSelect(): JSX.Element {
471-
return <StudioSelect path="timeline" title="Timeline" />
472-
}
473-
474-
export { TimelineView, TimelineStudioSelect }
Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,31 @@
11
import { useSubscription, useTracker } from '../../lib/ReactMeteorData/react-meteor-data'
2-
import { StudioSelect } from './StudioSelect'
3-
import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString'
2+
import { unprotectString } from '@sofie-automation/corelib/dist/protectedString'
43
import { useTranslation } from 'react-i18next'
5-
import { useParams } from 'react-router-dom'
6-
import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids'
74
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
85
import Row from 'react-bootstrap/Row'
96
import Col from 'react-bootstrap/Col'
107
import { TimelineDatastore } from './collections'
118

12-
interface TimelineDatastoreViewRouteParams {
13-
studioId: string
14-
}
15-
16-
function TimelineDatastoreView(): JSX.Element {
9+
export function TimelineDatastoreView(): JSX.Element {
1710
const { t } = useTranslation()
18-
const { studioId } = useParams<TimelineDatastoreViewRouteParams>()
1911

2012
return (
2113
<div className="mx-5">
2214
<header className="my-2">
2315
<h1>{t('Timeline Datastore')}</h1>
2416
</header>
25-
<div className="my-5">{studioId && <ComponentDatastoreControls studioId={protectString(studioId)} />}</div>
17+
<div className="my-5">
18+
{' '}
19+
<ComponentDatastoreControls />
20+
</div>
2621
</div>
2722
)
2823
}
2924

30-
interface IDatastoreControlsProps {
31-
studioId: StudioId
32-
}
33-
function ComponentDatastoreControls({ studioId }: Readonly<IDatastoreControlsProps>) {
34-
useSubscription(CorelibPubSub.timelineDatastore, studioId)
25+
function ComponentDatastoreControls() {
26+
useSubscription(CorelibPubSub.timelineDatastore)
3527

36-
const datastore = useTracker(() => TimelineDatastore.find().fetch(), [studioId])
28+
const datastore = useTracker(() => TimelineDatastore.find().fetch(), [])
3729

3830
return (
3931
<Row>
@@ -62,9 +54,3 @@ function ComponentDatastoreControls({ studioId }: Readonly<IDatastoreControlsPro
6254
</Row>
6355
)
6456
}
65-
66-
function TimelineDatastoreStudioSelect(): JSX.Element {
67-
return <StudioSelect path="timelinedatastore" title="Timeline Datastore" />
68-
}
69-
70-
export { TimelineDatastoreView, TimelineDatastoreStudioSelect }

packages/webui/src/client/ui/TestTools/index.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { useTranslation } from 'react-i18next'
22
import { useSubscription } from '../../lib/ReactMeteorData/react-meteor-data.js'
33
import { Route, Switch, NavLink, Redirect } from 'react-router-dom'
4-
import { TimelineView, TimelineStudioSelect } from './Timeline.js'
4+
import { TimelineView } from './Timeline.js'
55
import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub'
6-
import { MappingsStudioSelect, MappingsView } from './Mappings.js'
7-
import { TimelineDatastoreStudioSelect, TimelineDatastoreView } from './TimelineDatastore.js'
6+
import { MappingsView } from './Mappings.js'
7+
import { TimelineDatastoreView } from './TimelineDatastore.js'
88
import { DeviceTriggersDeviceSelect, DeviceTriggersView } from './DeviceTriggers.js'
99
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
1010
import Row from 'react-bootstrap/Row'
@@ -71,12 +71,9 @@ export default function Status(): JSX.Element {
7171
</Col>
7272
<Col xs={12} sm={8} md={9} lg={10}>
7373
<Switch>
74-
<Route path="/testTools/timeline/:studioId" component={TimelineView} />
75-
<Route path="/testTools/timeline" component={TimelineStudioSelect} />
76-
<Route path="/testTools/mappings/:studioId" component={MappingsView} />
77-
<Route path="/testTools/mappings" component={MappingsStudioSelect} />
78-
<Route path="/testTools/timelinedatastore/:studioId" component={TimelineDatastoreView} />
79-
<Route path="/testTools/timelinedatastore" component={TimelineDatastoreStudioSelect} />
74+
<Route path="/testTools/timeline" component={TimelineView} />
75+
<Route path="/testTools/mappings" component={MappingsView} />
76+
<Route path="/testTools/timelinedatastore" component={TimelineDatastoreView} />
8077
<Route path="/testTools/devicetriggers/:peripheralDeviceId" component={DeviceTriggersView} />
8178
<Route path="/testTools/devicetriggers" component={DeviceTriggersDeviceSelect} />
8279
<Route path="/testTools/ingestRundownStatus/:peripheralDeviceId" component={IngestRundownStatusView} />

0 commit comments

Comments
 (0)