diff --git a/models/discordactions.js b/models/discordactions.js index cc578d11f..d71029109 100644 --- a/models/discordactions.js +++ b/models/discordactions.js @@ -311,12 +311,40 @@ const enrichGroupDataWithMembershipInfo = async (discordId, groups = []) => { const groupCreatorsDetails = await retrieveUsers({ userIds: Array.from(groupCreatorIds) }); const roleIds = groups.map((group) => group.roleid); const groupsToUserMappings = await fetchGroupToUserMapping(roleIds); - const roleIdToCountMap = {}; - groupsToUserMappings.forEach((groupToUserMapping) => { - // Count how many times roleId comes up in the array. - // This says how many users we have for a given roleId - roleIdToCountMap[groupToUserMapping.roleid] = (roleIdToCountMap[groupToUserMapping.roleid] ?? 0) + 1; + const uniqueDiscordIds = Array.from( + new Set( + groupsToUserMappings + .map((mapping) => mapping.userid) + .filter((id) => id !== undefined && id !== null) + .map((id) => String(id)) + ) + ); + const discordIdChunks = []; + for (let i = 0; i < uniqueDiscordIds.length; i += BATCH_SIZE_IN_CLAUSE) { + discordIdChunks.push(uniqueDiscordIds.slice(i, i + BATCH_SIZE_IN_CLAUSE)); + } + + const usersSnapshots = await Promise.all( + discordIdChunks.map(async (chunk) => { + const snap = await userModel.where("discordId", "in", chunk).get(); + return snap.docs.map((doc) => doc.data()); + }) + ); + + const usersInDiscordSet = new Set(); + + usersSnapshots.forEach((userList) => { + userList.forEach((user) => { + if (Boolean(user?.roles?.in_discord) === true) usersInDiscordSet.add(user.discordId); + }); + }); + + const roleIdToCountMap = {}; + groupsToUserMappings.forEach((mapping) => { + if (usersInDiscordSet.has(String(mapping.userid))) { + roleIdToCountMap[mapping.roleid] = (roleIdToCountMap[mapping.roleid] ?? 0) + 1; + } }); const subscribedGroupIds = findSubscribedGroupIds(discordId, groupsToUserMappings); @@ -328,8 +356,8 @@ const enrichGroupDataWithMembershipInfo = async (discordId, groups = []) => { firstName: groupCreator?.first_name, lastName: groupCreator?.last_name, image: groupCreator?.picture?.url, - memberCount: roleIdToCountMap[group.roleid] || 0, // Number of users joined this group - isMember: subscribedGroupIds.has(group.roleid), // Is current loggedIn user is a member of this group + memberCount: roleIdToCountMap[group.roleid] ?? 0, + isMember: Boolean(subscribedGroupIds?.has(group.roleid)), }; }); } catch (err) { diff --git a/test/unit/models/discordactions.test.js b/test/unit/models/discordactions.test.js index 2cb1def6b..ba5ea0c59 100644 --- a/test/unit/models/discordactions.test.js +++ b/test/unit/models/discordactions.test.js @@ -477,7 +477,7 @@ describe("discordactions", function () { const result = await enrichGroupDataWithMembershipInfo(userData[0].discordId, newGroupData); expect(result[0]).to.deep.equal({ ...newGroupData[0], - memberCount: 2, + memberCount: 1, firstName: userData[0].first_name, lastName: userData[0].last_name, image: userData[0].picture.url, diff --git a/utils/helper.js b/utils/helper.js index b0ab267d0..9587fa71b 100644 --- a/utils/helper.js +++ b/utils/helper.js @@ -80,7 +80,7 @@ function findSubscribedGroupIds(discordId, groupToUserMappings = []) { // Iterate through groupToUserMappings to find subscribed group IDs groupToUserMappings.forEach((group) => { - if (group.userid === discordId) { + if (String(group.userid) === String(discordId)) { subscribedGroupIds.add(group.roleid); } });