diff --git a/bin/rp-migration.coffee b/bin/rp-migration.coffee deleted file mode 100644 index 32a32ce..0000000 --- a/bin/rp-migration.coffee +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env coffee - -_ = require 'underscore' -async = require 'async' -{MongoClient} = require 'mongodb' - -config = require '../config' -{user, password, host, name} = config.mongodb -mongodb_uri = "mongodb://#{user}:#{password}@#{host}/#{name}" - -version = _.last process.argv - -migration_action = - '0.7.1': (callback) -> - ### - npm install coffee-script -g - - vi /etc/rc.local - - iptables-restore < /etc/iptables.rules - - vi /etc/supervisor/conf.d/rpadmin.conf - - [program:RootPanel] - command=node /home/rpadmin/RootPanel/start.js - autorestart=true - user=rpadmin - - service supervisor restart - ### - - crypto = require 'crypto' - bitcoin = require '../core/bitcoin' - - MongoClient.connect mongodb_uri, (err, db) -> - mAccount = db.collection 'accounts' - - mAccount.find().toArray (err, accounts) -> - async.each accounts, (account, callback) -> - bitcoin_secret = crypto.createHash('sha256').update(crypto.randomBytes(256)).digest('hex') - - bitcoin.genAddress bitcoin_secret, (address) -> - mAccount.update {_id: account._id}, - $set: - 'attribute.bitcoin_deposit_address': address - 'bitcoin_secret': bitcoin_secret - , (err) -> - callback err - - , (err) -> - throw err if err - console.log "[account.attribute.bitcoin_secret] update #{accounts.length} rows" - callback() - - '0.6.0': (callback) -> - MongoClient.connect mongodb_uri, (err, db) -> - mAccount = db.collection 'accounts' - - async.parallel [ - (callback) -> - mAccount.update - 'tokens.available': - $exists: true - , - $unset: - 'tokens.$.available': true - , - multi: true - , (err, rows) -> - console.log "[accounts.tokens.available] update #{rows} rows" - callback err - ], (err) -> - throw err if err - callback() - -if migration_action[version] - migration_action[version] -> - console.log "Finish migration to #{version}" - process.exit() -else - throw new Error 'Unknown Version' diff --git a/migration/database/v0.6.0.coffee b/migration/database/v0.6.0.coffee new file mode 100644 index 0000000..c0e18b1 --- /dev/null +++ b/migration/database/v0.6.0.coffee @@ -0,0 +1,14 @@ +module.exports = (db, callback) -> + cAccount = db.collection 'accounts' + + cAccount.update + 'tokens.available': + $exists: true + , + $unset: + 'tokens.$.available': true + , + multi: true + , (err, rows) -> + console.log "[accounts.tokens.available] update #{rows} rows" + callback err diff --git a/migration/database/v0.7.1.coffee b/migration/database/v0.7.1.coffee new file mode 100644 index 0000000..e0d7373 --- /dev/null +++ b/migration/database/v0.7.1.coffee @@ -0,0 +1,34 @@ +async = require 'async' +crypto = require 'crypto' +request = require 'request' + +config = require '../../config' + +genAddress = (bitcoin_secret, callback) -> + request 'https://coinbase.com/api/v1/account/generate_receive_address', + method: 'POST' + json: + api_key: config.plugins.bitcoin.coinbase_api_key + address: + callback_url: "#{config.web.url}/bitcoin/coinbase_callback?secret=#{bitcoin_secret}" + , (err, res, body) -> + throw err if err + callback body.address + +module.exports = (db, callback) -> + cAccount = db.collection 'accounts' + + cAccount.find().toArray (err, accounts) -> + async.each accounts, (account, callback) -> + bitcoin_secret = crypto.createHash('sha256').update(crypto.randomBytes(256)).digest('hex') + + genAddress bitcoin_secret, (address) -> + mAccount.update {_id: account._id}, + $set: + 'attribute.bitcoin_deposit_address': address + 'bitcoin_secret': bitcoin_secret + , callback + + , (err) -> + console.log "[account.attribute.bitcoin_secret] update #{accounts.length} rows" + callback err diff --git a/migration/migrate.coffee b/migration/migrate.coffee new file mode 100644 index 0000000..306f36a --- /dev/null +++ b/migration/migrate.coffee @@ -0,0 +1,61 @@ +#!/usr/bin/env coffee + +{MongoClient} = require 'mongodb' +semver = require 'semver' +async = require 'async' +path = require 'path' +fs = require 'fs' +_ = require 'underscore' + +config = require '../config' + +{user, password, host, name} = config.mongodb +mongodb_uri = "mongodb://#{user}:#{password}@#{host}/#{name}" + +MongoClient.connect mongodb_uri, (err, db) -> + throw err if err + + migrations = _.map fs.readdirSync("#{__dirname}/database"), (filename) -> + return filename.match(/v(\d+\.\d+\.\d+)\.coffee/)[1] + + migrations.sort (a, b) -> + if semver.gt a, b + return 1 + + if semver.lt a, b + return -1 + + return 0 + + db.collection('options').findOne + key: 'db_version' + , (err, result) -> + latest_version = require('../package.json').version + current_version = result?.version ? latest_version + + async.eachSeries migrations, (migration, callback) -> + if semver.gt(migration, current_version) and semver.lte(migration, latest_version) + console.log "Running migration #{migration}..." + + require("#{__dirname}/database/v#{migration}.coffee") db, (err) -> + return callback err if err + + db.collection('options').update + key: 'db_version' + , + key: 'db_version' + version: migration + , + upsert: true + , (err) -> + callback err + + else + callback() + + , (err) -> + if err + throw err + else + console.log 'Migration Finish' + process.exit 0 diff --git a/migration/system/v0.7.1.md b/migration/system/v0.7.1.md new file mode 100644 index 0000000..53ba648 --- /dev/null +++ b/migration/system/v0.7.1.md @@ -0,0 +1,14 @@ +npm install coffee-script -g + +vi /etc/rc.local + + iptables-restore < /etc/iptables.rules + +vi /etc/supervisor/conf.d/rpadmin.conf + + [program:RootPanel] + command=node /home/rpadmin/RootPanel/start.js + autorestart=true + user=rpadmin + +service supervisor restart diff --git a/migration/system/v0.8.0.md b/migration/system/v0.8.0.md new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index 175242a..29bcd3a 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ ], "scripts": { "start": "./node_modules/.bin/coffee app.coffee", + "migrate": "./node_modules/.bin/coffee migration/migrate.coffee", "test": "COV_TEST=true ./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env --reporter test/support/reporter-cov-summary.js -- core/test/*.test.coffee core/test/*/*.test.coffee plugin/*/test", "test-only": "./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env -- core/test/*.test.coffee core/test/*/*.test.coffee plugin/*/test", "test-cov-html": "COV_TEST=true ./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env --reporter html-cov -- core/test/*.test.coffee core/test/*/*.test.coffee plugin/*/test > coverage-reporter.html" @@ -24,7 +25,6 @@ "bin": { "rp-fix-permissions": "./bin/rp-fix-permissions.coffee", "rp-system-sync": "./bin/rp-system-sync.coffee", - "rp-migration": "./bin/rp-migration.coffee", "rp-clean": "./bin/rp-clean.coffee" }, "dependencies": { @@ -56,7 +56,8 @@ "redis": "^0.12.1", "request": "^2.45.0", "tmp": "^0.0.24", - "underscore": "^1.6.0" + "underscore": "^1.6.0", + "semver": "^4.1.0" }, "devDependencies": { "mocha": "^2.0.0",