-
Notifications
You must be signed in to change notification settings - Fork 0
/
schema.js
110 lines (91 loc) · 2.95 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
98
99
100
101
102
103
104
105
106
107
108
109
110
const{
GraphQLSchema,
GraphQLObjectType,
GraphQLInt,
GraphQLString,
GraphQLList
} = require('graphql')
/*
const x = fetch('https://www.goodreads.com/author/show.xml?id=4432&key=92WHmqw4RL2nx76JiypQ')
.then(response => response.text())
.then(parseXml)
*/
function translate(lang, str){
// Google translate API is a paid service
// To generate your own go here : https://cloud.google.com/translate/v2/getting started
const apiKey = 'AIzaSyBn-dvfndjfngvkxvjlxlkjvcbllkxcb'
const url = `https://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,
//resolve: xml=>xml.title[0]
args:{
lang:{type: GraphQLString}
},
// resolve: xml=>xml.GoodreadsResponse.book[0].title[0]
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.isbn[0]
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 => xml.GoodreadsResponse.author[0].books[0].book
resolve:(xml,args,context)=> {
const ids = xml.GoodreadsResponse.author[0].books[0].book.map(elem=> elem.id[0]._)
//console.log('Fetching Books...'+ ids)
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)
}
})
})
})