lila/bin/mongodb/msg_import.js

91 lines
2.3 KiB
JavaScript

db.msg_msg.drop();
db.msg_thread.drop();
function makeIndexes() {
db.msg_thread.ensureIndex({ users: 1, 'lastMsg.date': -1 }, { background: 1 });
db.msg_thread.ensureIndex({ users: 1 }, { partialFilterExpression: { 'lastMsg.read': false }, background: 1 });
db.msg_msg.ensureIndex({ tid: 1, date: -1 }, { background: 1 });
}
const now = Date.now();
print('Delete old notifications');
db.notify.remove({ 'content.type': 'privateMessage' });
if (!db.m_thread_sorted.count()) {
print('Create db.m_thread_sorted');
db.m_thread_sorted.drop();
db.m_thread
.find({
mod: { $exists: false },
visibleByUserIds: { $size: 2 },
$or: [
{
creatorId: {
$nin: ['lichess', 'lichess-qa', 'lichess-blog', 'lichess-team', 'mirlife', 'lichess4545', 'whatnext'],
},
},
{
updatedAt: { $gt: new Date(Date.now() - 1000 * 3600 * 24 * 14) },
},
],
})
.forEach(t => {
if (t.creatorId == t.invitedId) return;
t.visibleByUserIds.sort();
db.m_thread_sorted.insert(t);
});
}
print('Create db.msg_thread');
db.m_thread_sorted
.aggregate([{ $group: { _id: '$visibleByUserIds', threads: { $push: '$$ROOT' } } }], { allowDiskUse: true })
.forEach(o => {
let userIds = o.threads[0].visibleByUserIds;
userIds.sort();
let threadId = userIds.join('/');
let msgs = [];
o.threads.forEach(t => {
t.posts.forEach(p => {
if (o.creatorId == 'lichess' && isOld(p.createdAt)) return;
msgs.push({
_id: p.id,
tid: threadId,
text: p.text,
user: p.isByCreator ? t.creatorId : t.invitedId,
date: p.createdAt,
});
});
});
if (!msgs.length) return;
msgs.sort((a, b) => new Date(a.date) - new Date(b.date));
let last = msgs[msgs.length - 1];
let thread = {
_id: threadId,
users: userIds,
lastMsg: {
text: last.text.slice(0, 60),
user: last.user,
date: last.date,
read: !o.threads.find(t => t.posts.find(p => p.isRead)) || isOld(last.date),
},
};
db.msg_msg.insertMany(msgs, { ordered: false });
try {
db.msg_thread.insert(thread);
} catch (e) {}
});
makeIndexes();
function isOld(date) {
return now - date > 1000 * 3600 * 24 * 7;
}