#!/usr/bin/env node /** * Module dependencies. */ const program = require('./commander'); const inquirer = require('inquirer'); const mongoose = require('../services/mongoose'); const SettingModel = require('../models/setting'); const SettingsService = require('../services/settings'); const SetupService = require('../services/setup'); const UsersService = require('../services/users'); const util = require('./util'); const errors = require('../errors'); // Register the shutdown criteria. util.onshutdown([ () => mongoose.disconnect() ]); //============================================================================== // Setting up the program command line arguments. //============================================================================== program .description('runs the setup wizard to setup the application') .option('--defaults', 'apply defaults for config instead of prompting') .parse(process.argv); //============================================================================== // Setup the application //============================================================================== const performSetup = () => { if (program.defaults) { return SettingsService .init() .then(() => { console.log('Settings created.'); console.log('\nTalk is now installed!'); util.shutdown(); }) .catch((err) => { console.error(err); util.shutdown(1); }); } // Get the current settings, we are expecing an error here. return SettingsService .retrieve() .then(() => { // We should NOT have gotten a settings object, this means that the // application is already setup. Error out here. throw errors.ErrSettingsInit; }) .catch((err) => { // If the error is `not init`, then we're good, otherwise, it's something // else. if (err !== errors.ErrSettingsNotInit) { throw err; } }) .then(() => { // Create the base settings model. let settings = new SettingModel(); console.log('We\'ll ask you some questions in order to setup your installation of Talk.\n'); return inquirer.prompt([ { type: 'input', name: 'organizationName', message: 'Organization Name', default: settings.organizationName, validate: (input) => { if (input && input.length > 0) { return true; } return 'Organization Name is required.'; } }, { type: 'list', choices: SettingModel.MODERATION_OPTIONS, name: 'moderation', default: settings.moderation, message: 'Select a moderation mode' }, { type: 'confirm', name: 'requireEmailConfirmation', default: settings.requireEmailConfirmation, message: 'Should emails always be confirmed' } ]) .then((answers) => { // Update the settings that were changed. Object.keys(answers).forEach((key) => { if (answers[key] !== undefined) { settings[key] = answers[key]; } }); console.log('\nWe\'ll ask you some questions about your first admin user.\n'); return inquirer.prompt([ { type: 'input', name: 'username', message: 'Username', filter: (username) => { return UsersService .isValidUsername(username, false) .catch((err) => { throw err.message; }); } }, { name: 'email', message: 'Email', format: 'email', validate: (value) => { if (value && value.length >= 3) { return true; } return 'Email is required'; } }, { name: 'password', message: 'Password', type: 'password', filter: (password) => { return UsersService .isValidPassword(password) .catch((err) => { throw err.message; }); } }, { name: 'confirmPassword', message: 'Confirm Password', type: 'password', filter: (confirmPassword) => { return UsersService .isValidPassword(confirmPassword) .catch((err) => { throw err.message; }); } }, ]); }) .then((user) => { if (user.password !== user.confirmPassword) { return Promise.reject(new Error('Passwords do not match')); } return SetupService.setup({ settings: settings.toObject(), user: { email: user.email, username: user.username, password: user.password } }); }); }) .then(({user}) => { console.log('Settings created.'); console.log(`User ${user.id} created.`); console.log('\nTalk is now installed!'); console.log('\nWe recommend adding TALK_INSTALL_LOCK=TRUE to your environment to turn off the dynamic setup.'); util.shutdown(); }) .catch((err) => { console.error(err); util.shutdown(1); }); }; // Start tthe setup process. performSetup();