igo
Version:
Igo is a Node.js Web Framework based on Express
154 lines (130 loc) • 4.16 kB
JavaScript
const _ = require('lodash');
const fs = require('fs/promises');
const config = require('../src/config');
const dbs = require('../src/db/dbs');
const migrations = require('../src/db/migrations');
// db verbs
const verbs = {
// igo db migrate
migrate: async (args) => {
for (const database of config.databases) {
const db = dbs[database];
db.config.debugsql = false;
if (config.databases.length > 1) {
console.log(`database: ${db.config.database}`);
}
await migrations.migrate(db);
}
},
// igo db migrations
migrations: async (args) => {
for (const database of config.databases) {
const db = dbs[database];
db.config.debugsql = false;
if (config.databases.length > 1) {
console.log(`database: ${db.config.database}`);
}
let migrationsList = await migrations.list(db);
migrationsList = _.reverse(migrationsList);
migrationsList.forEach((migration) => {
console.log([
migration.id,
(migration.success ? '✅' : '❌'),
migration.file
].join(' '));
});
}
},
// igo db reset
reset: async (args) => {
if (config.databases.length > 1 && !args[2]) {
console.log(`Please select database to reset : igo db reset [${config.databases.join('|')}]`);
return;
}
if (args[2] && config.databases.indexOf(args[2]) < 0) {
console.log('ERROR: Wrong database name');
return;
}
const db = args[2] ? dbs[args[2]] : dbs.main;
const database = db.config.database;
console.log('WARNING: Database will be reset, data will be lost!');
console.log('Confirm the database name (' + database + '):');
await new Promise((resolve) => {
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', async (data) => {
const input = data.toString().trim();
if (input !== database) {
return resolve();
}
db.config.debugsql = false;
db.config.database = null;
await db.init();
const { dialect } = db.driver;
const DROP_DATABASE = dialect.dropDb(database);
const CREATE_DATABASE = dialect.createDb(database);
await db.query(DROP_DATABASE);
await db.query(CREATE_DATABASE);
db.config.database = database;
await db.init();
await migrations.migrate(db);
resolve();
});
});
},
reverse: async (args) => {
const db = dbs.main;
const tables = await db.query('show tables');
for (const table of tables) {
const tableName = _.values(table)[0];
if (tableName === '__db_migrations') {
// continue;
}
const object = _.capitalize(tableName.substring(0, tableName.length - 1));
const fields = await db.query(`explain ${tableName}`);
const primary = _.chain(fields).filter({ Key: 'PRI' }).map('Field').join('\', \'');
let lines = [
'',
'const { Model } = require(\'igo\');',
'',
'const schema = {',
' table: \'' + tableName + '\',',
' primary: [ \'' + primary + '\' ],',
' columns: ['
];
fields.forEach((field) => {
lines.push(` '${field.Field}',`);
});
lines = lines.concat([
' ],',
' associations: () => [',
' ], ',
' scopes: {',
' }',
'};',
'', '',
`class ${object} extends Model(schema) {`,
'}',
'', '',
`module.exports = ${object};`
]);
const file = `./app/models/${object}.js`;
console.log('wrote ' + file);
await fs.writeFile(file, lines.join('\n'));
}
}
};
// igo db
module.exports = async (argv) => {
const args = argv._;
config.init();
await dbs.init();
if (args.length > 1 && verbs[args[1]]) {
await verbs[args[1]](args)
console.log('Done.');
process.exit(0);
} else {
console.error('ERROR: Wrong options');
console.error('Usage: igo db [migrate|migrations|reverse|reset]');
}
};