2020-01-12 18:34:40 +00:00
|
|
|
import { inboxModel as Inbox, setUserStyles } from '../../models/message';
|
|
|
|
|
import { model as User } from '../../models/user';
|
|
|
|
|
|
|
|
|
|
/**
|
2020-03-04 16:50:08 +00:00
|
|
|
* Get the current user (avatar/setting etc) for conversations
|
2020-01-12 18:34:40 +00:00
|
|
|
* @param users
|
|
|
|
|
* @returns {Promise<void>}
|
|
|
|
|
*/
|
2020-03-04 16:50:08 +00:00
|
|
|
async function usersMapByConversations (users) {
|
2020-01-12 18:34:40 +00:00
|
|
|
const usersMap = {};
|
|
|
|
|
|
2020-03-04 16:50:08 +00:00
|
|
|
const usersQuery = {
|
|
|
|
|
_id: { $in: users },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const loadedUsers = await User.find(usersQuery, {
|
|
|
|
|
_id: 1,
|
|
|
|
|
contributor: 1,
|
|
|
|
|
backer: 1,
|
|
|
|
|
items: 1,
|
|
|
|
|
preferences: 1,
|
|
|
|
|
stats: 1,
|
|
|
|
|
flags: 1,
|
|
|
|
|
inbox: 1,
|
|
|
|
|
}).exec();
|
|
|
|
|
|
|
|
|
|
for (const usr of loadedUsers) {
|
|
|
|
|
const loadedUserConversation = {
|
|
|
|
|
_id: usr._id,
|
|
|
|
|
backer: usr.backer,
|
|
|
|
|
contributor: usr.contributor,
|
|
|
|
|
optOut: usr.inbox.optOut,
|
|
|
|
|
blocks: usr.inbox.blocks || [],
|
2020-01-12 18:34:40 +00:00
|
|
|
};
|
2020-03-04 16:50:08 +00:00
|
|
|
// map user values to conversation properties
|
|
|
|
|
setUserStyles(loadedUserConversation, usr);
|
2020-01-12 18:34:40 +00:00
|
|
|
|
2020-03-04 16:50:08 +00:00
|
|
|
usersMap[usr._id] = loadedUserConversation;
|
2020-01-12 18:34:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return usersMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function listConversations (owner) {
|
|
|
|
|
// group messages by user owned by logged-in user
|
|
|
|
|
const query = Inbox
|
|
|
|
|
.aggregate([
|
|
|
|
|
{
|
|
|
|
|
$match: {
|
|
|
|
|
ownerId: owner._id,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
$group: {
|
|
|
|
|
_id: '$uuid',
|
|
|
|
|
user: { $last: '$user' },
|
|
|
|
|
username: { $last: '$username' },
|
|
|
|
|
timestamp: { $last: '$timestamp' },
|
|
|
|
|
text: { $last: '$text' },
|
|
|
|
|
count: { $sum: 1 },
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{ $sort: { timestamp: -1 } }, // sort by latest message
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const conversationsList = await query.exec();
|
|
|
|
|
|
|
|
|
|
const userIdList = conversationsList.map(c => c._id);
|
|
|
|
|
|
|
|
|
|
// get user-info based on conversations
|
2020-03-04 16:50:08 +00:00
|
|
|
const usersMap = await usersMapByConversations(userIdList);
|
2020-01-12 18:34:40 +00:00
|
|
|
|
|
|
|
|
const conversations = conversationsList.map(res => {
|
|
|
|
|
const uuid = res._id;
|
|
|
|
|
|
|
|
|
|
const conversation = {
|
|
|
|
|
uuid,
|
|
|
|
|
...res,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (usersMap[uuid]) {
|
2020-03-04 16:50:08 +00:00
|
|
|
const user = usersMap[uuid];
|
|
|
|
|
|
|
|
|
|
conversation.userStyles = user.userStyles;
|
|
|
|
|
conversation.contributor = user.contributor;
|
|
|
|
|
conversation.backer = user.backer;
|
|
|
|
|
|
|
|
|
|
const isOwnerBlocked = user.blocks.includes(owner._id);
|
|
|
|
|
|
|
|
|
|
conversation.canReceive = !(user.optOut || isOwnerBlocked) || owner.isAdmin();
|
2020-01-12 18:34:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return conversation;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return conversations;
|
|
|
|
|
}
|