UNPKG

@magnetarjs/plugin-firestore-admin

Version:

Magnetar plugin firestore-admin

57 lines (56 loc) 1.85 kB
import { FieldValue, Filter } from 'firebase-admin/firestore'; import { isArray, isNumber } from 'is-what'; export function doc(db, path) { return db.doc(path); } export function createWriteBatch(db) { return db.batch(); } export function deleteField() { return FieldValue.delete(); } function queryToFilter(queryClause) { if ('and' in queryClause) { return Filter.and(...queryClause.and.map((clause) => isArray(clause) ? Filter.where(...clause) : queryToFilter(clause))); } if ('or' in queryClause) { return Filter.or(...queryClause.or.map((clause) => isArray(clause) ? Filter.where(...clause) : queryToFilter(clause))); } throw new Error('invalid query'); } /** * If the collectionPath includes a `*` it will use a collectionQuery for the part beyond that point */ export function getQueryInstance(collectionPath, config, db) { let q; q = collectionPath.includes('*/') ? db.collectionGroup(collectionPath.split('*/')[1] ?? '') : db.collection(collectionPath); for (const queryClause of config.query || []) { q = q.where(queryToFilter(queryClause)); } for (const whereClause of config.where || []) { q = q.where(...whereClause); } for (const orderByClause of config.orderBy || []) { q = q.orderBy(...orderByClause); } if (config.startAfter) { q = Array.isArray(config.startAfter) ? q.startAfter(...config.startAfter) : q.startAfter(config.startAfter); } if (isNumber(config.limit)) { q = q.limit(config.limit); } return q; } export function docSnapshotToDocMetadata(docSnapshot) { const docMetaData = { data: docSnapshot.data(), metadata: docSnapshot, id: docSnapshot.id, exists: docSnapshot.exists, }; return docMetaData; }