Skip to content

Commit 7dc77de

Browse files
committed
crate: Add withReleaseTracks support for findHasMany
1 parent 4eac251 commit 7dc77de

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

app/adapters/crate.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,34 @@ const BULK_REQUEST_GROUP_SIZE = 10;
55
export default class CrateAdapter extends ApplicationAdapter {
66
coalesceFindRequests = true;
77

8+
async findHasMany(store, snapshot, url, relationship) {
9+
if (relationship.key === 'versions') {
10+
let { adapterOptions } = snapshot;
11+
let data;
12+
if (adapterOptions?.withReleaseTracks === true) {
13+
data = { include: 'release_tracks' };
14+
}
15+
return this.ajax(url, 'GET', { data }).then(resp => {
16+
let crate = store.peekRecord('crate', snapshot.id);
17+
if (resp.meta) {
18+
let payload = {
19+
crate: {
20+
id: snapshot.id,
21+
versions_meta: {
22+
...crate.versions_meta,
23+
...resp.meta,
24+
},
25+
},
26+
};
27+
store.pushPayload(payload);
28+
}
29+
return resp;
30+
});
31+
}
32+
33+
return super.findHasMany(store, snapshot, url, relationship);
34+
}
35+
836
findRecord(store, type, id, snapshot) {
937
let { include } = snapshot;
1038
// This ensures `crate.versions` are always fetched from another request.

app/models/crate.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,18 @@ export default class Crate extends Model {
146146
return [...(teams ?? []), ...(users ?? [])];
147147
});
148148

149-
loadVersionsTask = task(async ({ reload = false } = {}) => {
149+
/**
150+
* @param {Object} [Options]
151+
* @param {bool} [Options.reload]
152+
* @param {bool} [Options.withReleaseTracks] - default: true if it has not yet been loaded else false
153+
**/
154+
loadVersionsTask = task(async ({ reload = false, withReleaseTracks } = {}) => {
150155
let versionsRef = this.hasMany('versions');
151-
let fut = reload === true ? versionsRef.reload() : versionsRef.load();
156+
let opts = { adapterOptions: { withReleaseTracks } };
157+
if (opts.adapterOptions.withReleaseTracks == null) {
158+
opts.adapterOptions.withReleaseTracks = this?.versions_meta?.release_tracks == null;
159+
}
160+
let fut = reload === true ? versionsRef.reload(opts) : versionsRef.load(opts);
152161
return (await fut) ?? [];
153162
});
154163
}

tests/adapters/crate-test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,27 @@ module('Adapter | crate', function (hooks) {
3939
await versionsRef.load();
4040
assert.deepEqual(versionsRef.ids(), [version.id]);
4141
});
42+
43+
test('findHasMany `versions` with `release_tracks` meta', async function (assert) {
44+
let crate = this.server.create('crate', { name: 'foo' });
45+
this.server.create('version', { crate, num: '0.0.1' });
46+
this.server.create('version', { crate, num: '0.1.0' });
47+
this.server.create('version', { crate, num: '1.0.0' });
48+
49+
let store = this.owner.lookup('service:store');
50+
51+
let foo = await store.findRecord('crate', 'foo');
52+
assert.strictEqual(foo?.name, 'foo');
53+
assert.strictEqual(foo?.versions_map?.release_tracks, undefined);
54+
55+
// load `versions` without `release_tracks` meta included
56+
let versionsRef = foo.hasMany('versions');
57+
await versionsRef.load();
58+
assert.strictEqual(foo?.versions_meta?.release_tracks, undefined);
59+
60+
// reload `versions` with `release_tracks` meta included
61+
let resp = await versionsRef.reload({ adapterOptions: { withReleaseTracks: true } });
62+
let { meta } = resp;
63+
assert.deepEqual(foo?.versions_meta?.release_tracks, meta.release_tracks);
64+
});
4265
});

0 commit comments

Comments
 (0)