From e1abeeb78a2dea080082151cffc6371e224ec400 Mon Sep 17 00:00:00 2001 From: negue Date: Sun, 29 Sep 2019 18:45:46 +0200 Subject: [PATCH] load user info per conversation.id - 2nd try (#11374) * load user info per conversation.id * fix projection * load user data based on / from conversations * fix tests * remove unneeded properties of 2nd query --- website/server/libs/inbox/index.js | 39 ++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/website/server/libs/inbox/index.js b/website/server/libs/inbox/index.js index 44a773140d..fbc1b81ffe 100644 --- a/website/server/libs/inbox/index.js +++ b/website/server/libs/inbox/index.js @@ -74,7 +74,37 @@ export async function getUserInbox (user, options = {asArray: true, page: 0, con } } +async function usersMapByConversations (owner, users) { + let query = Inbox + .aggregate([ + { + $match: { + ownerId: owner._id, + uuid: { $in: users }, + }, + }, + { + $group: { + _id: '$uuid', + userStyles: {$last: '$userStyles'}, + contributor: {$last: '$contributor'}, + }, + }, + ]); + + + const usersAr = await query.exec(); + const usersMap = {}; + + for (const usr of usersAr) { + usersMap[usr._id] = usr; + } + + return usersMap; +} + export async function listConversations (owner) { + // group messages by user owned by logged-in user let query = Inbox .aggregate([ { @@ -89,8 +119,6 @@ export async function listConversations (owner) { username: {$last: '$username' }, timestamp: {$last: '$timestamp'}, text: {$last: '$text'}, - userStyles: {$last: '$userStyles'}, - contributor: {$last: '$contributor'}, count: {$sum: 1}, }, }, @@ -99,9 +127,16 @@ export async function listConversations (owner) { const conversationsList = await query.exec(); + const userIdList = conversationsList.map(c => c._id); + + // get user-info based on conversations + const usersMap = await usersMapByConversations(owner, userIdList); + const conversations = conversationsList.map((res) => ({ uuid: res._id, ...res, + userStyles: usersMap[res._id].userStyles, + contributor: usersMap[res._id].contributor, })); return conversations;