opensupports/server/controllers/system/init-settings.php

160 lines
5.8 KiB
PHP
Executable File

<?php
use RedBeanPHP\Facade as RedBean;
use Respect\Validation\Validator as DataValidator;
DataValidator::with('CustomValidations', true);
/**
* @api {post} /system/init-settings Init settings
* @apiVersion 4.10.0
*
* @apiName Init settings
*
* @apiGroup System
*
* @apiDescription This path sets the initial settings. It can only be used once during installation.
*
* @apiPermission any
*
* @apiParam {String} language Indicates the default language of the system.
* @apiParam {String} registration Indicates if the registration should be enabled.
* @apiParam {String} server-email Email from where automated emails will be sent.
* @apiParam {String} smtp-host SMTP Server address.
* @apiParam {String} smtp-port SMTP Server port.
* @apiParam {String} smtp-user SMTP Authentication User.
* @apiParam {String} smtp-pass SMTP Authentication Password.
* @apiParam {String} allow-attachments Indicates if files can be attached to tickets and comments.
* @apiParam {String} title Title of the support center
* @apiParam {String} url Url of the frontend client.
* @apiParam {Boolean} mandatory-login Indicates if the login is mandatory.
* @apiParam {Number} default-department-id Indicates the id of the default department
* @apiParam {Boolean} locked-department Indicates if the default department is locked or not
* @apiUse INVALID_LANGUAGE
* @apiUse INIT_SETTINGS_DONE
*
* @apiSuccess {Object} data Empty object
*
*/
class InitSettingsController extends Controller {
const PATH = '/init-settings';
const METHOD = 'POST';
public function validations() {
return [
'permission' => 'any',
'requestData' => [
'language' => [
'validation' => DataValidator::validLanguage(),
'error' => ERRORS::INVALID_LANGUAGE
]
]
];
}
public function handler() {
if (Setting::isTableEmpty()) {
RedBean::exec(file_get_contents('data/db_schema.sql'));
$this->storeGlobalSettings();
$this->storeMailTemplates();
$this->storeLanguages();
$this->storeMockedDepartments();
Response::respondSuccess();
} else {
throw new RequestException(ERRORS::INIT_SETTINGS_DONE);
}
}
private function storeGlobalSettings() {
$this->storeSettings([
'language' => Controller::request('language'),
'recaptcha-public' => '',
'recaptcha-private' => '',
'server-email' => Controller::request('server-email'),
'imap-host' => Controller::request('imap-host'),
'imap-user' => Controller::request('imap-user'),
'imap-pass' => Controller::request('imap-pass'),
'smtp-host' => Controller::request('smtp-host'),
'smtp-user' => Controller::request('smtp-user'),
'smtp-pass' => Controller::request('smtp-pass'),
'maintenance-mode' => 0,
'layout' => 'boxed',
'allow-attachments' => !!Controller::request('allow-attachments'),
'max-size' => 1,
'title' => Controller::request('title') ? Controller::request('title') : 'Support Center',
'url' => Controller::request('url') ? Controller::request('url') : ('http://' . $_SERVER['HTTP_HOST']),
'registration' => !!Controller::request('registration'),
'last-stat-day' => date('YmdHi', strtotime(' -12 day ')),
'ticket-gap' => Hashing::generateRandomPrime(100000, 999999),
'ticket-first-number' => Hashing::generateRandomNumber(100000, 999999),
'session-prefix' => 'opensupports-'.Hashing::generateRandomToken().'_',
'mail-template-header-image' => 'https://s3.amazonaws.com/opensupports/logo.png',
'default-department-id' => 1,
'default-is-locked' => false,
'imap-token' => '',
'mandatory-login' => !!Controller::request('mandatory-login')
]);
}
private function storeMailTemplates() {
$mailLanguages = MailTexts::getTexts();
foreach ($mailLanguages as $language => $mailTemplate) {
foreach ($mailTemplate as $template => $texts) {
$mailTemplate = new MailTemplate();
$mailTemplate->setProperties([
'template' => $template,
'language' => $language,
'subject' => $texts[0],
'text1' => array_key_exists(1, $texts) ? $texts[1] : '',
'text2' => array_key_exists(2, $texts) ? $texts[2] : '',
'text3' => array_key_exists(3, $texts) ? $texts[3] : '',
]);
$mailTemplate->store();
}
}
}
private function storeSettings($settings) {
foreach ($settings as $settingName => $settingValue) {
$setting = new Setting();
$setting->setProperties([
'name' => $settingName,
'value' => $settingValue
]);
$setting->store();
}
}
private function storeLanguages() {
$defaultLanguage = Controller::request('language');
foreach(Language::LANGUAGES as $languageCode) {
$language = new Language();
$language->setProperties([
'code' => $languageCode,
'allowed' => 1,
'supported' => ($languageCode === $defaultLanguage)
]);
$language->store();
}
}
private function storeMockedDepartments() {
$departments = [
'Help and Support'
];
foreach ($departments as $departmentName) {
$department = new Department();
$department->name = $departmentName;
$department->private = 0;
$department->store();
}
}
}