Skip to content

Commit 8561f9e

Browse files
committed
Auto merge of #2136 - Turbo87:error-handling, r=locks
Fix error handling for mirage request handlers We had a lot of mirage request handlers that we failing with Error 500 when requesting unknown crates. This PR adds null checks that result in correct Error 404 responses. r? @locks
2 parents 5b1e23c + a4797e8 commit 8561f9e

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

mirage/route-handlers/crates.js

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,34 +57,54 @@ export function register(server) {
5757
});
5858

5959
server.get('/api/v1/crates/:crate_id/versions', (schema, request) => {
60-
let crate = request.params.crate_id;
61-
return schema.versions.where({ crate }).sort((a, b) => compareIsoDates(b.created_at, a.created_at));
60+
let crateId = request.params.crate_id;
61+
let crate = schema.crates.find(crateId);
62+
if (!crate) return notFound();
63+
64+
return schema.versions.where({ crate: crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at));
6265
});
6366

6467
server.get('/api/v1/crates/:crate_id/:version_num/authors', (schema, request) => {
65-
let crate = request.params.crate_id;
68+
let crateId = request.params.crate_id;
69+
let crate = schema.crates.find(crateId);
70+
if (!crate) return notFound();
71+
6672
let num = request.params.version_num;
67-
let version = schema.versions.findBy({ crate, num });
73+
let version = schema.versions.findBy({ crate: crateId, num });
74+
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
75+
6876
return { meta: { names: version._authors }, users: [] };
6977
});
7078

7179
server.get('/api/v1/crates/:crate_id/:version_num/dependencies', (schema, request) => {
72-
let crate = request.params.crate_id;
80+
let crateId = request.params.crate_id;
81+
let crate = schema.crates.find(crateId);
82+
if (!crate) return notFound();
83+
7384
let num = request.params.version_num;
74-
let version_id = schema.versions.findBy({ crate, num }).id;
75-
return schema.dependencies.where({ version_id });
85+
let version = schema.versions.findBy({ crate: crateId, num });
86+
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
87+
88+
return schema.dependencies.where({ version_id: version.id });
7689
});
7790

7891
server.get('/api/v1/crates/:crate_id/:version_num/downloads', function(schema, request) {
7992
let crateId = request.params.crate_id;
93+
let crate = schema.crates.find(crateId);
94+
if (!crate) return notFound();
95+
8096
let versionNum = request.params.version_num;
81-
let versionId = schema.versions.findBy({ crate: crateId, num: versionNum }).id;
82-
return schema.versionDownloads.where({ version: versionId });
97+
let version = schema.versions.findBy({ crate: crateId, num: versionNum });
98+
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${versionNum}\`` }] };
99+
100+
return schema.versionDownloads.where({ version: version.id });
83101
});
84102

85103
server.get('/api/v1/crates/:crate_id/owner_user', function(schema, request) {
86104
let crateId = request.params.crate_id;
87105
let crate = schema.crates.find(crateId);
106+
if (!crate) return notFound();
107+
88108
let users = schema.users.find(crate._owner_users);
89109

90110
let response = this.serialize(users);
@@ -99,6 +119,8 @@ export function register(server) {
99119
server.get('/api/v1/crates/:crate_id/owner_team', function(schema, request) {
100120
let crateId = request.params.crate_id;
101121
let crate = schema.crates.find(crateId);
122+
if (!crate) return notFound();
123+
102124
let teams = schema.teams.find(crate._owner_teams);
103125

104126
let response = this.serialize(teams);
@@ -111,10 +133,13 @@ export function register(server) {
111133
});
112134

113135
server.get('/api/v1/crates/:crate_id/reverse_dependencies', function(schema, request) {
136+
let crateId = request.params.crate_id;
137+
let crate = schema.crates.find(crateId);
138+
if (!crate) return notFound();
139+
114140
let { start, end } = pageParams(request);
115141

116-
let crate = request.params.crate_id;
117-
let allDependencies = schema.dependencies.where({ crate_id: crate });
142+
let allDependencies = schema.dependencies.where({ crate_id: crateId });
118143
let dependencies = allDependencies.slice(start, end);
119144
let total = allDependencies.length;
120145

@@ -130,6 +155,8 @@ export function register(server) {
130155
server.get('/api/v1/crates/:crate_id/downloads', function(schema, request) {
131156
let crateId = request.params.crate_id;
132157
let crate = schema.crates.find(crateId);
158+
if (!crate) return notFound();
159+
133160
let versionDownloads = schema.versionDownloads
134161
.all()
135162
.filter(it => crate.versions.indexOf(parseInt(it.version, 10)) !== -1);

0 commit comments

Comments
 (0)