11import { DataSource } from "apollo-datasource" ;
22import { ApolloError } from "apollo-server-errors" ;
33import { InMemoryLRUCache , KeyValueCache } from "apollo-server-caching" ;
4- import { Container } from "@azure/cosmos" ;
4+ import { Container , SqlQuerySpec } from "@azure/cosmos" ;
55import { Logger } from "./helpers" ;
66
77import { isCosmosDbContainer } from "./helpers" ;
8- import { createCachingMethods , CachedMethods } from "./cache" ;
8+ import { createCachingMethods , CachedMethods , FindArgs } from "./cache" ;
9+ import DataLoader from "dataloader" ;
910
1011export interface CosmosDataSourceOptions {
1112 logger ?: Logger ;
@@ -15,7 +16,7 @@ const placeholderHandler = () => {
1516 throw new Error ( "DataSource not initialized" ) ;
1617} ;
1718
18- export class CosmosDataSource < TData , TContext = any >
19+ export class CosmosDataSource < TData extends { id : string } , TContext = any >
1920 extends DataSource < TContext >
2021 implements CachedMethods < TData > {
2122 container : Container ;
@@ -26,6 +27,20 @@ export class CosmosDataSource<TData, TContext = any>
2627 findOneById : CachedMethods < TData > [ "findOneById" ] = placeholderHandler ;
2728 findManyByIds : CachedMethods < TData > [ "findManyByIds" ] = placeholderHandler ;
2829 deleteFromCacheById : CachedMethods < TData > [ "deleteFromCacheById" ] = placeholderHandler ;
30+ dataLoader : CachedMethods < TData > [ "dataLoader" ] ;
31+ primeCache : CachedMethods < TData > [ "primeCache" ] = placeholderHandler ;
32+
33+ // base SQL operations aren't cached so directly declared here
34+ async findManyByQuery ( query : SqlQuerySpec | string , { ttl } : FindArgs ) {
35+ const results = await this . container . items . query < TData > ( query ) . fetchAll ( ) ;
36+ // prime these into the dataloader and maybe the cache
37+ if ( this . dataLoader && results . resources ) {
38+ results . resources . forEach ( ( r ) => {
39+ this . primeCache ( r , ttl ) ;
40+ } ) ;
41+ }
42+ return results . resources ;
43+ }
2944
3045 constructor ( container : Container , options : CosmosDataSourceOptions = { } ) {
3146 super ( ) ;
0 commit comments