const admin = require("firebase-admin"); const firebase_tools = require("firebase-tools"); const timeDiff = (ds1, ds2) => { const d1 = new Date(ds1); const d2 = new Date(ds2); var diff = (d2.getTime() - d1.getTime()) / 1000; diff /= 60 * 60; return Math.abs(Math.round(diff)); }; const roomIdList = async (refs) => { const startedTime = new Date(); return await admin .firestore() .getAll(...refs) .then((roomDataList) => roomDataList.map((roomData) => { if ( !roomData.exists || (timeDiff(roomData.createTime.toDate(), startedTime) >= 24 && timeDiff(roomData.updateTime.toDate(), startedTime) >= 4) || timeDiff(roomData.updateTime.toDate(), startedTime) >= 12 ) { return roomData.id; } }) ) .then((ids) => ids.filter((v) => v !== undefined)); }; const batchDeleteRooms = async (roomList, totalNumber) => { setTimeout(async () => { if (roomList.length > 0) { await firebase_tools.firestore .delete(`rooms/${roomList.splice(0, 1)[0]}`, { project: process.env.GCLOUD_PROJECT, recursive: true, yes: true, }) .catch((err) => console.error( `[ERROR]\tWEBHOOKS/Room Clean Up\t# OF ROOMS ${roomList.length} REMAINING,\tERROR:${err}` ) ); console.info( `[DONE]\tWEBHOOKS/Room Clean Up\t# OF ROOMS ${ totalNumber - roomList.length }/${totalNumber}` ); batchDeleteRooms(roomList, totalNumber); } else { console.info( `[DONE]\tWEBHOOKS/Room Clean Up\tDeleted all ${totalNumber} rooms` ); } }, 1000); }; module.exports = async (req, res) => { res.status(200).send({ message: "Started processing" }); const roomList = await admin .firestore() .collection("rooms") .listDocuments() .then((rL) => rL) .catch((err) => { console.error( `Failed to run auto clean up (get room list) @ ${new Date().toLocaleTimeString()}`, err ); }); if (roomList.length > 0) { var ids = await roomIdList(roomList); if (ids.length > 0) { batchDeleteRooms(ids, ids.length); } } return; };