From 17a0355a4fcac39fe755d7ea0a673fcd1d6f1921 Mon Sep 17 00:00:00 2001 From: Ayushya Amitabh Date: Sat, 8 Aug 2020 19:04:31 -0400 Subject: [PATCH] v1.6.0/cleanup fix --- functions/webhooks/cleanUpRoom.js | 70 +++++++++++++++----------- functions/webhooks/scheduledCleanUp.js | 10 ++-- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/functions/webhooks/cleanUpRoom.js b/functions/webhooks/cleanUpRoom.js index c268db2..83555b4 100644 --- a/functions/webhooks/cleanUpRoom.js +++ b/functions/webhooks/cleanUpRoom.js @@ -1,32 +1,46 @@ -const admin = require('firebase-admin'); +const admin = require("firebase-admin"); -module.exports = async (roomId) => { - admin +module.exports = async (partyName) => { + // DELETE MESSAGES + const partyMessagesRef = admin .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .listDocuments() - .then((messages) => messages.forEach((message) => message.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room messages) @ ${roomId}`, err); - }); - admin + .collection("rooms") + .doc(partyName) + .collection("messages"); + const partyMessagesQuery = partyMessagesRef.orderBy("time").limit(200); + deleteCollection(partyMessagesQuery); + // DELETE USERS + const partyUsersRef = admin .firestore() - .collection('rooms') - .doc(roomId) - .collection('users') - .listDocuments() - .then((users) => users.forEach((user) => user.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room users) @ ${roomId}`, err); - }); - admin - .firestore() - .collection('rooms') - .doc(roomId) - .delete() - .catch((err) => { - console.error(`Failed to run auto clean up (delete room) @ ${roomId}`, err); - }); + .collection("rooms") + .doc(partyName) + .collection("messages"); + const partyUsersQuery = partyUsersRef.orderBy("time").limit(200); + deleteCollection(partyUsersQuery); + // DELETE PARTY DOC + admin.firestore().collection("rooms").doc(partyName).delete(); }; + +async function deleteCollection(query) { + const db = admin.firestore(); + return new Promise((resolve, reject) => { + deleteQueryBatch(db, query, resolve).catch(reject); + }); +} + +async function deleteQueryBatch(db, query, resolve) { + const snapshot = await query.get(); + const batchSize = snapshot.size; + if (batchSize === 0) { + resolve(); + return; + } + const batch = admin.firestore().batch(); + snapshot.docs.forEach((doc) => { + batch.delete(doc.ref); + }); + await batch.commit(); + process.nextTick(() => { + deleteQueryBatch(db, query, resolve); + }); +} diff --git a/functions/webhooks/scheduledCleanUp.js b/functions/webhooks/scheduledCleanUp.js index 1c3caa0..4c35878 100644 --- a/functions/webhooks/scheduledCleanUp.js +++ b/functions/webhooks/scheduledCleanUp.js @@ -1,5 +1,5 @@ -const admin = require('firebase-admin'); -const cleanUpRoom = require('./cleanUpRoom'); +const admin = require("firebase-admin"); +const cleanUpRoom = require("./cleanUpRoom"); const timeDiff = (ds1, ds2) => { const d1 = new Date(ds1); @@ -11,10 +11,10 @@ const timeDiff = (ds1, ds2) => { module.exports = async (req, res) => { const startedTime = new Date(); - res.status(200).send({message:'Started processing'}); + res.status(200).send({ message: "Started processing" }); const roomList = await admin .firestore() - .collection('rooms') + .collection("rooms") .listDocuments() .then((rL) => rL) .catch((err) => { @@ -34,7 +34,7 @@ module.exports = async (req, res) => { // LESS THAN 24 HOURS BUT NOT IN USE timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12 ) { - await cleanUpRoom(roomSnap.id); + cleanUpRoom(roomSnap.id); console.info(`Deleted room ${roomSnap.id} from auto cleanup`); } return;