11import { TypeComposer } from 'graphql-compose'
22import 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'
95
106import {
117 dataloaderOptions
@@ -20,14 +16,116 @@ export function composeWithDataLoader(
2016 // if (!(typeComposer instanceof TypeComposer)) {
2117 // throw new Error('You should provide TypeComposer instance to composeWithDataLoader method');
2218 // }
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+
2374
2475 /**
25- * get resolvers to add DataLoader to
76+ * Add DataLoader to FindMany
2677 */
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+
31129
32130 return typeComposer
33131}
0 commit comments