evolution-manager/lib/api/migrateToMongo/index.js
2023-12-20 00:11:51 -03:00

146 lines
4.2 KiB
JavaScript

const verifyEvolutionInstallation = require('../../utils/verifyEvolutionInstallation.js');
const cliProgress = require('cli-progress');
const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');
const colors = require('ansi-colors');
const mongoose = require('mongoose');
const migratorsFunctions = {
INSTANCE: require('./migrators/instance.js'),
CONTACTS: require('./migrators/contacts.js'),
NEW_MESSAGE: require('./migrators/newMessage.js'),
MESSAGE_UPDATE: require('./migrators/messageUpdate.js'),
CHATS: require('./migrators/chats.js'),
};
module.exports = async () => {
const isEvolutionInstalled = verifyEvolutionInstallation();
if (!isEvolutionInstalled) return;
const instancesNames = fs.readdirSync(path.join(process.cwd(), 'instances')).filter((file) => {
return fs.statSync(path.join(process.cwd(), 'instances', file)).isDirectory();
});
const questions = [
{
type: 'input',
name: 'mongodbUrl',
message: 'MongoDB url:',
default: 'mongodb://admin:password@localhost:27017',
},
{
type: 'input',
name: 'prefix',
message: 'MongoDB prefix:',
default: 'evolution',
},
{
type: 'checkbox',
name: 'saveData',
message: 'What data do you want to migrate?',
choices: [
{
name: 'Instance',
value: 'INSTANCE',
checked: true,
},
{
name: 'New Message',
value: 'NEW_MESSAGE',
checked: true,
},
{
name: 'Message Update',
value: 'MESSAGE_UPDATE',
checked: true,
},
{
name: 'Contacts',
value: 'CONTACTS',
checked: true,
},
{
name: 'Chats',
value: 'CHATS',
checked: true,
},
],
},
{
type: 'checkbox',
name: 'selectedInstances',
message: 'Select instances to migrate:',
choices: instancesNames.map((instanceName) => {
return {
name: instanceName,
value: instanceName,
checked: true,
}
}),
}
];
const answers = await inquirer.prompt(questions);
// check if there is any data to migrate
if (answers.saveData.length === 0) {
console.log('🌱 No data selected to migrate!\n\n');
process.exit(0);
}
if (answers.selectedInstances.length === 0) {
console.log('🌱 No instances selected to migrate!\n\n');
process.exit(0);
}
// connect to mongodb
console.log('\n\n🌱 Connecting to MongoDB...');
const conn = await mongoose.createConnection(answers.mongodbUrl, {
dbName: answers.prefix + '-whatsapp-api',
}).asPromise();
const connInstance = answers.saveData.includes('INSTANCE') ? await mongoose.createConnection(answers.mongodbUrl, {
dbName: answers.prefix + '-instances',
}).asPromise() : null;
console.log('🌱 Connected to MongoDB!\n\n');
const instancesBar = new cliProgress.SingleBar({
format: 'Instance: ' + colors.blue('{instanceName}') + ' |' + colors.cyan('{bar}') + '| {percentage}% || {value}/{total} Instances',
}, cliProgress.Presets.shades_classic);
instancesBar.start(answers.selectedInstances.length, 0);
try {
for (const instanceName of answers.selectedInstances) {
instancesBar.update({ instanceName });
const instanceBars = new cliProgress.MultiBar({
format: '|' + colors.cyan('{bar}') + '| ' + colors.blue('{process}') + ' | {percentage}% || {value}/{total} Files',
clearOnComplete: true,
}, cliProgress.Presets.shades_classic);
for (const migration of answers.saveData) {
await migratorsFunctions[migration](instanceName, answers, instanceBars, conn, connInstance);
}
instanceBars.stop();
instancesBar.increment();
}
} catch (err) {
instancesBar.stop();
console.log(err.file);
console.log(err.err);
process.exit(1);
}
instancesBar.stop();
// disconnect from mongodb
console.log('\n\n🌱 Disconnecting from MongoDB...');
await conn.close();
if (connInstance) await connInstance.close();
console.log('🌱 Disconnected from MongoDB!\n\n');
console.log('🌱 Migration completed!\n\n');
process.exit(0);
};