1
1
import { TypeComposer } from 'graphql-compose'
2
2
import DataLoader from 'dataloader'
3
- import {
4
- wrapFindById ,
5
- wrapFindByIds ,
6
- wrapConnection ,
7
- wrapFindMany ,
8
- } from './resolvers'
3
+ import hash from 'object-hash'
4
+ import SingleContinous from './singleContinous'
9
5
10
6
import {
11
7
dataloaderOptions
@@ -20,14 +16,116 @@ export function composeWithDataLoader(
20
16
// if (!(typeComposer instanceof TypeComposer)) {
21
17
// throw new Error('You should provide TypeComposer instance to composeWithDataLoader method');
22
18
// }
19
+ //
20
+ //
21
+ /**
22
+ * Set defaults
23
+ */
24
+ options = {
25
+ cacheExpiration : options . cacheExpiration || 300 ,
26
+ removeProjection : options . removeProjection || true ,
27
+ debug : options . debug || false ,
28
+ }
29
+
30
+ /**
31
+ * Add DataLoader to FindById
32
+ */
33
+ let findByIdResolver = typeComposer . getResolver ( 'findById' )
34
+ let findByIdLoader = new DataLoader ( ( resolveParamsArray ) => {
35
+ if ( options . debug ) console . log ( 'New db request (findById)' )
36
+ let params = resolveParamsArray [ 0 ]
37
+
38
+ return findByIdResolver . resolve ( params ) . then ( res => [ res ] )
39
+ } ,
40
+ { cacheKeyFn : key => key . args . _id . toString ( ) } )
41
+
42
+ typeComposer . setResolver ( 'findById' ,
43
+ findByIdResolver . wrapResolve ( fn => rp => {
44
+ if ( options . removeProjection ) delete rp . projection
45
+ SingleContinous . run ( findByIdLoader , rp , options )
46
+ return findByIdLoader . load ( rp )
47
+ } )
48
+ )
49
+
50
+
51
+
52
+ /**
53
+ * Add DataLoader to FindByIds
54
+ */
55
+ // let findByIdsResolver = typeComposer.getResolver('findByIds')
56
+ // let findByIdsLoader = new DataLoader( (resolveParamsArray) => {
57
+ // if (options.debug) console.log('New db request (findByIds)')
58
+ // return findByIdResolver.resolve(resolveParamsArray[0]).then(res => [res])
59
+ // },
60
+ // { cacheKeyFn: key => {
61
+ // let hashKey = hash(key.args)
62
+ // return hashKey
63
+ // } })
64
+
65
+ // typeComposer.setResolver(
66
+ // 'findByIds',
67
+ // findByIdsResolver.wrapResolve(fn => rp => {
68
+ // SingleContinous.run(findByIdsLoader, rp, opt)
69
+ // return findByIdsLoader.load(rp)
70
+ // })
71
+ // )
72
+
73
+
23
74
24
75
/**
25
- * get resolvers to add DataLoader to
76
+ * Add DataLoader to FindMany
26
77
*/
27
- typeComposer = wrapFindById ( typeComposer , options )
28
- typeComposer = wrapFindByIds ( typeComposer , options )
29
- typeComposer = wrapFindMany ( typeComposer , options )
30
- typeComposer = wrapConnection ( typeComposer , options )
78
+ // let findManyResolver = typeComposer.getResolver('findMany')
79
+ // let findManyLoader = new DataLoader( (resolveParamsArray) => {
80
+ // if (options.debug) console.log('New db request (findMany)')
81
+ // console.log(resolveParamsArray[0])
82
+ // //response
83
+ // return findManyResolver.resolve(resolveParamsArray[0]).then(res => [res])
84
+ // },
85
+ // { cacheKeyFn: key => {
86
+ // let hashKey = hash(key.args)
87
+ // return hashKey
88
+ // } })
89
+
90
+ // typeComposer.setResolver(
91
+ // 'findMany',
92
+ // findManyResolver.wrapResolve(fn => rp => {
93
+ // if (options.removeProjection) delete rp.projection
94
+ // SingleContinous.run(findManyLoader, rp, options)
95
+ // return findManyLoader.load(rp)
96
+ // })
97
+ // )
98
+
99
+
100
+ /**
101
+ * Add DataLoader to Connection
102
+ */
103
+ let connectionResolver = typeComposer . getResolver ( 'connection' )
104
+ let connectionFieldNames = typeComposer . getFieldNames ( )
105
+ let connectionLoader = new DataLoader ( ( resolveParamsArray ) => {
106
+ if ( options . debug ) console . log ( 'New db request (connection)' )
107
+ let params = resolveParamsArray [ 0 ]
108
+ //response
109
+ return connectionResolver . resolve ( params ) . then ( res => [ res ] )
110
+ } ,
111
+ { cacheKeyFn : key => {
112
+ let hashKey = hash ( key . args )
113
+ return hashKey
114
+ } } )
115
+
116
+ typeComposer . setResolver ( 'connection' ,
117
+ connectionResolver . wrapResolve ( fn => rp => {
118
+ if ( options . removeProjection ) {
119
+ let projection = { edges : { node : { } } }
120
+ connectionFieldNames . map ( field => projection . edges . node [ field ] = true )
121
+ rp . projection = projection
122
+ }
123
+ SingleContinous . run ( connectionLoader , rp , options )
124
+ return connectionLoader . load ( rp )
125
+ } )
126
+ )
127
+
128
+
31
129
32
130
return typeComposer
33
131
}
0 commit comments