@magnetarjs/plugin-firestore-admin
Version:
Magnetar plugin firestore-admin
57 lines (56 loc) • 1.85 kB
JavaScript
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;
}