mirror of
https://github.com/wassname/talk.git
synced 2026-06-29 05:18:32 +08:00
198 lines
5.4 KiB
JavaScript
Executable File
198 lines
5.4 KiB
JavaScript
Executable File
#!/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();
|