Skip to content

Commit 6046e6a

Browse files
committed
app: Simplify releaseTrackSet using release_tracks meta
This eliminates the computation of `release_tracks` in the app and fetches the computed meta from the backend once in the `versions` page.
1 parent c9833cb commit 6046e6a

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

app/controllers/crate/versions.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export default class SearchController extends Controller {
5252
if (next_page) {
5353
let params = new URLSearchParams(next_page);
5454
params.set('name', crate.name);
55+
params.delete('include');
5556
query = Object.fromEntries(params.entries());
5657
} else {
5758
if (sort !== 'semver') {
@@ -63,6 +64,9 @@ export default class SearchController extends Controller {
6364
per_page,
6465
};
6566
}
67+
if (crate.release_tracks == null) {
68+
query.include = 'release_tracks';
69+
}
6670

6771
try {
6872
let versions = await this.store.query('version', query);
@@ -82,6 +86,18 @@ export default class SearchController extends Controller {
8286
next_page: meta.next_page,
8387
};
8488
}
89+
90+
// set release_tracks to crate
91+
if (meta.release_tracks) {
92+
let payload = {
93+
crate: {
94+
id: crate.id,
95+
release_tracks: meta.release_tracks,
96+
},
97+
};
98+
this.store.pushPayload(payload);
99+
}
100+
85101
return versions;
86102
} catch (error) {
87103
// report unexpected errors to Sentry and ignore `ajax()` errors

app/models/crate.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ export default class Crate extends Model {
2929
@attr documentation;
3030
@attr repository;
3131

32+
/**
33+
* This isn't an attribute in the crate response.
34+
* It's actually the `meta` attribute that belongs to `versions`
35+
* and needs to be assigned to `crate` manually.
36+
* @type {Object.<string, {highest: string}>?}
37+
**/
38+
@attr release_tracks;
39+
3240
@hasMany('version', { async: true, inverse: 'crate' }) versions;
3341
@hasMany('team', { async: true, inverse: null }) owner_team;
3442
@hasMany('user', { async: true, inverse: null }) owner_user;
@@ -68,15 +76,9 @@ export default class Crate extends Model {
6876
}
6977

7078
@cached get releaseTrackSet() {
71-
let map = new Map();
72-
let { loadedVersionsById: versions, versionIdsBySemver } = this;
73-
for (let id of versionIdsBySemver) {
74-
let { releaseTrack, isPrerelease, yanked } = versions.get(id);
75-
if (releaseTrack && !isPrerelease && !yanked && !map.has(releaseTrack)) {
76-
map.set(releaseTrack, id);
77-
}
78-
}
79-
return new Set(map.values());
79+
let { release_tracks } = this;
80+
let nums = release_tracks ? Object.values(this.release_tracks).map(it => it.highest) : [];
81+
return new Set(nums);
8082
}
8183

8284
hasOwnerUser(userId) {

app/models/version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export default class Version extends Model {
102102
return false;
103103
}
104104

105-
return this.crate?.releaseTrackSet.has(this.id);
105+
return this.crate?.releaseTrackSet.has(this.num);
106106
}
107107

108108
get featureList() {

tests/models/version-test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { module, test } from 'qunit';
22

3+
import { calculateReleaseTracks } from '@crates-io/msw/utils/release-tracks';
4+
35
import { setupTest } from 'crates-io/tests/helpers';
46
import setupMsw from 'crates-io/tests/helpers/setup-msw';
57

@@ -169,6 +171,7 @@ module('Model | Version', function (hooks) {
169171

170172
let crateRecord = await this.store.findRecord('crate', crate.name);
171173
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
174+
crateRecord.release_tracks = calculateReleaseTracks(versions);
172175

173176
assert.deepEqual(
174177
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -200,6 +203,7 @@ module('Model | Version', function (hooks) {
200203

201204
let crateRecord = await this.store.findRecord('crate', crate.name);
202205
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
206+
crateRecord.release_tracks = calculateReleaseTracks(versions);
203207

204208
assert.deepEqual(
205209
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -218,6 +222,7 @@ module('Model | Version', function (hooks) {
218222

219223
let crateRecord = await this.store.findRecord('crate', crate.name);
220224
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
225+
crateRecord.release_tracks = calculateReleaseTracks(versions);
221226

222227
assert.deepEqual(
223228
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -231,6 +236,7 @@ module('Model | Version', function (hooks) {
231236
this.db.version.create({ crate, num: '0.4.3', yanked: true });
232237
crateRecord = await this.store.findRecord('crate', crate.name, { reload: true });
233238
versions = (await crateRecord.loadVersionsTask.perform({ reload: true })).slice();
239+
crateRecord.release_tracks = calculateReleaseTracks(versions);
234240

235241
assert.deepEqual(
236242
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),

0 commit comments

Comments
 (0)