const admin = require("firebase-admin"); 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 cleanUser = async (pT, sT) => { var usersToDelete = []; await admin .auth() .listUsers(1000, pT) .then(async (listUsersResult) => { listUsersResult.users.forEach((userRecord) => { if ( userRecord.uid !== "PTjxbs2rAxMvCD6Pj5P6Z2U6d5A3" && timeDiff(userRecord.metadata.lastRefreshTime, sT) >= 24 ) { usersToDelete.push(userRecord.uid); } }); if (listUsersResult.pageToken) { const uD = await cleanUser(listUsersResult.pageToken, sT); usersToDelete.push(...uD); } return; }) .catch((error) => { console.log("Error listing users:", error); }); return usersToDelete; }; const batchDeleteUser = async (userList, totalNumber) => { setTimeout(async () => { const uTDSplice = userList.splice(0, 100); if (uTDSplice.length > 0) { await admin .auth() .deleteUsers(uTDSplice) .catch((err) => console.error( `[ERROR]\tWEBHOOKS/User Clean Up\t# OF USERS ${userList.length} REMAINING,\tERROR:${err}` ) ); console.info( `[DONE]\tWEBHOOKS/User Clean Up\t# OF USERS ${uTDSplice.length}/${userList.length}` ); batchDeleteUser(userList, totalNumber); } else { console.info( `[DONE]\tWEBHOOKS/User Clean Up\tDeleted all ${totalNumber} stale users` ); } }, 3000); }; module.exports = async (req, res) => { console.info(`[START]\tWEBHOOKS/User Clean Up`); res.status(200).send({ message: "User Clean Up Started" }); const startedTime = new Date(); const usersToDelete = await cleanUser(undefined, startedTime); console.info( `[PROGRESS]\tWEBHOOKS/User Clean Up\t# OF USERS ${usersToDelete.length}` ); batchDeleteUser(usersToDelete, usersToDelete.length); };