From d8027cf4a111a5758749ec49a4b58219da4aa204 Mon Sep 17 00:00:00 2001 From: Shobhan Sundar Goutam Date: Mon, 25 Nov 2024 03:26:40 +0530 Subject: [PATCH] batch db insertion --- controllers/users.js | 46 +++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/controllers/users.js b/controllers/users.js index 8dd8bcaa0..70ce82c0e 100644 --- a/controllers/users.js +++ b/controllers/users.js @@ -1,6 +1,9 @@ const chaincodeQuery = require("../models/chaincodes"); const userQuery = require("../models/users"); const profileDiffsQuery = require("../models/profileDiffs"); +const firestore = require("../utils/firestore"); +const memberRoleModel = firestore.collection("member-group-roles"); +const logsModel = firestore.collection("logs"); const admin = require("firebase-admin"); const logsQuery = require("../models/logs"); const imageService = require("../services/imageService"); @@ -31,7 +34,6 @@ const { addLog } = require("../models/logs"); const { getUserStatus } = require("../models/userStatus"); const config = require("config"); const { generateUniqueUsername } = require("../services/users"); -const { addGroupRoleToMember } = require("../models/discordactions"); const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); @@ -598,6 +600,7 @@ const markUnverified = async (req, res) => { const unverifiedRoleId = config.get("discordUnverifiedRoleId"); const usersToApplyUnverifiedRole = []; const addRolePromises = []; + const batchPromises = []; allRdsLoggedInUsers.forEach((user) => { rdsUserMap[user.discordId] = true; @@ -613,23 +616,40 @@ const markUnverified = async (req, res) => { } }); - usersToApplyUnverifiedRole.forEach((id) => { - addRolePromises.push( - addRoleToUser(id, unverifiedRoleId), - addGroupRoleToMember({ + const batchSize = 500; + const batches = Array.from({ length: Math.ceil(usersToApplyUnverifiedRole.length / batchSize) }, (_, index) => + usersToApplyUnverifiedRole.slice(index * batchSize, index * batchSize + batchSize) + ); + + batches.forEach((batch) => { + const firestoreBatch = firestore.batch(); + + batch.forEach((id) => { + const memberRoleRef = memberRoleModel.doc(id); + const logRef = logsModel.doc(); + + firestoreBatch.set(memberRoleRef, { roleid: unverifiedRoleId, userid: id, date: admin.firestore.Timestamp.fromDate(new Date()), - }), - addLog( - logType.ADD_UNVERIFIED_ROLE, - { roleid: unverifiedRoleId, userid: id }, - { message: "Unverified role added successfully" } - ) - ); + }); + + firestoreBatch.set(logRef, { + type: logType.ADD_UNVERIFIED_ROLE, + meta: { roleid: unverifiedRoleId, userid: id }, + body: { message: "Unverified role added successfully" }, + timestamp: admin.firestore.Timestamp.fromDate(new Date()), + }); + }); + + batchPromises.push(firestoreBatch.commit()); + }); + + usersToApplyUnverifiedRole.forEach((id) => { + addRolePromises.push(addRoleToUser(id, unverifiedRoleId)); }); - await Promise.all(addRolePromises); + await Promise.all([...addRolePromises, ...batchPromises]); return res.json({ message: "ROLES APPLIED SUCCESSFULLY" }); } catch (err) { logger.error(err);