clever-roles
Version:
Adds permissions and roles to users with CleverStack
351 lines (288 loc) • 10.9 kB
JavaScript
var Promise = require('bluebird')
, spawn = require('child_process').spawn
, path = require('path')
, fs = require('fs')
, rimraf = require('rimraf')
, ncp = require('ncp').ncp
, prName = 'testProject'
, step = 0;
function createProject() {
step++;
return new Promise(function(resolve, reject) {
var proc = spawn('clever', [ 'init', '-f', '-A', prName, 'backend' ]);
console.log('step #' + step + ' - create test project - begin');
proc.stdout.on('data', function (data) {
var str = data.toString();
if (str.match(/ing/) !== null) {
console.log(str);
}
});
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString());
reject(data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code);
resolve();
});
});
}
function cleverSetup() {
return new Promise(function(resolve, reject) {
var proc = spawn ('clever', [ 'setup' ], { cwd: path.resolve(path.join(__dirname, '..', prName)) });
console.log('step #' + step + ' - clever setup');
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString() + '\n');
reject (data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code + '\n');
resolve();
});
});
}
function installTestModule() {
step++;
return new Promise(function(resolve, reject) {
var source = path.resolve(path.join(__dirname, '../', prName, 'tests', 'unit', 'test-module'))
, dest = path.resolve(path.join(__dirname, '../', prName, 'modules', 'test-module'));
console.log('step #' + step + ' - install test-module - begin');
rimraf(dest, function(e) {
if (e === null) {
ncp(source, dest, function(err) {
if (err !== null) {
console.log('Error in step #' + step + ' - ' + err);
reject(e);
} else {
console.log('step #' + step + ' - completed');
resolve();
}
});
} else {
console.log('Error in step #' + step + ' - ' + e);
reject();
}
});
});
}
function installORM() {
step++;
return new Promise(function(resolve, reject) {
var objs = [
{ reg: /What environment is this configuration for\?/, write: '\n', done: false },
{ reg: /Database username/ , write: 'travis\n' , done: false },
{ reg: /Database password/ , write: '\n' , done: false },
{ reg: /Database name/ , write: 'test_db\n' , done: false },
{ reg: /Database dialect/ , write: 'mysql\n' , done: false },
{ reg: /Database host/ , write: '127.0.0.1\n', done: false },
{ reg: /Database port/ , write: '3306\n' , done: false }
]
, proc = spawn ('clever', [ 'install', 'clever-orm' ], { cwd: path.join(__dirname, '../', prName) });
console.log('step #' + step + ' - install clever-orm module - begin');
proc.stdout.on('data', function (data) {
var str = data.toString();
if (str.match(/ing/) !== null) {
console.log(str);
}
objs.forEach (function (obj, i) {
if (obj.done !== true && str.match(obj.reg) !== null) {
objs[i].done = true;
proc.stdin.write(obj.write);
}
});
});
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString() + '\n');
reject (data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code);
resolve();
});
});
}
function copyRolesModule() {
return new Promise(function(resolve, reject) {
var fromDir = path.join(__dirname, '../')
, toDir = path.join(__dirname, '../', prName, 'modules', 'clever-roles');
console.log('step #' + step + ' - copy clever-roles module in test project - begin\n');
function copyDir(from, to) {
var files = fs.readdirSync(from);
if (!fs.existsSync(to)) {
fs.mkdir(to, function (err) {
if (err) {
console.log('error - ' + err);
}
});
}
files.forEach(function (file) {
fs.stat(path.join(from, file), function (err, stats) {
if (err) {
console.log('Error in step #' + step + ' - ' + err + '\n');
reject (err);
}
if (stats && stats.isFile()) {
copyFile (path.join(from, file), path.join(to, file));
}
if (stats && stats.isDirectory() && file !== prName) {
ncp(path.join(from, file), path.join(to, file), function (err) {
if (err) {
console.log('Error in step #' + step + ' - ' + err + '\n');
reject (err);
}
});
}
});
});
}
function copyFile(from, to) {
var rs = fs.createReadStream(from)
, ws = fs.createWriteStream(to);
rs.on('error', function(err) {
console.log(err);
});
ws.on('error', function(err) {
console.log(err);
});
rs.pipe(ws);
}
copyDir(fromDir, toDir);
console.log('step #' + step + ' - completed');
resolve();
});
}
function installUsersModule() {
step++;
return new Promise(function(resolve, reject) {
var objs = [
{ reg: /Default Username\: \(default\)/, write: '\n', done: false },
{ reg: /Default Users Password\: /, write: '\n', done: false },
{ reg: /Overwrite existing user with the same username\? \(Y\/n\)/, write: '\n', done: false },
{ reg: /Default Users Email\: \(default@cleverstack.io\)/, write: '\n', done: false },
{ reg: /Default Users Firstname\: \(Clever\)/, write: '\n', done: false },
{ reg: /Default Users Lastname\: \(User\)/, write: '\n', done: false },
{ reg: /Default Users Phone Number\:/, write: '\n', done: false },
{ reg: /Default User has admin rights\: \(Y\/n\)/, write: '\n', done: false },
{ reg: /Default User has confirmed their email\: \(Y\/n\)/, write: '\n', done: false },
{ reg: /Default User has an active account\: \(Y\/n\)/, write: '\n', done: false }
]
, proc = spawn('clever', [ 'install', 'clever-users' ], { cwd: path.join(__dirname, '../', prName) });
console.log('step #' + step + ' - install clever-users module - begin\n');
proc.stdout.on('data', function (data) {
var str = data.toString();
if (str.match(/ing/) !== null) {
console.log(str);
}
objs.forEach (function (obj, i) {
if (obj.done !== true && str.match(obj.reg) !== null) {
objs[i].done = true;
proc.stdin.write(obj.write);
}
});
});
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString() + '\n');
reject (data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code + '\n');
resolve();
});
});
}
function installAuthModule() {
step++;
return new Promise(function(resolve, reject) {
var objs = [
{ reg: /Overwrite existing user with the same username\?/, write: '\n', done: false },
{ reg: /What environment is this configuration for\?/, write: '\n', done: false },
{ reg: /Secret key used to secure your passport sessions/, write: '\n', done: false },
{ reg: /What database driver module to use\: \(Use arrow keys\)/, write: '\n', done: false },
{ reg: /Session Storage Driver\: \(Use arrow keys\)/, write: '\n', done: false },
{ reg: /Redis host\: \(localhost\)/, write: '\n', done: false },
{ reg: /Redis port\: \(6379\)/, write: '\n', done: false },
{ reg: /Redis prefix\:/, write: '\n', done: false },
{ reg: /Redis key\:/, write: '\n', done: false }
]
, proc = spawn('clever', [ 'install', 'clever-auth' ], { cwd: path.join(__dirname, '../', prName) });
console.log('step #' + step + ' - install clever-auth module - begin\n');
proc.stdout.on('data', function (data) {
var str = data.toString();
if (str.match(/ing/) !== null) {
console.log(str);
}
objs.forEach (function (obj, i) {
if (obj.done !== true && str.match(obj.reg) !== null) {
objs[i].done = true;
proc.stdin.write(obj.write);
}
});
});
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString() + '\n');
reject (data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code + '\n');
resolve();
});
});
}
function installAccountsModule() {
step++;
return new Promise(function(resolve, reject) {
var objs = []
, proc = spawn('clever', [ 'install', 'clever-accounts' ], { cwd: path.join(__dirname, '../', prName) });
console.log('step #' + step + ' - install clever-accounts module - begin\n');
proc.stdout.on('data', function (data) {
var str = data.toString();
if (str.match(/ing/) !== null) {
console.log(str);
}
objs.forEach (function (obj, i) {
if (obj.done !== true && str.match(obj.reg) !== null) {
objs[i].done = true;
proc.stdin.write(obj.write);
}
});
});
proc.stderr.on('data', function (data) {
console.log('Error in step #' + step + ' - ' + data.toString() + '\n');
reject (data.toString());
});
proc.on('close', function (code) {
console.log('step #' + step + ' process exited with code ' + code + '\n');
resolve();
});
});
}
function rebaseDb() {
step++;
return new Promise(function(resolve, reject) {
var proc = spawn('grunt', [ 'db' ], { cwd: path.join(__dirname, '../', prName) });
console.log('step #' + step + ' - rebase db');
proc.stdout.on('data', function(data) {
console.log(data.toString());
});
proc.stderr.on('data', function(data) {
console.log('Error in step #' + step + ' - ' + data.toString());
reject(data.toString());
});
proc.on('close', function(code) {
console.log('step #' + step + ' process exited with code ' + code);
resolve();
});
});
}
createProject()
.then(installORM)
.then(installTestModule)
.then(installAuthModule)
.then(installAccountsModule)
.then(installUsersModule)
.then(copyRolesModule)
.then(cleverSetup)
.then(rebaseDb)
.catch (function (err) {
console.error('Error - ' + err);
});