Ivan - Add installation service backend [skip ci]

This commit is contained in:
ivan 2017-03-15 02:17:16 -03:00
parent a183d1ed79
commit 46e3e65a0b
11 changed files with 199 additions and 47 deletions

View File

@ -22,11 +22,11 @@ class InstallLayout extends React.Component {
componentDidMount() {
API.call({
path: '/system/installation-step',
path: '/system/installation-done',
data: {}
}).then((result) => {
if(result.data != this.getCurrentStep()) {
browserHistory.push('/install/step-' + (result.data + 1));
if(result.data == 1) {
browserHistory.push('/install/step-6');
}
});
}

View File

@ -1,5 +1,6 @@
import React from 'react';
import {browserHistory} from 'react-router';
import { connect } from 'react-redux'
import i18n from 'lib-app/i18n';
import API from 'lib-app/api-call';
@ -54,6 +55,7 @@ class InstallStep4UserSystem extends React.Component {
API.call({
path: '/system/init-settings',
data: {
'language': this.props.language,
'user-system-enabled': form['user-system-enabled'],
'registration': form['registration']
}
@ -65,4 +67,9 @@ class InstallStep4UserSystem extends React.Component {
}
}
export default InstallStep4UserSystem;
export default connect((store) => {
return {
language: store.config.language
};
})(InstallStep4UserSystem);

10
server/config.php Normal file → Executable file
View File

@ -1,10 +0,0 @@
<?php
$env['MYSQL_SERVER'] = getenv('MYSQL_SERVER');
$env['MYSQL_USER'] = getenv('MYSQL_USER');
$env['MYSQL_PASSWORD'] = getenv('MYSQL_PASSWORD');
$env['MYSQL_DATABASE'] = getenv('MYSQL_DATABASE');
$mysql_host = ($env['MYSQL_SERVER']) ? $env['MYSQL_SERVER'] : 'localhost';
$mysql_user = ($env['MYSQL_USER']) ? $env['MYSQL_USER'] : 'root';
$mysql_password = ($env['MYSQL_PASSWORD']) ? $env['MYSQL_PASSWORD'] : '';
$mysql_database = ($env['MYSQL_DATABASE']) ? $env['MYSQL_DATABASE'] : 'development';

View File

@ -1,5 +1,9 @@
<?php
require_once 'system/check-requirements.php';
require_once 'system/init-database.php';
require_once 'system/init-settings.php';
require_once 'system/init-admin.php';
require_once 'system/installation-done.php';
require_once 'system/get-settings.php';
require_once 'system/edit-settings.php';
require_once 'system/add-department.php';
@ -25,7 +29,11 @@ require_once 'system/download.php';
$systemControllerGroup = new ControllerGroup();
$systemControllerGroup->setGroupPath('/system');
$systemControllerGroup->addController(new CheckRequirementsController);
$systemControllerGroup->addController(new InitDatabaseController);
$systemControllerGroup->addController(new InitSettingsController);
$systemControllerGroup->addController(new InitAdminController);
$systemControllerGroup->addController(new InstallationDoneController);
$systemControllerGroup->addController(new GetSettingsController);
$systemControllerGroup->addController(new EditSettingsController);
$systemControllerGroup->addController(new AddDepartmentController);

View File

@ -0,0 +1,49 @@
<?php
class CheckRequirementsController extends Controller {
const PATH = '/check-requirements';
const METHOD = 'POST';
const requiredPHPVersion = '5.6';
public function validations() {
return [
'permission' => 'any',
'requestData' => []
];
}
public function handler() {
Response::respondSuccess([
'phpVersion' => [
'name' => 'PHP Version',
'value' => phpversion(),
'ok' => $this->checkVersion()
],
'PDO' => [
'name' => 'PDO Module',
'value' => class_exists('PDO') ? 'Available' : 'Not available',
'ok' => class_exists('PDO')
],
'configFile' => [
'name' => 'File: /api/config.php',
'value' => is_writable('config.php') ? 'Writable' : 'Not writable',
'ok' => is_writable('config.php')
],
'files' => [
'name' => 'Folder: /api/files',
'value' => is_writable('files/') ? 'Writable' : 'Not writable',
'ok' => is_writable('files/')
]
]);
}
private function checkVersion() {
$requiredVersion = explode('.', CheckRequirementsController::requiredPHPVersion);
$currentVersion = explode('.', phpversion());
if($currentVersion[0] > $requiredVersion[0]) return true;
else if($currentVersion[0] < $requiredVersion[0]) return false;
else return $currentVersion[1] >= $requiredVersion[1];
}
}

View File

@ -0,0 +1,54 @@
<?php
use Respect\Validation\Validator as DataValidator;
DataValidator::with('CustomValidations', true);
class InitAdminController extends Controller {
const PATH = '/init-admin';
const METHOD = 'POST';
public function validations() {
return [
'permission' => 'any',
'requestData' => [
'name' => [
'validation' => DataValidator::length(2, 55),
'error' => ERRORS::INVALID_NAME
],
'email' => [
'validation' => DataValidator::email(),
'error' => ERRORS::INVALID_EMAIL
],
'password' => [
'validation' => DataValidator::length(5, 200),
'error' => ERRORS::INVALID_PASSWORD
],
]
];
}
public function handler() {
if(!Staff::isTableEmpty()) {
throw new Exception(ERRORS::INIT_SETTINGS_DONE);
}
$staff = new Staff();
$staff->setProperties([
'name' => Controller::request('name'),
'email' => Controller::request('email'),
'password' => Controller::request('password'),
'profilePic' => '',
'level' => 3,
'sharedDepartmentList' => Department::getAll(),
'sharedTicketList' => []
]);
foreach(Department::getAll() as $department) {
$department->owners++;
$department->store();
}
$staff->store();
Response::respondSuccess();
}
}

View File

@ -0,0 +1,33 @@
<?php
//include '../../config.php';
use RedBeanPHP\Facade as RedBean;
class InitDatabaseController extends Controller {
const PATH = '/init-database';
const METHOD = 'POST';
public function validations() {
return [
'permission' => 'any',
'requestData' => []
];
}
public function handler() {
if(defined('MYSQL_HOST')) {
throw new Exception(ERRORS::INIT_SETTINGS_DONE);
return;
}
$configFile = fopen('config.php', 'w+') or die(ERRORS::INVALID_FILE);
$content = '<?php' . PHP_EOL;
$content .= 'define(\'MYSQL_HOST\', \'' . Controller::request('dbHost') . '\');' . PHP_EOL;
$content .= 'define(\'MYSQL_USER\', \'' . Controller::request('dbUser') . '\');' . PHP_EOL;
$content .= 'define(\'MYSQL_PASSWORD\', \'' . Controller::request('dbPassword') . '\');' . PHP_EOL;
$content .= 'define(\'MYSQL_DATABASE\', \'' . Controller::request('dbName') . '\');' . PHP_EOL;
fwrite($configFile, $content);
fclose($configFile);
Response::respondSuccess();
}
}

View File

@ -1,4 +1,6 @@
<?php
use Respect\Validation\Validator as DataValidator;
DataValidator::with('CustomValidations', true);
class InitSettingsController extends Controller {
const PATH = '/init-settings';
@ -7,7 +9,12 @@ class InitSettingsController extends Controller {
public function validations() {
return [
'permission' => 'any',
'requestData' => []
'requestData' => [
'language' => [
'validation' => DataValidator::validLanguage(),
'error' => ERRORS::INVALID_LANGUAGE
]
]
];
}
@ -17,7 +24,6 @@ class InitSettingsController extends Controller {
$this->storeMailTemplates();
$this->storeLanguages();
$this->storeMockedDepartments();
$this->createMockedStaff();
Response::respondSuccess();
} else {
@ -27,12 +33,12 @@ class InitSettingsController extends Controller {
private function storeGlobalSettings() {
$this->storeSettings([
'language' => 'en',
'language' => Controller::request('language'),
'recaptcha-public' => '',
'recaptcha-private' => '',
'no-reply-email' => 'noreply@opensupports.com',
'smtp-host' => 'localhost',
'smtp-port' => 7070,
'smtp-port' => 25,
'smtp-user' => '',
'smtp-pass' => '',
'time-zone' => 0,
@ -42,9 +48,9 @@ class InitSettingsController extends Controller {
'max-size' => 1024,
'title' => 'Support Center',
'url' => 'http://www.opensupports.com/support',
'registration' => true,
'user-system-enabled' => true,
'last-stat-day' => date('YmdHi', strtotime(' -12 day ')), //TODO: get current date
'registration' => Controller::request('registration'),
'user-system-enabled' => Controller::request('user-system-enabled'),
'last-stat-day' => date('YmdHi', strtotime(' -12 day ')),
'ticket-gap' => Hashing::generateRandomPrime(100000, 999999),
'file-gap' => Hashing::generateRandomPrime(100000, 999999),
'file-first-number' => Hashing::generateRandomNumber(100000, 999999),
@ -98,9 +104,7 @@ class InitSettingsController extends Controller {
private function storeMockedDepartments() {
$departments = [
'Tech Support',
'Suggestions',
'Sales and Subscriptions'
'Help and Support'
];
foreach ($departments as $departmentName) {
@ -109,22 +113,4 @@ class InitSettingsController extends Controller {
$department->store();
}
}
private function createMockedStaff() {
$staff = new Staff();
$staff->setProperties([
'name' => 'Emilia Clarke',
'email' => 'staff@opensupports.com',
'password' => Hashing::hashPassword('staff'),
'profilePic' => '',
'level' => 3,
'sharedDepartmentList' => Department::getAll(),
'sharedTicketList' => []
]);
foreach(Department::getAll() as $department) {
$department->owners++;
$department->store();
}
$staff->store();
}
}

View File

@ -0,0 +1,22 @@
<?php
use RedBeanPHP\Facade as RedBean;
class InstallationDoneController extends Controller {
const PATH = '/installation-done';
const METHOD = 'POST';
public function validations() {
return [
'permission' => 'any',
'requestData' => []
];
}
public function handler() {
if(RedBean::testConnection() && !Setting::isTableEmpty() && !Staff::isTableEmpty()) {
Response::respondSuccess(1);
} else {
Response::respondSuccess(0);
}
}
}

View File

@ -1,11 +1,14 @@
<?php
require_once 'config.php';
include 'config.php';
require_once 'vendor/autoload.php';
// REDBEAN CONFIGURATION
use RedBeanPHP\Facade as RedBean;
RedBean::setup('mysql:host='. $mysql_host .';dbname=' . $mysql_database, $mysql_user, $mysql_password);
RedBean::setAutoResolve(true);
if(defined('MYSQL_HOST') && defined('MYSQL_DATABASE') && defined('MYSQL_USER') && defined('MYSQL_PASSWORD')) {
RedBean::setup('mysql:host='. MYSQL_HOST .';dbname=' . MYSQL_DATABASE , MYSQL_USER, MYSQL_PASSWORD);
RedBean::setAutoResolve(true);
}
// SLIM FRAMEWORK
\Slim\Slim::registerAutoLoader();

View File

@ -6,7 +6,7 @@ use Respect\Validation\Rules\AbstractRule;
class ValidLanguage extends AbstractRule {
public function validate($ticketNumber) {
return in_array($ticketNumber, \Language::LANGUAGES);
public function validate($language) {
return in_array($language, \Language::LANGUAGES);
}
}