2018-02-20 17:05:58 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
|
|
|
|
use Session;
|
|
|
|
use App\Utilities\Installer;
|
|
|
|
use Illuminate\Console\Command;
|
|
|
|
|
|
|
|
class Install extends Command
|
|
|
|
{
|
2018-02-20 17:17:39 +03:00
|
|
|
const CMD_SUCCESS = 0;
|
|
|
|
const CMD_ERROR = 1;
|
|
|
|
const OPT_DB_HOST = 'db-host';
|
|
|
|
const OPT_DB_PORT = 'db-port';
|
|
|
|
const OPT_DB_NAME = 'db-name';
|
|
|
|
const OPT_DB_USERNAME = 'db-username';
|
|
|
|
const OPT_DB_PASSWORD = 'db-password';
|
|
|
|
const OPT_COMPANY_NAME = 'company-name';
|
|
|
|
const OPT_COMPANY_EMAIL = 'company-email';
|
|
|
|
const OPT_ADMIN_EMAIL = 'admin-email';
|
|
|
|
const OPT_ADMIN_PASSWORD = 'admin-password';
|
|
|
|
const OPT_LOCALE = 'locale';
|
|
|
|
const OPT_NO_INTERACTION = 'no-interaction';
|
|
|
|
|
|
|
|
public $dbHost;
|
2018-02-20 17:05:58 +03:00
|
|
|
public $dbPort;
|
|
|
|
public $dbName;
|
|
|
|
public $dbUsername;
|
|
|
|
public $dbPassword;
|
|
|
|
|
|
|
|
public $companyName;
|
|
|
|
public $companyEmail;
|
|
|
|
|
|
|
|
public $adminEmail;
|
|
|
|
public $adminPassword;
|
|
|
|
|
|
|
|
public $locale;
|
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
/**
|
|
|
|
* The name and signature of the console command.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $signature = 'install
|
2018-02-20 17:05:58 +03:00
|
|
|
{--db-host= : Database host}
|
|
|
|
{--db-port=3306 : Port of the database host}
|
|
|
|
{--db-name= : Name of the database}
|
|
|
|
{--db-username= : Username to use to access the database}
|
|
|
|
{--db-password= : Password to use to access the database}
|
|
|
|
{--company-name= : Name of the company managed buy the app}
|
|
|
|
{--company-email= : email used to contact the company}
|
|
|
|
{--admin-email= : Admin user email}
|
|
|
|
{--admin-password= : Admin user password}
|
|
|
|
{--locale=en-GB : Language used in the app}
|
|
|
|
';
|
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
/**
|
|
|
|
* The console command description.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $description = 'Allows to install Akaunting directly through CLI';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new command instance.
|
|
|
|
*/
|
|
|
|
public function __construct()
|
2018-02-20 17:05:58 +03:00
|
|
|
{
|
2018-02-20 17:17:39 +03:00
|
|
|
parent::__construct();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute the console command.
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function handle()
|
2018-02-20 17:05:58 +03:00
|
|
|
{
|
2018-02-20 17:17:39 +03:00
|
|
|
$missingOptions = $this->checkOptions();
|
|
|
|
if (!empty($missingOptions) && $this->option(self::OPT_NO_INTERACTION)) {
|
|
|
|
$this->line('❌ Some options are missing and --no-interaction is present. Please run the following command for more informations :');
|
|
|
|
$this->line('❌ php artisan help install');
|
|
|
|
$this->line('❌ Missing options are : ' . join(', ', $missingOptions));
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
return self::CMD_ERROR;
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Setting locale ' . $this->locale);
|
|
|
|
Session::put(self::OPT_LOCALE, $this->locale);
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->prompt();
|
2018-02-20 17:05:58 +03:00
|
|
|
|
|
|
|
// Create the .env file
|
|
|
|
Installer::createDefaultEnvFile();
|
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Creating database tables');
|
|
|
|
if (!$this->createDatabaseTables()) {
|
|
|
|
return self::CMD_ERROR;
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Creating company');
|
|
|
|
Installer::createCompany($this->companyName, $this->companyEmail, $this->locale);
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Creating admin');
|
|
|
|
Installer::createUser($this->adminEmail, $this->adminPassword, $this->locale);
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Applying the final touches');
|
|
|
|
Installer::finalTouches();
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
return self::CMD_SUCCESS;
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
/**
|
|
|
|
* Check that all options are presents. otherwise returns an array of the missing options
|
|
|
|
*/
|
|
|
|
private function checkOptions()
|
2018-02-20 17:05:58 +03:00
|
|
|
{
|
2018-02-20 17:17:39 +03:00
|
|
|
$missingOptions = array();
|
|
|
|
|
|
|
|
$this->locale = $this->option(self::OPT_LOCALE);
|
|
|
|
if (empty($this->locale)) {
|
|
|
|
$missingOptions[] = self::OPT_LOCALE;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->dbHost = $this->option(self::OPT_DB_HOST);
|
|
|
|
if (empty($this->dbHost)) {
|
|
|
|
$missingOptions[] = self::OPT_DB_HOST;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->dbPort = $this->option(self::OPT_DB_PORT);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_DB_PORT;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->dbName = $this->option(self::OPT_DB_NAME);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_DB_NAME;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->dbUsername = $this->option(self::OPT_DB_USERNAME);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_DB_USERNAME;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->dbPassword = $this->option(self::OPT_DB_PASSWORD);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_DB_PASSWORD;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->companyName = $this->option(self::OPT_COMPANY_NAME);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_COMPANY_NAME;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->companyEmail = $this->option(self::OPT_COMPANY_EMAIL);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_COMPANY_EMAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->adminEmail = $this->option(self::OPT_ADMIN_EMAIL);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_ADMIN_EMAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->adminPassword = $this->option(self::OPT_ADMIN_PASSWORD);
|
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$missingOptions[] = self::OPT_ADMIN_PASSWORD;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $missingOptions;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ask the user for data if some options are missing.
|
|
|
|
*/
|
|
|
|
private function prompt()
|
2018-02-20 17:05:58 +03:00
|
|
|
{
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->dbHost)) {
|
|
|
|
$this->dbHost = $this->ask('What is the database host?', 'localhost');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->dbPort)) {
|
|
|
|
$this->dbPort = $this->ask('What is the database port?', '3606');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->dbName)) {
|
|
|
|
$this->dbName = $this->ask('What is the database name?');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->dbUsername)) {
|
|
|
|
$this->dbUsername = $this->ask('What is the database username?');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->dbPassword)) {
|
|
|
|
$this->dbPassword = $this->secret('What is the database password?');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->companyName)) {
|
|
|
|
$this->companyName = $this->ask('What is the company name?');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->companyEmail)) {
|
|
|
|
$this->companyEmail = $this->ask('What is the company contact email?');
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->adminEmail)) {
|
|
|
|
$this->adminEmail = $this->ask('What is the admin email?', $this->companyEmail);
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
if (empty($this->adminPassword)) {
|
|
|
|
$this->adminPassword = $this->secret('What is the admin password?');
|
|
|
|
}
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
private function createDatabaseTables() {
|
|
|
|
$this->dbHost = $this->option(self::OPT_DB_HOST);
|
|
|
|
$this->dbPort = $this->option(self::OPT_DB_PORT);
|
|
|
|
$this->dbName = $this->option(self::OPT_DB_NAME);
|
|
|
|
$this->dbUsername = $this->option(self::OPT_DB_USERNAME);
|
|
|
|
$this->dbPassword = $this->option(self::OPT_DB_PASSWORD);
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->line('Connecting to database ' . $this->dbName . '@' . $this->dbHost . ':' . $this->dbPort);
|
2018-02-20 17:05:58 +03:00
|
|
|
|
|
|
|
if (!Installer::createDbTables($this->dbHost, $this->dbPort, $this->dbName, $this->dbUsername, $this->dbPassword)) {
|
2018-02-20 17:17:39 +03:00
|
|
|
$this->error('Error: Could not connect to the database! Please, make sure the details are correct.');
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
return false;
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
|
2018-02-20 17:17:39 +03:00
|
|
|
return true;
|
|
|
|
}
|
2018-02-20 17:05:58 +03:00
|
|
|
}
|