Skip to content

Commit 37d2806

Browse files
committed
routes/crate: Get or fetch requested version by num
Previously, we fetched all versions and then found the requested version within them. This commit changes the approach to either retrieve the version from loaded versions or fetch it from the endpoint. This change allows us to migrate to paginated versions in the future.
1 parent 529f8a3 commit 37d2806

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

app/routes/crate/version-dependencies.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
1+
import { NotFoundError } from '@ember-data/adapter/error';
12
import Route from '@ember/routing/route';
23
import { inject as service } from '@ember/service';
34

45
export default class VersionRoute extends Route {
6+
@service store;
57
@service router;
68

79
async model(params, transition) {
810
let crate = this.modelFor('crate');
911

10-
let versions;
12+
// TODO: Resolved version without waiting for versions to be resolved
1113
try {
12-
versions = await crate.loadVersionsTask.perform();
14+
await crate.loadVersionsTask.perform();
1315
} catch (error) {
1416
let title = `${crate.name}: Failed to load version data`;
1517
return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
1618
}
1719

1820
let requestedVersion = params.version_num;
19-
let version = versions.find(version => version.num === requestedVersion);
20-
if (!version) {
21-
let title = `${crate.name}: Version ${requestedVersion} not found`;
22-
return this.router.replaceWith('catch-all', { transition, title });
21+
let version;
22+
try {
23+
version =
24+
crate.loadedVersionsByNum.get(requestedVersion) ??
25+
(await this.store.queryRecord('version', {
26+
name: crate.id,
27+
num: requestedVersion,
28+
}));
29+
} catch (error) {
30+
if (error instanceof NotFoundError) {
31+
let title = `${crate.name}: Version ${requestedVersion} not found`;
32+
return this.router.replaceWith('catch-all', { transition, title });
33+
} else {
34+
let title = `${crate.name}: Failed to load version data`;
35+
return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
36+
}
2337
}
2438

2539
try {

app/routes/crate/version.js

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { NotFoundError } from '@ember-data/adapter/error';
12
import Route from '@ember/routing/route';
23
import { inject as service } from '@ember/service';
34
import { waitForPromise } from '@ember/test-waiters';
@@ -10,10 +11,12 @@ import { AjaxError } from '../../utils/ajax';
1011
export default class VersionRoute extends Route {
1112
@service router;
1213
@service sentry;
14+
@service store;
1315

1416
async model(params, transition) {
1517
let crate = this.modelFor('crate');
1618

19+
// TODO: Resolved version without waiting for versions to be resolved
1720
let versions;
1821
try {
1922
versions = await crate.loadVersionsTask.perform();
@@ -25,14 +28,37 @@ export default class VersionRoute extends Route {
2528
let version;
2629
let requestedVersion = params.version_num;
2730
if (requestedVersion) {
28-
version = versions.find(version => version.num === requestedVersion);
29-
if (!version) {
30-
let title = `${crate.name}: Version ${requestedVersion} not found`;
31-
return this.router.replaceWith('catch-all', { transition, title });
31+
try {
32+
version =
33+
crate.loadedVersionsByNum.get(requestedVersion) ??
34+
(await this.store.queryRecord('version', {
35+
name: crate.id,
36+
num: requestedVersion,
37+
}));
38+
} catch (error) {
39+
if (error instanceof NotFoundError) {
40+
let title = `${crate.name}: Version ${requestedVersion} not found`;
41+
return this.router.replaceWith('catch-all', { transition, title });
42+
} else {
43+
let title = `${crate.name}: Failed to load version data`;
44+
return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
45+
}
3246
}
3347
} else {
3448
let { default_version } = crate;
35-
version = versions.find(version => version.num === default_version);
49+
version =
50+
crate.loadedVersionsByNum.get(default_version) ??
51+
(await this.store
52+
.queryRecord('version', {
53+
name: crate.id,
54+
num: default_version,
55+
})
56+
.catch(error => {
57+
if (!(error instanceof NotFoundError)) {
58+
let title = `${crate.name}: Failed to load version data`;
59+
this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
60+
}
61+
}));
3662

3763
if (!version) {
3864
let versionNums = versions.map(it => it.num);

0 commit comments

Comments
 (0)