/* eslint camelcase: "off" */ 'use strict'; const async = require('async'); exports.up = function (db, callback) { const populateNewData = (cb) => { db.all('select name, parameters_template from strategies', (err, results) => { const updateSQL = results .map(({ name, parameters_template }) => { const parameters = []; Object.keys(parameters_template || {}).forEach(p => { parameters.push({ name: p, type: parameters_template[p], description: '', required: false }); }); return { name, parameters }; }) .map(strategy => ` UPDATE strategies SET parameters='${JSON.stringify(strategy.parameters)}' WHERE name='${strategy.name}';`) .join('\n'); db.runSql(updateSQL, cb); }); }; async.series([ db.addColumn.bind(db, 'strategies', 'parameters', { type: 'json' }), populateNewData.bind(db), db.removeColumn.bind(db, 'strategies', 'parameters_template'), ], callback); }; exports.down = function (db, callback) { const populateOldData = (cb) => { db.all('select name, parameters from strategies', (err, results) => { const updateSQL = results .map(({ name, parameters }) => { const parameters_template = {}; parameters.forEach(p => { parameters_template[p.name] = p.type; }); return { name, parameters_template }; }) .map(strategy => ` UPDATE strategies SET parameters_template='${JSON.stringify(strategy.parameters_template)}' WHERE name='${strategy.name}';`) .join('\n'); db.runSql(updateSQL, cb); }); }; async.series([ db.addColumn.bind(db, 'strategies', 'parameters_template', { type: 'json' }), populateOldData.bind(db), db.removeColumn.bind(db, 'strategies', 'parameters'), ], callback); };