database migration

This commit is contained in:
jysperm
2014-10-31 21:26:15 +08:00
parent 8054615a2d
commit b3f3429250
7 changed files with 126 additions and 83 deletions

View File

@@ -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'

View File

@@ -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

View File

@@ -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

61
migration/migrate.coffee Normal file
View File

@@ -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

View File

@@ -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

View File

View File

@@ -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",