#!/usr/bin/env node /** * Module dependencies. */ var mongoose = require('mongoose'), inquirer = require('inquirer'), envfile = require('envfile'), fs = require('fs-extra'), chalk = require('chalk'), constants = require('./setup_constants'), _ = require('lodash'); var exitSuccess = function(cb) { console.log(chalk.green('OhMyForm has been successfully setup')); console.log(chalk.green('Have fun using OhMyForm!')); if(require.main === module){ process.exit(1); } else if(cb && typeof cb === 'function'){ cb(); } } var exitError = function(err, cb){ console.error(chalk.red(err.message || err)); if(require.main === module){ process.exit(-1); } else if(cb && typeof cb === 'function'){ cb(); } } var removeENVFile = function() { fs.unlinkSync('./\.env') } var createOrUpdateAdminUser = function(username, email, password, cb){ //Command Line Bootstrapping Code if (require.main === module) { var config = require('../config/config'); // Bootstrap db connection var db = mongoose.connect(config.db.uri, config.db.options, function(err) { if (err) { console.error(chalk.red('Could not connect to MongoDB!')); return cb(new Error(err)); } }); mongoose.connection.on('error', function(err) { return cb(new Error('MongoDB connection error: ' + err)); }); // Init the express application require('../config/express')(db); // Bootstrap passport config require('../config/passport')(); } var User = require('../app/models/user.server.model.js'); var updateObj = { firstName: 'Admin', lastName: 'Account', username: username, email: email, provider: 'local', roles: ['admin', 'user'] } var options = { upsert: true, new: true, setDefaultsOnInsert: true } User.findOneAndUpdate({ username: username }, updateObj, options, function (err, user) { if (err) { delete pass; delete email; delete username; return cb(err); } if(!user){ delete pass; delete email; delete username; return cb(new Error('Admin User could not be created')); } user.password = password user.save(function(err) { if(err){ delete pass; delete email; delete username; return cb(err); } delete pass; delete email; delete username; console.log(chalk.green('Successfully created user')); cb(); }); }); } var createENVFile = function(cb) { inquirer.prompt(constants.questionsPart1).then(function (answersPart1) { var nextQuestions = constants.mailerWellKnownQuestions.concat(constants.questionsPart2); if(answersPart1['MAILER_SERVICE_PROVIDER'] === 'Custom Mailserver'){ nextQuestions = constants.mailerCustomQuestions.concat(constants.questionsPart2); } inquirer.prompt(nextQuestions).then(function (answersPart2) { var answers = _.chain(anwsersPart1)._extend(answersPart2).mapValues(function(val){ if(_.isBoolean(val)){ return val ? 'TRUE' : 'FALSE'; } return val; }).values(); var email = answers['email']; var username = answers['username']; var pass = answers['password']; delete answers['email']; delete answers['username']; delete answers['password']; envfile.stringify(answers, function (err, str) { try { fs.outputFileSync('./\.env', str); } catch (fileErr) { console.error(chalk.red(fileErr)); process.exit(-1); } console.log(chalk.green('Successfully created .env file')); createOrUpdateAdminUser(username, email, pass, function(err){ if(err) { return exitError(err, cb); } exitSuccess(cb); }); }); }); }); } var checkENVAndRunSetup = function(cb) { console.log(chalk.green(constants.asciiArt)); if(require.main === module){ console.log(chalk.green('Welcome to OhMyForm\'s Setup Tool')); console.log(chalk.green('Follow the prompts to begin.\n-------------------------------------------\n\n')); } if(fs.existsSync('./\.env') && require.main === module) { inquirer.prompt([constants.replaceENVQuestion]).then(function (envAnswer) { if (envAnswer['replaceENVFile']) { removeENVFile(); createENVFile(cb); } else { exitSuccess(cb); } }); } else { if(require.main !== module){ console.log(chalk.green('Welcome to OhMyForm\'s Initial Setup\n')); console.log(chalk.green('The following prompts will help you properly configure your OhMyForm instance.')); console.log(chalk.green('If you want to run this tool after your inital setup, run `node scripts/setup.js`.\n---------------------------------------------------------------------\n\n')); } createENVFile(); } } module.exports.checkENVAndRunSetup = checkENVAndRunSetup; if(require.main === module) { checkENVAndRunSetup(); }