2015-08-13 10:25:25 -07:00
// Update existing prepaids to v2
// Usage:
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
//
// - Add 'redeemers' property (redeemed date set to prepaid creation date)
// - Add 'maxRedeemers' property
// - Remove 'status' property
// - Remove 'redeemer' property
var host = db . getMongo ( ) . host ;
if ( host === 'localhost' || host === '127.0.0.1' ) {
insertTestData ( ) ;
}
migratePrepaidsToV2 ( ) ;
function migratePrepaidsToV2 ( ) {
print ( "Migrating prepaids to V2..." ) ;
var cursor = db . prepaids . find ( { 'status' : { $exists : true } } ) ;
print ( "V1 prepaids found: " + cursor . count ( ) ) ;
while ( cursor . hasNext ( ) ) {
var doc = cursor . next ( ) ;
var conditions = { _id : doc . _id } ;
var operations = {
$set : {
maxRedeemers : NumberInt ( 1 )
} ,
$unset : {
status : "" ,
redeemer : ""
}
} ;
2015-08-13 11:13:15 -07:00
if ( doc . redeemer && ( ! doc . redeemers || doc . redeemers . length < 1 ) ) {
2015-08-13 10:25:25 -07:00
operations . $set . redeemers = [ { userID : doc . redeemer , date : doc . _id . getTimestamp ( ) } ]
}
// printjson(conditions);
// printjson(operations);
var writeResult = db . prepaids . update ( conditions , operations ) ;
// printjson(writeResult)
}
cursor = db . prepaids . find ( { 'status' : { $exists : true } } ) ;
if ( cursor . count ( ) ) {
print ( "Error: still have prepaids with status property: " + cursor . count ( ) ) ;
}
else {
print ( "Done." ) ;
}
}
function insertTestData ( ) {
var host = db . getMongo ( ) . host ;
if ( host !== 'localhost' && host !== '127.0.0.1' ) {
print ( "Do NOT insert test data on a non-local mongo instance!" ) ;
return ;
}
for ( var i = 0 ; i < 10 ; i ++ ) {
createPrepaid ( ) ;
}
}
// Copied from createBulkPrepaids.js and updated to V1 schema
function createPrepaid ( )
{
print ( "Inserting prepaid:" ) ;
generateNewCode ( function ( code ) {
if ( ! code ) {
print ( "ERROR: no code" ) ;
return ;
}
var criteria = {
creator : ObjectId ( '512ef4805a67a8c507000001' ) ,
type : 'subscription' ,
status : 'active' ,
code : code ,
properties : {
couponID : 'free'
} ,
_ _v : 0
} ;
if ( Math . random ( ) > 0.5 ) {
criteria . redeemer = ObjectId ( '52f94443fcb334581466a992' ) ;
criteria . status = 'used' ;
}
printjson ( criteria ) ;
var writeResult = db . prepaids . insert ( criteria ) ;
printjson ( writeResult ) ;
} ) ;
}
function generateNewCode ( done )
{
function tryCode ( ) {
code = createCode ( 8 ) ;
criteria = { code : code } ;
if ( db . prepaids . findOne ( criteria ) ) {
return tryCode ( ) ;
}
return done ( code ) ;
}
tryCode ( ) ;
}
function createCode ( length )
{
var text = "" ;
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
for ( var i = 0 ; i < length ; i ++ )
text += possible . charAt ( Math . floor ( Math . random ( ) * possible . length ) ) ;
return text ;
}