-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathexercise-graphql-micro.js
119 lines (107 loc) · 1.86 KB
/
exercise-graphql-micro.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
111
112
113
114
115
116
117
118
119
const micro = require('micro');
const graphqlServer = require('express-graphql');
const {
GraphQLSchema,
GraphQLObjectType,
GraphQLList,
GraphQLString,
GraphQLInt
} = require('graphql');
const basketItems = [
{
quantity: 1,
price: 199,
name: 'Soda bottle',
id: '2'
},
{
quantity: 2,
price: 2499,
name: 'Kitchenware kits',
id: '1'
}
];
const basketItem = new GraphQLObjectType({
name: 'basketItem',
description: 'BasketItem',
fields() {
return {
name: {
type: GraphQLString
},
price: {
type: GraphQLInt
},
quantity: {
type: GraphQLInt
},
id: {
type: GraphQLString
}
};
}
});
const BasketType = new GraphQLObjectType({
name: 'basket',
fields() {
return {
items: {
type: new GraphQLList(basketItem)
}
};
}
});
// Query:
// {
// basket {
// items {
// name
// price
// quantity
// }
// }
// }
const basket = {
type: BasketType,
resolve() {
return {
items: basketItems
};
}
};
const query = new GraphQLObjectType({
name: 'Query',
description: 'Root query',
fields() {
return {
basket
};
}
});
// Mutation with:
// mutation {
// cost1: LineItemCost(id: "1")
// cost2: LineItemCost(id: "2")
// }
const LineItemCost = {
type: GraphQLInt,
args: {id: {type: GraphQLString}},
resolve(root, args, context) {
const item = basketItems.find(i => i.id === args.id);
return item ? item.quantity * item.price : null;
}
};
const mutation = new GraphQLObjectType({
name: 'Mutation',
fields() {
return {LineItemCost};
}
});
const handler = graphqlServer({
schema: new GraphQLSchema({query, mutation}),
graphiql: true
});
const server = micro(handler);
server.listen(3000, () => {
console.log('listening on port 3000');
});