firestore-dataloader
Version:
GraphQL DataLoader for Cloud Firestore.
46 lines (45 loc) • 1.74 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirestoreDataLoader = void 0;
const firestore_1 = require("@google-cloud/firestore");
const apollo_datasource_1 = require("apollo-datasource");
const dataloader_1 = __importDefault(require("dataloader"));
const getDocData_1 = require("./utils/getDocData");
/**
* GraphQL DataLoader for Cloud Firestore.
*/
class FirestoreDataLoader extends apollo_datasource_1.DataSource {
/**
* constructor
* It is assumed to be declared as one of the dataSources.
* @param baseQuery CollectionReference or Query
* @param options DataLoader.Options. maxBatchSize is set to 10 due to firestore limitation.
*/
constructor(baseQuery, options) {
super();
this.dataLoader = new dataloader_1.default((keys) => this.loadDataByKeys(baseQuery, keys), {
...options,
// maximum of 10 firestore in clauses.
maxBatchSize: 10,
});
}
/**
* load datas by keys
* @param {CollectionReference | Query} baseQuery CollectionReference or Query
* @param {string[]} keys
* @returns documents
*/
async loadDataByKeys(baseQuery, keys) {
const snapshot = await baseQuery.where(firestore_1.FieldPath.documentId(), `in`, keys).get();
if (snapshot.empty)
return [];
return keys.map((key) => {
const doc = snapshot.docs.find((doc) => doc.id === key);
return doc ? getDocData_1.getDocData(doc) : null;
});
}
}
exports.FirestoreDataLoader = FirestoreDataLoader;