Skip to content

Commit ef58484

Browse files
committed
Auto merge of #3698 - Turbo87:crate-id, r=locks
mirage: Untangle `crate.id` and `crate.name` The `id` is rarely used and exposed on the API, but there are a few cases where it is indeed used. The `id` is meant to be a `i32` though, so having it equal to the `name` of the crate was wrong. This PR fixes the issue by having the `id` as a regular numeric ID and using `name` everywhere else. This PR is a prerequisite for implementing `crate-owner-invitation` support into our mirage setup.
2 parents 33aa325 + 040bc68 commit ef58484

File tree

16 files changed

+266
-242
lines changed

16 files changed

+266
-242
lines changed

mirage/factories/crate.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ import { Factory } from 'ember-cli-mirage';
33
export default Factory.extend({
44
name: i => `crate-${i}`,
55

6-
id() {
7-
return this.name;
8-
},
9-
106
description() {
117
return `This is the description for the crate called "${this.name}"`;
128
},

mirage/route-handlers/crates.js

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ export function list(schema, request) {
1919

2020
if (request.queryParams.letter) {
2121
let letter = request.queryParams.letter.toLowerCase();
22-
crates = crates.filter(crate => crate.id[0].toLowerCase() === letter);
22+
crates = crates.filter(crate => crate.name[0].toLowerCase() === letter);
2323
}
2424

2525
if (request.queryParams.q) {
2626
let q = request.queryParams.q.toLowerCase();
27-
crates = crates.filter(crate => crate.id.toLowerCase().includes(q));
27+
crates = crates.filter(crate => crate.name.toLowerCase().includes(q));
2828
}
2929

3030
if (request.queryParams.user_id) {
@@ -39,7 +39,7 @@ export function list(schema, request) {
3939

4040
let { ids } = request.queryParams;
4141
if (ids) {
42-
crates = crates.filter(crate => ids.includes(crate.id));
42+
crates = crates.filter(crate => ids.includes(crate.name));
4343
}
4444

4545
if (request.queryParams.sort === 'alpha') {
@@ -52,9 +52,9 @@ export function list(schema, request) {
5252
export function register(server) {
5353
server.get('/api/v1/crates', list);
5454

55-
server.get('/api/v1/crates/:crate_id', function (schema, request) {
56-
let crateId = request.params.crate_id;
57-
let crate = schema.crates.find(crateId);
55+
server.get('/api/v1/crates/:name', function (schema, request) {
56+
let { name } = request.params;
57+
let crate = schema.crates.findBy({ name });
5858
if (!crate) return notFound();
5959

6060
return {
@@ -65,14 +65,14 @@ export function register(server) {
6565
};
6666
});
6767

68-
server.get('/api/v1/crates/:crateId/following', (schema, request) => {
68+
server.get('/api/v1/crates/:name/following', (schema, request) => {
6969
let { user } = getSession(schema);
7070
if (!user) {
7171
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
7272
}
7373

74-
let { crateId } = request.params;
75-
let crate = schema.crates.find(crateId);
74+
let { name } = request.params;
75+
let crate = schema.crates.findBy({ name });
7676
if (!crate) {
7777
return new Response(404, {}, { errors: [{ detail: 'Not Found' }] });
7878
}
@@ -82,14 +82,14 @@ export function register(server) {
8282
return { following };
8383
});
8484

85-
server.put('/api/v1/crates/:crateId/follow', (schema, request) => {
85+
server.put('/api/v1/crates/:name/follow', (schema, request) => {
8686
let { user } = getSession(schema);
8787
if (!user) {
8888
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
8989
}
9090

91-
let { crateId } = request.params;
92-
let crate = schema.crates.find(crateId);
91+
let { name } = request.params;
92+
let crate = schema.crates.findBy({ name });
9393
if (!crate) {
9494
return new Response(404, {}, { errors: [{ detail: 'Not Found' }] });
9595
}
@@ -100,14 +100,14 @@ export function register(server) {
100100
return { ok: true };
101101
});
102102

103-
server.delete('/api/v1/crates/:crateId/follow', (schema, request) => {
103+
server.delete('/api/v1/crates/:name/follow', (schema, request) => {
104104
let { user } = getSession(schema);
105105
if (!user) {
106106
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
107107
}
108108

109-
let { crateId } = request.params;
110-
let crate = schema.crates.find(crateId);
109+
let { name } = request.params;
110+
let crate = schema.crates.findBy({ name });
111111
if (!crate) {
112112
return new Response(404, {}, { errors: [{ detail: 'Not Found' }] });
113113
}
@@ -118,56 +118,56 @@ export function register(server) {
118118
return { ok: true };
119119
});
120120

121-
server.get('/api/v1/crates/:crate_id/versions', (schema, request) => {
122-
let crateId = request.params.crate_id;
123-
let crate = schema.crates.find(crateId);
121+
server.get('/api/v1/crates/:name/versions', (schema, request) => {
122+
let { name } = request.params;
123+
let crate = schema.crates.findBy({ name });
124124
if (!crate) return notFound();
125125

126126
return crate.versions.sort((a, b) => compareIsoDates(b.created_at, a.created_at));
127127
});
128128

129-
server.get('/api/v1/crates/:crate_id/:version_num/authors', (schema, request) => {
130-
let crateId = request.params.crate_id;
131-
let crate = schema.crates.find(crateId);
129+
server.get('/api/v1/crates/:name/:version_num/authors', (schema, request) => {
130+
let { name } = request.params;
131+
let crate = schema.crates.findBy({ name });
132132
if (!crate) return notFound();
133133

134134
let num = request.params.version_num;
135-
let version = schema.versions.findBy({ crateId, num });
136-
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
135+
let version = schema.versions.findBy({ crateId: crate.id, num });
136+
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] };
137137

138138
return { meta: { names: [] }, users: [] };
139139
});
140140

141-
server.get('/api/v1/crates/:crate_id/:version_num/dependencies', (schema, request) => {
142-
let crateId = request.params.crate_id;
143-
let crate = schema.crates.find(crateId);
141+
server.get('/api/v1/crates/:name/:version_num/dependencies', (schema, request) => {
142+
let { name } = request.params;
143+
let crate = schema.crates.findBy({ name });
144144
if (!crate) return notFound();
145145

146146
let num = request.params.version_num;
147-
let version = schema.versions.findBy({ crateId, num });
148-
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
147+
let version = schema.versions.findBy({ crateId: crate.id, num });
148+
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${num}\`` }] };
149149

150150
return schema.dependencies.where({ versionId: version.id });
151151
});
152152

153-
server.get('/api/v1/crates/:crate_id/:version_num/downloads', function (schema, request) {
154-
let crateId = request.params.crate_id;
155-
let crate = schema.crates.find(crateId);
153+
server.get('/api/v1/crates/:name/:version_num/downloads', function (schema, request) {
154+
let { name } = request.params;
155+
let crate = schema.crates.findBy({ name });
156156
if (!crate) return notFound();
157157

158158
let versionNum = request.params.version_num;
159-
let version = schema.versions.findBy({ crateId, num: versionNum });
160-
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${versionNum}\`` }] };
159+
let version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
160+
if (!version) return { errors: [{ detail: `crate \`${crate.name}\` does not have a version \`${versionNum}\`` }] };
161161

162162
return schema.versionDownloads.where({ versionId: version.id });
163163
});
164164

165-
server.get('/api/v1/crates/:crate_id/owner_user', function (schema, request) {
166-
let crateId = request.params.crate_id;
167-
let crate = schema.crates.find(crateId);
165+
server.get('/api/v1/crates/:name/owner_user', function (schema, request) {
166+
let { name } = request.params;
167+
let crate = schema.crates.findBy({ name });
168168
if (!crate) return notFound();
169169

170-
let ownerships = schema.crateOwnerships.where({ crateId }).filter(it => it.userId).models;
170+
let ownerships = schema.crateOwnerships.where({ crateId: crate.id }).filter(it => it.userId).models;
171171

172172
return {
173173
users: ownerships.map(it => {
@@ -178,12 +178,12 @@ export function register(server) {
178178
};
179179
});
180180

181-
server.get('/api/v1/crates/:crate_id/owner_team', function (schema, request) {
182-
let crateId = request.params.crate_id;
183-
let crate = schema.crates.find(crateId);
181+
server.get('/api/v1/crates/:name/owner_team', function (schema, request) {
182+
let { name } = request.params;
183+
let crate = schema.crates.findBy({ name });
184184
if (!crate) return notFound();
185185

186-
let ownerships = schema.crateOwnerships.where({ crateId }).filter(it => it.teamId).models;
186+
let ownerships = schema.crateOwnerships.where({ crateId: crate.id }).filter(it => it.teamId).models;
187187

188188
return {
189189
teams: ownerships.map(it => {
@@ -194,14 +194,14 @@ export function register(server) {
194194
};
195195
});
196196

197-
server.get('/api/v1/crates/:crate_id/reverse_dependencies', function (schema, request) {
198-
let crateId = request.params.crate_id;
199-
let crate = schema.crates.find(crateId);
197+
server.get('/api/v1/crates/:name/reverse_dependencies', function (schema, request) {
198+
let { name } = request.params;
199+
let crate = schema.crates.findBy({ name });
200200
if (!crate) return notFound();
201201

202202
let { start, end } = pageParams(request);
203203

204-
let allDependencies = schema.dependencies.where({ crateId: crateId });
204+
let allDependencies = schema.dependencies.where({ crateId: crate.id });
205205
let dependencies = allDependencies.slice(start, end);
206206
let total = allDependencies.length;
207207

@@ -214,19 +214,19 @@ export function register(server) {
214214
};
215215
});
216216

217-
server.get('/api/v1/crates/:crate_id/downloads', function (schema, request) {
218-
let crateId = request.params.crate_id;
219-
let crate = schema.crates.find(crateId);
217+
server.get('/api/v1/crates/:name/downloads', function (schema, request) {
218+
let { name } = request.params;
219+
let crate = schema.crates.findBy({ name });
220220
if (!crate) return notFound();
221221

222-
let versionDownloads = schema.versionDownloads.all().filter(it => it.version.crateId === crateId);
222+
let versionDownloads = schema.versionDownloads.all().filter(it => it.version.crateId === crate.id);
223223

224224
return withMeta(this.serialize(versionDownloads), { extra_downloads: crate._extra_downloads });
225225
});
226226

227-
server.put('/api/v1/crates/:crate_id/owners', (schema, request) => {
228-
const crateId = request.params.crate_id;
229-
const crate = schema.crates.find(crateId);
227+
server.put('/api/v1/crates/:name/owners', (schema, request) => {
228+
let { name } = request.params;
229+
let crate = schema.crates.findBy({ name });
230230

231231
if (!crate) {
232232
return notFound();
@@ -243,9 +243,9 @@ export function register(server) {
243243
return { ok: true };
244244
});
245245

246-
server.delete('/api/v1/crates/:crate_id/owners', (schema, request) => {
247-
const crateId = request.params.crate_id;
248-
const crate = schema.crates.find(crateId);
246+
server.delete('/api/v1/crates/:name/owners', (schema, request) => {
247+
let { name } = request.params;
248+
let crate = schema.crates.findBy({ name });
249249

250250
if (!crate) {
251251
return notFound();
@@ -262,23 +262,29 @@ export function register(server) {
262262
return { ok: true, msg: 'owners successfully removed' };
263263
});
264264

265-
server.delete('/api/v1/crates/:crate_id/:version/yank', (schema, request) => {
266-
const crateId = request.params.crate_id;
267-
const versionNum = request.params.version;
265+
server.delete('/api/v1/crates/:name/:version/yank', (schema, request) => {
266+
const { name, version: versionNum } = request.params;
267+
const crate = schema.crates.findBy({ name });
268+
if (!crate) {
269+
return notFound();
270+
}
268271

269-
const version = schema.versions.findBy({ crateId, num: versionNum });
272+
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
270273
if (!version) {
271274
return notFound();
272275
}
273276

274277
return {};
275278
});
276279

277-
server.put('/api/v1/crates/:crate_id/:version/unyank', (schema, request) => {
278-
const crateId = request.params.crate_id;
279-
const versionNum = request.params.version;
280+
server.put('/api/v1/crates/:name/:version/unyank', (schema, request) => {
281+
const { name, version: versionNum } = request.params;
282+
const crate = schema.crates.findBy({ name });
283+
if (!crate) {
284+
return notFound();
285+
}
280286

281-
const version = schema.versions.findBy({ crateId, num: versionNum });
287+
const version = schema.versions.findBy({ crateId: crate.id, num: versionNum });
282288
if (!version) {
283289
return notFound();
284290
}

mirage/serializers/crate.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ export default BaseSerializer.extend({
2828

2929
links(crate) {
3030
return {
31-
owner_user: `/api/v1/crates/${crate.id}/owner_user`,
32-
owner_team: `/api/v1/crates/${crate.id}/owner_team`,
33-
reverse_dependencies: `/api/v1/crates/${crate.id}/reverse_dependencies`,
34-
version_downloads: `/api/v1/crates/${crate.id}/downloads`,
35-
versions: `/api/v1/crates/${crate.id}/versions`,
31+
owner_user: `/api/v1/crates/${crate.name}/owner_user`,
32+
owner_team: `/api/v1/crates/${crate.name}/owner_team`,
33+
reverse_dependencies: `/api/v1/crates/${crate.name}/reverse_dependencies`,
34+
version_downloads: `/api/v1/crates/${crate.name}/downloads`,
35+
versions: `/api/v1/crates/${crate.name}/versions`,
3636
};
3737
},
3838

@@ -52,7 +52,7 @@ export default BaseSerializer.extend({
5252

5353
_adjust(hash) {
5454
let versions = this.schema.versions.where({ crateId: hash.id });
55-
assert(`crate \`${hash.id}\` has no associated versions`, versions.length !== 0);
55+
assert(`crate \`${hash.name}\` has no associated versions`, versions.length !== 0);
5656
versions = versions.filter(it => !it.yanked);
5757

5858
let versionNums = versions.models.map(it => it.num);
@@ -63,6 +63,8 @@ export default BaseSerializer.extend({
6363
let newestVersions = versions.models.sort((a, b) => compareIsoDates(b.updated_at, a.updated_at));
6464
hash.newest_version = newestVersions[0]?.num ?? '0.0.0';
6565

66+
hash.id = hash.name;
67+
6668
hash.categories = hash.category_ids;
6769
delete hash.category_ids;
6870

mirage/serializers/dependency.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import BaseSerializer from './application';
2+
3+
export default BaseSerializer.extend({
4+
getHashForResource() {
5+
let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments);
6+
7+
if (Array.isArray(hash)) {
8+
for (let resource of hash) {
9+
this._adjust(resource);
10+
}
11+
} else {
12+
this._adjust(hash);
13+
}
14+
15+
return [hash, addToIncludes];
16+
},
17+
18+
_adjust(hash) {
19+
let crate = this.schema.crates.find(hash.crate_id);
20+
hash.crate_id = crate.name;
21+
},
22+
});

mirage/serializers/version.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ export default BaseSerializer.extend({
2121

2222
links(version) {
2323
return {
24-
dependencies: `/api/v1/crates/${version.crateId}/${version.num}/dependencies`,
25-
version_downloads: `/api/v1/crates/${version.crateId}/${version.num}/downloads`,
24+
dependencies: `/api/v1/crates/${version.crate.name}/${version.num}/dependencies`,
25+
version_downloads: `/api/v1/crates/${version.crate.name}/${version.num}/downloads`,
2626
};
2727
},
2828

@@ -43,8 +43,10 @@ export default BaseSerializer.extend({
4343
},
4444

4545
_adjust(hash, includes) {
46-
hash.dl_path = `/api/v1/crates/${hash.crate_id}/${hash.num}/download`;
47-
hash.crate = hash.crate_id;
46+
let crate = this.schema.crates.find(hash.crate_id);
47+
48+
hash.dl_path = `/api/v1/crates/${crate.name}/${hash.num}/download`;
49+
hash.crate = crate.name;
4850

4951
if (hash.published_by_id) {
5052
let user = includes.find(it => it.modelName === 'user' && it.id === hash.published_by_id);

0 commit comments

Comments
 (0)