-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
60 lines (52 loc) · 1.44 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
const {
DirectiveLocation,
GraphQLDirective,
GraphQLString,
} = require('graphql');
const { SchemaDirectiveVisitor } = require('graphql-tools');
const fetch = require('node-fetch');
const get = require('lodash.get');
class RestError extends Error {
constructor(message = 'Error occured', code = 400) {
super(message);
this.code = code;
}
}
class restDirective extends SchemaDirectiveVisitor {
static getDirectiveDeclaration(directiveName = 'rest') {
return new GraphQLDirective({
name: directiveName,
locations: [DirectiveLocation.FIELD_DEFINITION],
args: {
url: { type: GraphQLString },
extractFromResponse: { type: GraphQLString, defaultValue: '' },
},
});
}
visitFieldDefinition(field) {
field.resolve = (_, args) => {
let url = this.args.url;
if (args) {
for (const arg in args) {
if (Object.prototype.hasOwnProperty.call(args, arg)) {
url = url.replace(`$${arg}`, args[arg]);
}
}
}
return fetch(url)
.then(response => {
if (!response.ok) {
throw new RestError(response.statusText, response.status);
}
return response.json();
})
.then(data => {
if (this.args.extractFromResponse) {
return get(data, this.args.extractFromResponse);
}
return data;
});
};
}
}
module.exports = restDirective;