The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
Rocket.Chat/server/startup/migrations/v123.js

101 lines
2.4 KiB

import { Meteor } from 'meteor/meteor';
import { Migrations } from '../../../app/migrations';
import { Messages, Rooms, LivechatPageVisited } from '../../../app/models';
let pageVisitedCollection;
let messageCollection;
let roomCollection;
const roomIdByToken = {};
const batchSize = 5000;
async function migrateHistory(total, current) {
console.log(`Livechat history migration ${ current }/${ total }`);
const items = await pageVisitedCollection.find({}).limit(batchSize).toArray();
const tokens = items.filter((item) => item.token && !roomIdByToken[item.token]).map((item) => item.token);
const rooms = await roomCollection.find({
'v.token': {
$in: tokens,
},
}, {
fields: {
'v.token': 1,
},
}).toArray();
rooms.forEach((room) => {
roomIdByToken[room.v.token] = room._id;
});
const actions = items.reduce((result, item) => {
const msg = {
t: 'livechat_navigation_history',
rid: roomIdByToken[item.token] || null, // prevent from being `undefined`
ts: item.ts,
msg: `${ item.page.title } - ${ item.page.location.href }`,
u: {
_id: 'rocket.cat',
username: 'rocket.cat',
},
groupable: false,
navigation: {
page: item.page,
token: item.token,
},
};
if (!roomIdByToken[item.token] && item.expireAt) {
msg.expireAt = item.expireAt;
}
result.insert.push(msg);
result.remove.push(item._id);
return result;
}, { insert: [], remove: [] });
const ops = [];
if (actions.insert.length > 0) {
ops.push(messageCollection.insertMany(actions.insert));
}
if (actions.remove.length > 0) {
ops.push(pageVisitedCollection.removeMany({ _id: { $in: actions.remove } }));
}
const batch = Promise.all(ops);
if (actions.remove.length === batchSize) {
await batch;
return migrateHistory(total, current + batchSize);
}
return batch;
}
Migrations.add({
version: 123,
up() {
pageVisitedCollection = LivechatPageVisited.model.rawCollection();
messageCollection = Messages.model.rawCollection();
roomCollection = Rooms.model.rawCollection();
/*
* Move visitor navigation history to messages
*/
Meteor.setTimeout(async () => {
const pages = pageVisitedCollection.find({});
const total = await pages.count();
await pages.close();
console.log('Migrating livechat visitors navigation history to livechat messages. This might take a long time ...');
await migrateHistory(total, 0);
console.log('Livechat visitors navigation history migration finished.');
}, 1000);
},
});