UNPKG

igo

Version:

Igo is a Node.js Web Framework based on Express

154 lines (130 loc) 4.16 kB
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]'); } };