/* 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 ); };