import * as admin from "firebase-admin"; import { eraseUndefined } from "../src/utils"; import * as common from "@shinonomekazan/scrap-conan-online"; export function deleteCollection(db: admin.firestore.Firestore, collectionRef: admin.firestore.CollectionReference) { const query = collectionRef.orderBy("__name__"); return new Promise((resolve, reject) => { deleteQueryBatch(db, query, resolve).catch(reject); }); } export function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function deleteQueryBatch(db: admin.firestore.Firestore, query: admin.firestore.Query, resolve: () => void) { const snapshot = await query.get(); const batchSize = snapshot.size; if (batchSize === 0) { resolve(); return; } let batch = db.batch(); const docs: admin.firestore.DocumentSnapshot[] = []; snapshot.docs.forEach((doc) => { docs.push(doc); }); for (let i = 0; i < batchSize; i++) { if (i % 500 === 0 && i > 0) { await batch.commit(); batch = db.batch(); await sleep(20); } batch.delete(docs[i].ref); } await batch.commit(); resolve(); } export function deleteUser(db: admin.firestore.Firestore, id: string) { return db.collection("users").doc(id).delete(); } export function deletePlaysDoc(db: admin.firestore.Firestore, docRef: admin.firestore.DocumentReference) { return docRef.delete(); } export function createUser(db: admin.firestore.Firestore, id: string, name: string, admin?: boolean) { return db.collection("users").doc(id).create( eraseUndefined({ name, admin, }) ); } export function setUser(db: admin.firestore.Firestore, id: string, name: string, admin?: boolean) { return db.collection("users").doc(id).set( eraseUndefined({ name, admin, }) ); } export function setQuartetGame(db: admin.firestore.Firestore, gameId: string, game: common.Game) { return db.collection("/games").doc(gameId).set(game); } export function setQuartetPlay(db: admin.firestore.Firestore, gameId: string, play: common.GamePlay) { return db.collection("/plays").doc(gameId).set(play); } export async function getAll(query: admin.firestore.Query, limit: number): Promise { let lastDoc: null | admin.firestore.QueryDocumentSnapshot = null; const result: T[] = []; let counter = 0; query = query.limit(limit); do { // console.log(`get by ${counter} to ${counter + limit}`); if (lastDoc != null) { query = query.startAfter(lastDoc); } lastDoc = null; const querySs = await query.get(); counter += querySs.size; querySs.forEach((doc) => { const data = doc.data(); result.push({ ...{}, ...data, ...{ id: doc.id, }, }); lastDoc = doc; }); } while (lastDoc != null); console.log(`got ${counter}.`); return result; }