-
Notifications
You must be signed in to change notification settings - Fork 44
/
schema.js
97 lines (90 loc) · 2.33 KB
/
schema.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const {
GraphQLSchema,
GraphQLObjectType,
GraphQLInt,
GraphQLString,
GraphQLList
} = require('graphql')
function translate(lang, str) {
// Google Translate API is a paid (but dirt cheap) service. This is my key
// and will be disabled by the time the video is out. To generate your own,
// go here: https://cloud.google.com/translate/v2/getting_started
const apiKey =
'AIzaSyBN-bwtos8sKU6X84wkrdjtCF7uzng6kgQ'
const url =
'https://www.googleapis.com' +
'/language/translate/v2' +
'?key=' + apiKey +
'&source=en' +
'&target=' + lang +
'&q=' + encodeURIComponent(str)
return fetch(url)
.then(response => response.json())
.then(parsedResponse =>
parsedResponse
.data
.translations[0]
.translatedText
)
}
const BookType = new GraphQLObjectType({
name: 'Book',
description: '...',
fields: () => ({
title: {
type: GraphQLString,
args: {
lang: { type: GraphQLString }
},
resolve: (xml, args) => {
const title = xml.GoodreadsResponse.book[0].title[0]
return args.lang ? translate(args.lang, title) : title
}
},
isbn: {
type: GraphQLString,
resolve: xml => xml.GoodreadsResponse.book[0].isbn[0]
},
authors: {
type: new GraphQLList(AuthorType),
resolve: (xml, args, context) => {
const authorElements = xml.GoodreadsResponse.book[0].authors[0].author
const ids = authorElements.map(elem => elem.id[0])
return context.authorLoader.loadMany(ids)
}
}
})
})
const AuthorType = new GraphQLObjectType({
name: 'Author',
description: '...',
fields: () => ({
name: {
type: GraphQLString,
resolve: xml =>
xml.GoodreadsResponse.author[0].name[0]
},
books: {
type: new GraphQLList(BookType),
resolve: (xml, args, context) => {
const ids = xml.GoodreadsResponse.author[0].books[0].book.map(elem => elem.id[0]._)
return context.bookLoader.loadMany(ids)
}
}
})
})
module.exports = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
description: '...',
fields: () => ({
author: {
type: AuthorType,
args: {
id: { type: GraphQLInt }
},
resolve: (root, args, context) => context.authorLoader.load(args.id)
}
})
})
})