UNPKG

firestore-dataloader

Version:
46 lines (45 loc) 1.74 kB
"use strict"; 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;