|
| 1 | +import { NotFoundError } from '@ember-data/adapter/error'; |
1 | 2 | import Route from '@ember/routing/route';
|
2 | 3 | import { inject as service } from '@ember/service';
|
3 | 4 | import { waitForPromise } from '@ember/test-waiters';
|
4 | 5 |
|
5 | 6 | import { didCancel } from 'ember-concurrency';
|
6 |
| -import semverSort from 'semver/functions/rsort'; |
7 | 7 |
|
8 | 8 | import { AjaxError } from '../../utils/ajax';
|
9 | 9 |
|
10 | 10 | export default class VersionRoute extends Route {
|
11 | 11 | @service router;
|
12 | 12 | @service sentry;
|
| 13 | + @service store; |
13 | 14 |
|
14 | 15 | async model(params, transition) {
|
15 | 16 | let crate = this.modelFor('crate');
|
16 | 17 |
|
17 |
| - let versions; |
| 18 | + // TODO: Resolved version without waiting for versions to be resolved |
18 | 19 | try {
|
19 |
| - versions = await crate.loadVersionsTask.perform(); |
| 20 | + await crate.loadVersionsTask.perform(); |
20 | 21 | } catch (error) {
|
21 | 22 | let title = `${crate.name}: Failed to load version data`;
|
22 | 23 | return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
|
23 | 24 | }
|
24 | 25 |
|
25 | 26 | let version;
|
26 | 27 | let requestedVersion = params.version_num;
|
27 |
| - 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 }); |
32 |
| - } |
33 |
| - } else { |
34 |
| - let { default_version } = crate; |
35 |
| - version = versions.find(version => version.num === default_version); |
36 |
| - |
37 |
| - if (!version) { |
38 |
| - let versionNums = versions.map(it => it.num); |
39 |
| - semverSort(versionNums, { loose: true }); |
| 28 | + let num = requestedVersion || crate.default_version; |
40 | 29 |
|
41 |
| - version = versions.find(version => version.num === versionNums[0]); |
| 30 | + try { |
| 31 | + version = |
| 32 | + crate.loadedVersionsByNum.get(num) ?? |
| 33 | + (await crate.store.queryRecord('version', { |
| 34 | + name: crate.id, |
| 35 | + num, |
| 36 | + })); |
| 37 | + } catch (error) { |
| 38 | + if (error instanceof NotFoundError) { |
| 39 | + let title = |
| 40 | + requestedVersion == null |
| 41 | + ? `${crate.name}: Failed to find default version` |
| 42 | + : `${crate.name}: Version ${requestedVersion} not found`; |
| 43 | + return this.router.replaceWith('catch-all', { transition, title }); |
| 44 | + } else { |
| 45 | + let title = `${crate.name}: Failed to load version data`; |
| 46 | + return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true }); |
42 | 47 | }
|
43 | 48 | }
|
44 | 49 |
|
|
0 commit comments