Skip to content

Commit 09c9f44

Browse files
perf(FeedVersionNavigator): Use new FeedSummaries endpoint.
1 parent b5d4237 commit 09c9f44

File tree

9 files changed

+74
-39
lines changed

9 files changed

+74
-39
lines changed

lib/manager/actions/versions.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export function fetchFeedVersions (feedSource: Feed, unsecured: ?boolean = false
129129
return function (dispatch: dispatchFn, getState: getStateFn) {
130130
dispatch(requestingFeedVersions())
131131
const apiRoot = unsecured ? 'public' : 'secure'
132-
const url = `/api/manager/${apiRoot}/feedversion?feedSourceId=${feedSource.id}`
132+
const url = `/api/manager/${apiRoot}/feedversionsummaries?feedSourceId=${feedSource.id}`
133133
return dispatch(secureFetch(url))
134134
.then(response => response.json())
135135
.then(versions => {
@@ -583,11 +583,26 @@ export function setVersionIndex (
583583
isPublic?: boolean
584584
) {
585585
return function (dispatch: dispatchFn, getState: getStateFn) {
586-
if (feed.feedVersions) {
587-
dispatch(setActiveVersion(feed.feedVersions[index - 1]))
588-
589-
if (push) {
590-
browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${index}`)
586+
console.log('trying to set active version', index)
587+
if (feed.feedVersionSummaries) {
588+
const newActiveVersion = feed.feedVersions && feed.feedVersions[index - 1]
589+
if (!newActiveVersion) {
590+
// If the requested version has not been fetched yet, async fetch it.
591+
const versionId = feed.feedVersionSummaries[index - 1].id
592+
dispatch(fetchFeedVersion(versionId))
593+
.then((version) => {
594+
// TODO: Refactor
595+
dispatch(setActiveVersion(version))
596+
if (push) {
597+
browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${index}`)
598+
}
599+
})
600+
} else {
601+
// TODO: Refactor
602+
dispatch(setActiveVersion(newActiveVersion))
603+
if (push) {
604+
browserHistory.push(`${isPublic ? '/public' : ''}/feed/${feed.id}/version/${index}`)
605+
}
591606
}
592607
} else {
593608
console.warn('No feed versions for feed were found.', feed)

lib/manager/components/version/FeedVersionNavigator.js

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ import * as snapshotActions from '../../../editor/actions/snapshots'
1717
import * as gtfsPlusActions from '../../../gtfsplus/actions/gtfsplus'
1818
import * as deploymentActions from '../../../manager/actions/deployments'
1919
import DeploymentPreviewButton from '../deployment/DeploymentPreviewButton'
20+
import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator'
21+
import type {FeedVersion, FeedVersionSummary, GtfsPlusValidation, Note} from '../../../types'
22+
import type {GtfsState, ManagerUserState} from '../../../types/reducers'
23+
2024
import FeedVersionViewer from './FeedVersionViewer'
2125
import VersionComparisonDropdown from './VersionComparisonDropdown'
2226
import VersionSelectorDropdown from './VersionSelectorDropdown'
2327

24-
import type {Props as ContainerProps} from '../../containers/ActiveFeedVersionNavigator'
25-
import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types'
26-
import type {GtfsState, ManagerUserState} from '../../../types/reducers'
27-
2828
type Props = ContainerProps & {
2929
comparedVersion?: FeedVersion,
3030
createDeploymentFromFeedSource: typeof deploymentActions.createDeploymentFromFeedSource,
@@ -51,7 +51,8 @@ type Props = ContainerProps & {
5151
user: ManagerUserState,
5252
version: FeedVersion,
5353
versionIndexDoesNotExist: boolean,
54-
versionSection: ?string
54+
versionSection: ?string,
55+
versionSummaries: Array<FeedVersionSummary>,
5556
}
5657

5758
type State = {
@@ -162,7 +163,8 @@ export default class FeedVersionNavigator extends Component<Props, State> {
162163
sortedVersions,
163164
user,
164165
version,
165-
versionSection
166+
versionSection,
167+
versionSummaries
166168
} = this.props
167169
// Grab the feed-source-specific deployment that is both actively deployed
168170
// and contains the selected version's GTFS.
@@ -173,7 +175,7 @@ export default class FeedVersionNavigator extends Component<Props, State> {
173175
d.deployedTo &&
174176
d.feedVersions.findIndex(v => v.id === version.id) !== -1
175177
)
176-
const dropdownTitle = `${this.messages('version')} ${feedVersionIndex} ${this.messages('of')} ${sortedVersions.length}`
178+
const dropdownTitle = `${this.messages('version')} ${feedVersionIndex} ${this.messages('of')} ${versionSummaries.length}`
177179

178180
return (
179181
<div>
@@ -206,14 +208,14 @@ export default class FeedVersionNavigator extends Component<Props, State> {
206208
{/* Previous Version Button */}
207209
<Button
208210
data-test-id='decrement-feed-version-button'
209-
disabled={!hasVersions || !sortedVersions[feedVersionIndex - 2]}
211+
disabled={!hasVersions || !versionSummaries[feedVersionIndex - 2]}
210212
href='#'
211213
onClick={this._decrementVersion}>
212214
<Glyphicon glyph='arrow-left' />
213215
</Button>
214216

215217
{/* Version Selector Dropdown */}
216-
{sortedVersions.length > 0 &&
218+
{versionSummaries.length > 0 &&
217219
<VersionSelectorDropdown
218220
dropdownProps={{
219221
id: 'versionSelector',
@@ -222,12 +224,12 @@ export default class FeedVersionNavigator extends Component<Props, State> {
222224
header='Select a version to view summary'
223225
title={dropdownTitle}
224226
version={version}
225-
versions={sortedVersions}
227+
versions={versionSummaries}
226228
/>
227229
}
228230
{/* Next Version Button */}
229231
<Button href='#'
230-
disabled={!hasVersions || !sortedVersions[feedVersionIndex]}
232+
disabled={!hasVersions || !versionSummaries[feedVersionIndex]}
231233
onClick={this._incrementVersion}>
232234
<Glyphicon glyph='arrow-right' />
233235
</Button>
@@ -344,7 +346,8 @@ export default class FeedVersionNavigator extends Component<Props, State> {
344346
user={user}
345347
version={this.props.version}
346348
versionSection={versionSection || null}
347-
versions={sortedVersions} />
349+
versions={sortedVersions}
350+
/>
348351
</Col>
349352
</Row>
350353
</div>

lib/manager/components/version/VersionRetrievalBadge.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import Icon from '@conveyal/woonerf/components/icon'
44
import React from 'react'
55

66
import toSentenceCase from '../../../common/util/to-sentence-case'
7-
import type { FeedVersion, RetrievalMethod } from '../../../types'
7+
import type { FeedVersionSummary, RetrievalMethod } from '../../../types'
88

99
type Props = {
1010
retrievalMethod?: RetrievalMethod,
11-
version?: FeedVersion
11+
version?: FeedVersionSummary
1212
}
1313

1414
const iconForRetrievalMethod = (retrievalMethod: RetrievalMethod | 'UNKNOWN') => {

lib/manager/components/version/VersionSelectorDropdown.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ import * as React from 'react'
55
import { Dropdown } from 'react-bootstrap'
66

77
import MenuItem from '../../../common/components/MenuItem'
8-
import VersionRetrievalBadge from './VersionRetrievalBadge'
8+
import type { FeedVersion, FeedVersionSummary } from '../../../types'
99

10-
import type { FeedVersion } from '../../../types'
10+
import VersionRetrievalBadge from './VersionRetrievalBadge'
1111

1212
type Props = {
1313
dropdownProps: any,
1414
extraOptions?: ?Array<{onClick: () => void, text: string}>,
1515
header?: string,
16-
itemFormatter: (FeedVersion, ?FeedVersion) => React.Node,
16+
itemFormatter: (FeedVersionSummary, ?FeedVersionSummary) => React.Node,
1717
title: React.Node,
1818
// Indicates which version is active in the feed version navigator.
19-
version?: FeedVersion,
20-
versions: ?Array<FeedVersion>
19+
version?: FeedVersionSummary,
20+
versions: ?Array<FeedVersionSummary>
2121
}
2222

23-
export const DefaultItemFormatter = (version: FeedVersion, activeVersion: ?FeedVersion) => (
23+
export const DefaultItemFormatter = (version: FeedVersionSummary, activeVersion: ?FeedVersion) => (
2424
<MenuItem
2525
eventKey={version.version}
2626
key={version.id}

lib/manager/containers/ActiveFeedVersionNavigator.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {createDeploymentFromFeedSource} from '../../manager/actions/deployments'
2323
import {loadFeedVersionForEditing} from '../../editor/actions/snapshots'
2424
import {downloadGtfsPlusFeed} from '../../gtfsplus/actions/gtfsplus'
2525
import {versionsLastUpdatedComparator} from '../util/version'
26-
2726
import type {Feed, Project} from '../../types'
2827
import type {AppState, RouteParams} from '../../types/reducers'
2928

@@ -41,27 +40,30 @@ export type Props = {
4140
const mapStateToProps = (state: AppState, ownProps: Props) => {
4241
let feedVersionIndex
4342
const {routeParams, feedSource} = ownProps
44-
const {feedVersions} = feedSource
43+
const {feedVersions, feedVersionSummaries} = feedSource
4544
const {feedVersionIndex: fvi, subpage} = routeParams
4645
const routeVersionIndex = parseInt(fvi, 10)
4746
const hasVersionIndex = typeof fvi !== 'undefined'
4847
let versionIndexDoesNotExist = false
49-
if (feedSource && typeof feedVersions !== 'undefined') {
48+
if (feedSource && typeof feedVersionSummaries !== 'undefined') {
5049
if ((hasVersionIndex && isNaN(routeVersionIndex)) ||
51-
routeVersionIndex > feedVersions.length ||
50+
routeVersionIndex > feedVersionSummaries.length ||
5251
routeVersionIndex < 0) {
5352
versionIndexDoesNotExist = true
5453
} else {
5554
feedVersionIndex = hasVersionIndex
5655
? routeVersionIndex
57-
: feedVersions.length
56+
: feedVersionSummaries.length
5857
}
5958
}
6059
const {gtfs} = state
61-
const hasVersions = feedVersions && feedVersions.length > 0
60+
const hasVersions = feedVersionSummaries && feedVersionSummaries.length > 0
6261
const sortedVersions = (hasVersions && feedVersions)
6362
? feedVersions.sort(versionsLastUpdatedComparator)
6463
: []
64+
const sortedSummaries = (hasVersions && feedVersionSummaries)
65+
? feedVersionSummaries.sort(versionsLastUpdatedComparator)
66+
: []
6567

6668
let comparedVersion, version
6769

@@ -88,7 +90,8 @@ const mapStateToProps = (state: AppState, ownProps: Props) => {
8890
version,
8991
comparedVersion,
9092
versionIndexDoesNotExist,
91-
versionSection: subpage
93+
versionSection: subpage,
94+
versionSummaries: sortedSummaries
9295
}
9396
}
9497

lib/manager/reducers/projects.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ const projects = (state: ProjectsState = defaultState, action: Action): Projects
224224
}
225225
return update(state, {
226226
all: {[projectIndex]: {feedSources: {[sourceIndex]: {$merge: {
227-
feedVersions: versions.sort(versionSort)
227+
feedVersions: [], // versions.sort(versionSort), // TODO remove
228+
feedVersionSummaries: versions.sort(versionSort)
228229
}}}}}
229230
})
230231
}
@@ -242,7 +243,8 @@ const projects = (state: ProjectsState = defaultState, action: Action): Projects
242243
return update(state, {
243244
all: {[projectIndex]: {feedSources: {[sourceIndex]: {
244245
feedVersions: updatedVersions
245-
}}}}
246+
}}}},
247+
isFetching: { $set: false }
246248
})
247249
}
248250
case 'PUBLISHED_FEEDVERSION': {

lib/manager/util/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,10 @@ export function getIndexesFromFeed ({
382382
return { projectIndex, sourceIndex, versionIndex: -2, errorIndex: -2 }
383383
}
384384
const feedSource = project.feedSources[sourceIndex]
385-
if (!feedSource.feedVersions) {
385+
if (!feedSource.feedVersionSummaries) {
386386
return { projectIndex, sourceIndex, versionIndex: -2, errorIndex: -2 }
387387
}
388-
const versionIndex = feedSource.feedVersions.findIndex(v => v.id === feedVersionId)
388+
const versionIndex = feedSource.feedVersionSummaries.findIndex(v => v.id === feedVersionId)
389389
if (!errorType || !feedSource.feedVersions || versionIndex < 0) {
390390
return { projectIndex, sourceIndex, versionIndex, errorIndex: -2 }
391391
}

lib/manager/util/version.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import moment from 'moment'
44
import numeral from 'numeral'
55

66
import { isExtensionEnabled } from '../../common/util/config'
7-
87
import type {
98
Deployment,
109
Feed,
1110
FeedVersion,
11+
FeedVersionSummary,
1212
Project,
1313
SummarizedFeedVersion,
1414
ValidationResult,
@@ -182,7 +182,7 @@ export function getVersionValidationSummaryByFilterStrategy (
182182
}
183183
}
184184

185-
export const versionsLastUpdatedComparator = (a: FeedVersion, b: FeedVersion) => {
185+
export const versionsLastUpdatedComparator = (a: FeedVersionSummary, b: FeedVersionSummary) => {
186186
return a.updated - b.updated
187187
}
188188

lib/types/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ export type Feed = {
385385
editorNamespace: ?string,
386386
editorSnapshots?: Array<Snapshot>,
387387
externalProperties?: any, // TODO: add more exact type
388+
feedVersionSummaries?: Array<FeedVersionSummary>,
388389
feedVersions?: Array<FeedVersion>,
389390
fetchFrequency?: FetchFrequency,
390391
fetchInterval?: number,
@@ -501,6 +502,17 @@ export type FeedTransformResult = {
501502
tableTransformResults: Array<TableTransformResult>
502503
}
503504

505+
// TODO: Refactor
506+
export type FeedVersionSummary = {|
507+
dateCreated: number,
508+
id: string,
509+
lastUpdated: number,
510+
name: string,
511+
namespace: string,
512+
retrievalMethod: ?RetrievalMethod,
513+
version: number
514+
|}
515+
504516
export type FeedVersion = {|
505517
dateCreated: number,
506518
feedLoadResult: FeedLoadResult,

0 commit comments

Comments
 (0)