igo
Version:
Igo is a Node.js Web Framework based on Express
131 lines (113 loc) • 3.58 kB
JavaScript
const _ = require('lodash');
const async = require('async');
const fs = require('fs');
const config = require('../src/config');
const db = require('../src/db/db');
const plugins = require('../src/plugins');
// db verbs
const verbs = {
// igo db migrate
migrate: function(args, callback) {
config.mysql.debugsql = false;
db.migrate(callback);
},
// igo db migrations
migrations: function(args, callback) {
config.mysql.debugsql = false;
db.migrations(function(err, migrations) {
migrations = _.reverse(migrations);
_.each(migrations, function(migration) {
console.log([
migration.id,
(migration.success ? 'OK' : 'KO'),
migration.file
].join(' '));
});
callback(err);
});
},
// igo db reset
reset: function(args, callback) {
const stdin = process.openStdin();
const database = config.mysql.database;
console.log('WARNING: Database will be reset, data will be lost!');
console.log('Confirm the database name (' + config.mysql.database + '):');
stdin.addListener('data', function(d) {
d = d.toString().trim();
if (d !== database) {
return callback('Cancelled.');
}
const DROP_DATABASE = 'DROP DATABASE IF EXISTS `' + database + '`;';
const CREATE_DATABASE = 'CREATE DATABASE `' + database + '`;';
config.mysql.debugsql = false;
config.mysql.database = null;
db.init();
db.query(DROP_DATABASE, function() {
db.query(CREATE_DATABASE, function() {
config.mysql.database = database;
db.init();
db.migrate(function() {
callback();
});
});
});
});
},
reverse: function(args, callback) {
db.query('show tables', function(err, tables) {
async.eachSeries(tables, function(table, callback) {
table = _.values(table)[0];
if (table === '__db_migrations') {
return callback();
}
const object = _.capitalize(table.substring(0, table.length - 1));
db.query(`explain ${table}`, function(err, fields) {
const primary = _.chain(fields).filter({ Key: 'PRI' }).map('Field').join('\', \'');
let lines = [
'',
'const Model = require(\'igo\').Model;',
'',
'const schema = {',
' table: \'' + table + '\',',
' primary: [ \'' + primary + '\' ],',
' columns: ['
];
fields.forEach(function(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);
fs.writeFile(file, lines.join('\n'), callback);
});
}, callback);
});
}
};
// igo db
module.exports = function(argv) {
var args = argv._;
config.init();
db.init();
plugins.init();
if (args.length > 1 && verbs[args[1]]) {
verbs[args[1]](args, function(err) {
console.log(err || 'Done.');
process.exit(0);
});
} else {
console.error('ERROR: Wrong options');
console.error('Usage: igo db [migrate|migrations|reverse|reset]')
}
};