-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschema.ts
123 lines (113 loc) · 2.79 KB
/
schema.ts
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
120
121
122
123
import {
graphql,
GraphQLObjectType,
GraphQLList,
GraphQLSchema,
GraphQLString,
GraphQLFloat,
GraphQLID,
Source
} from 'graphql';
import { fieldPolicy } from '../src';
import { accounts, banks, customers } from './data';
import { Account, Bank, Customer } from './classes';
import { AccountPolicy, BankPolicy, CustomerPolicy } from './policies';
const fieldPolicyOptions = {
policyMap: {
Account: AccountPolicy,
Bank: BankPolicy,
Customer: CustomerPolicy
}
};
const AccountType = new GraphQLObjectType({
name: 'Account',
fields: () => ({
id: {
type: GraphQLID
},
balance: {
type: GraphQLFloat,
resolve: fieldPolicy((parent: any) => parent.balance, fieldPolicyOptions)
}
})
});
const BankType = new GraphQLObjectType({
name: 'Bank',
fields: () => ({
id: {
type: GraphQLID
},
accounts: {
type: GraphQLList(AccountType),
resolve: fieldPolicy((parent: any) => parent.accounts, fieldPolicyOptions)
},
customers: {
type: GraphQLList(CustomerType),
resolve: fieldPolicy((parent: any) => parent.customers, fieldPolicyOptions)
}
})
});
const CustomerType = new GraphQLObjectType({
name: 'Customer',
fields: () => ({
id: {
type: GraphQLID
},
name: {
type: GraphQLString
},
phoneNumber: {
type: GraphQLString
},
accounts: {
type: GraphQLList(AccountType),
resolve: fieldPolicy((parent: any) => parent.accounts, fieldPolicyOptions)
}
})
});
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
accounts: {
type: GraphQLList(AccountType),
resolve: fieldPolicy(() => accounts, fieldPolicyOptions)
},
account: {
type: AccountType,
args: {
id: { type: GraphQLID }
},
resolve: fieldPolicy((_: any, { id }: { id: string }) => Account.find(id), fieldPolicyOptions)
},
bank: {
type: BankType,
args: {
id: { type: GraphQLID }
},
resolve: fieldPolicy((_: any, { id }: { id: string }) => Bank.find(id), fieldPolicyOptions)
},
banks: {
type: GraphQLList(BankType),
resolve: fieldPolicy(() => banks, fieldPolicyOptions)
},
customers: {
type: GraphQLList(CustomerType),
resolve: fieldPolicy(() => customers, fieldPolicyOptions)
},
customer: {
type: CustomerType,
args: {
id: { type: GraphQLID }
},
resolve: fieldPolicy((_: any, { id }: { id: string }) => Customer.find(id), fieldPolicyOptions)
}
}
});
const schema = new GraphQLSchema({
types: [AccountType, BankType, CustomerType],
query: QueryType
});
export default schema;
export const runQuery = (query: Source | string, variables: any, context = {}) => {
return graphql(schema, query, null, context, variables);
};