From 48614fcc001b9ddccd54846416b4a64afd1dbe2a Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 29 Mar 2017 18:46:26 -0300 Subject: [PATCH] Ivan - Fix Installation issues [skip ci] --- client/src/actions/config-actions.js | 10 +++ client/src/app/App.js | 4 +- .../settings/admin-panel-email-templates.js | 2 +- .../admin-panel-system-preferences.js | 4 +- .../panel/staff/admin-panel-departments.js | 12 ++- .../install/install-step-2-requirements.js | 18 ++++- .../install/install-step-2-requirements.scss | 15 ++-- .../app/install/install-step-3-database.js | 4 +- .../app/install/install-step-4-user-system.js | 11 ++- .../app/install/install-step-6-completed.js | 1 - .../dashboard-list-articles-page.js | 4 +- client/src/core-components/color-selector.js | 4 +- client/src/core-components/form-field.js | 2 +- client/src/core-components/icon-selector.js | 4 +- client/src/data/languages/en.js | 3 +- client/src/index.html | 29 ++++--- client/src/index.js | 1 + client/src/index.php | 23 ++++++ client/src/lib-app/session-store.js | 4 +- client/src/reducers/config-reducer.js | 12 ++- server/controllers/staff/edit.php | 2 +- server/controllers/staff/get-all-tickets.php | 7 ++ server/controllers/staff/get-new-tickets.php | 5 ++ .../controllers/system/check-requirements.php | 6 +- server/controllers/system/get-settings.php | 77 ++++++++++--------- server/controllers/system/init-database.php | 38 +++++++-- server/controllers/system/init-settings.php | 6 +- .../controllers/system/installation-done.php | 6 +- server/controllers/ticket/comment.php | 4 +- server/data/ERRORS.php | 2 + server/index.php | 2 +- server/libs/Controller.php | 2 +- server/models/Ticketevent.php | 6 +- 33 files changed, 223 insertions(+), 107 deletions(-) create mode 100644 client/src/index.php diff --git a/client/src/actions/config-actions.js b/client/src/actions/config-actions.js index ce357d15..4ced1e74 100644 --- a/client/src/actions/config-actions.js +++ b/client/src/actions/config-actions.js @@ -2,6 +2,16 @@ import API from 'lib-app/api-call'; import sessionStore from 'lib-app/session-store'; export default { + checkInstallation() { + return { + type: 'CHECK_INSTALLATION', + payload: API.call({ + path: '/system/installation-done', + data: {} + }) + }; + }, + init() { if (sessionStore.isLoggedIn()) { return { diff --git a/client/src/app/App.js b/client/src/app/App.js index 34690e86..20227002 100644 --- a/client/src/app/App.js +++ b/client/src/app/App.js @@ -74,7 +74,7 @@ class App extends React.Component { } if (validations.languageChanged) { - browserHistory.push(props.location.pathname); + window.location.reload(); } if (validations.loggedOut) { @@ -99,7 +99,7 @@ class App extends React.Component { browserHistory.push('/'); } - if(!props.config['user-system-enabled'] && _.includes(props.location.pathname, '/check-ticket')) { + if(props.config['user-system-enabled'] && _.includes(props.location.pathname, '/check-ticket')) { browserHistory.push('/'); } } diff --git a/client/src/app/admin/panel/settings/admin-panel-email-templates.js b/client/src/app/admin/panel/settings/admin-panel-email-templates.js index be18c548..076be4d2 100644 --- a/client/src/app/admin/panel/settings/admin-panel-email-templates.js +++ b/client/src/app/admin/panel/settings/admin-panel-email-templates.js @@ -122,7 +122,7 @@ class AdminPanelEmailTemplates extends React.Component { getItems() { return this.state.items.map((item) => { return { - content: i18n(item.type) + content: item.type }; }); } diff --git a/client/src/app/admin/panel/settings/admin-panel-system-preferences.js b/client/src/app/admin/panel/settings/admin-panel-system-preferences.js index 248a1f1b..20a98729 100644 --- a/client/src/app/admin/panel/settings/admin-panel-system-preferences.js +++ b/client/src/app/admin/panel/settings/admin-panel-system-preferences.js @@ -174,8 +174,8 @@ class AdminPanelSystemPreferences extends React.Component { 'smtp-port': form['smtp-port'], 'smtp-user': form['smtp-user'], 'smtp-pass': form['smtp-pass'], - 'maintenance-mode': form['maintenance-mode'], - 'allow-attachments': form['allow-attachments'], + 'maintenance-mode': form['maintenance-mode'] * 1, + 'allow-attachments': form['allow-attachments'] * 1, 'max-size': form['max-size'], 'allowedLanguages': JSON.stringify(form.allowedLanguages.map(index => languageKeys[index])), 'supportedLanguages': JSON.stringify(form.supportedLanguages.map(index => languageKeys[index])) diff --git a/client/src/app/admin/panel/staff/admin-panel-departments.js b/client/src/app/admin/panel/staff/admin-panel-departments.js index 4c93928c..b602d9a1 100644 --- a/client/src/app/admin/panel/staff/admin-panel-departments.js +++ b/client/src/app/admin/panel/staff/admin-panel-departments.js @@ -62,9 +62,15 @@ class AdminPanelDepartments extends React.Component {
-
- -
+ {this.props.departments.length > 1 ? this.renderDeleteButton() : null} + + ); + } + + renderDeleteButton() { + return ( +
+
); } diff --git a/client/src/app/install/install-step-2-requirements.js b/client/src/app/install/install-step-2-requirements.js index 8b532704..07833df9 100644 --- a/client/src/app/install/install-step-2-requirements.js +++ b/client/src/app/install/install-step-2-requirements.js @@ -37,10 +37,15 @@ class InstallStep2Requirements extends React.Component { -
- +
+
+ +
+
+ +
); @@ -83,6 +88,11 @@ class InstallStep2Requirements extends React.Component { return classNames(classes); } + onPreviousClick(event) { + event.preventDefault(); + browserHistory.push('/install/step-1'); + } + isAllOk() { return _.every(this.state.requirements, {ok: true}); } diff --git a/client/src/app/install/install-step-2-requirements.scss b/client/src/app/install/install-step-2-requirements.scss index 1c5e2bd5..00566801 100644 --- a/client/src/app/install/install-step-2-requirements.scss +++ b/client/src/app/install/install-step-2-requirements.scss @@ -25,13 +25,10 @@ &__requirement { color: $secondary-blue; - &-value { - width: 200px; - } - &-assert { color: $primary-green; - float: right; + float: left; + margin-right: 11px; margin-top: 3px; } @@ -45,7 +42,13 @@ } } - &__next { + &__previous { + float: left; + } + &__next { + float: left; + position: absolute; + margin-left: 103px; } } \ No newline at end of file diff --git a/client/src/app/install/install-step-3-database.js b/client/src/app/install/install-step-3-database.js index 08ed8ebb..82e8818e 100644 --- a/client/src/app/install/install-step-3-database.js +++ b/client/src/app/install/install-step-3-database.js @@ -26,9 +26,9 @@ class InstallStep3Database extends React.Component { {this.renderMessage()} - + - +
{i18n('NEXT')} diff --git a/client/src/app/install/install-step-4-user-system.js b/client/src/app/install/install-step-4-user-system.js index bc85162a..2f1033f9 100644 --- a/client/src/app/install/install-step-4-user-system.js +++ b/client/src/app/install/install-step-4-user-system.js @@ -15,6 +15,7 @@ import SubmitButton from 'core-components/submit-button'; class InstallStep4UserSystem extends React.Component { state = { + loading: false, form: { 'user-system-enabled': true, 'registration': true @@ -25,7 +26,7 @@ class InstallStep4UserSystem extends React.Component { return (
- +
@@ -52,14 +53,18 @@ class InstallStep4UserSystem extends React.Component { } onSubmit(form) { - API.call({ + this.setState({ + loading: true + }, () => API.call({ path: '/system/init-settings', data: { 'language': this.props.language, 'user-system-enabled': form['user-system-enabled'] * 1, 'registration': form['registration'] * 1 } - }).then(() => browserHistory.push('/install/step-5')); + }).then(() => this.setState({ + loading: false + }, () => browserHistory.push('/install/step-5')))); } isDisabled() { diff --git a/client/src/app/install/install-step-6-completed.js b/client/src/app/install/install-step-6-completed.js index e610a83d..5a776d00 100644 --- a/client/src/app/install/install-step-6-completed.js +++ b/client/src/app/install/install-step-6-completed.js @@ -2,7 +2,6 @@ import React from 'react'; import {browserHistory} from 'react-router'; import i18n from 'lib-app/i18n'; -import API from 'lib-app/api-call'; import Header from 'core-components/header'; import Message from 'core-components/message'; diff --git a/client/src/app/main/dashboard/dashboard-list-articles/dashboard-list-articles-page.js b/client/src/app/main/dashboard/dashboard-list-articles/dashboard-list-articles-page.js index 4c0978ff..b76ecc9a 100644 --- a/client/src/app/main/dashboard/dashboard-list-articles/dashboard-list-articles-page.js +++ b/client/src/app/main/dashboard/dashboard-list-articles/dashboard-list-articles-page.js @@ -57,13 +57,13 @@ class DashboardListArticlesPage extends React.Component { ); } - renderSearchResultsItem(item) { + renderSearchResultsItem(item, index) { let content = this.stripHTML(item.content); content = content.substring(0, 100); content += '...'; return ( -
+
{item.title}
diff --git a/client/src/core-components/color-selector.js b/client/src/core-components/color-selector.js index 64e2c920..e92dc101 100644 --- a/client/src/core-components/color-selector.js +++ b/client/src/core-components/color-selector.js @@ -36,9 +36,9 @@ class ColorSelector extends React.Component { ); } - renderTooltipColor(color) { + renderTooltipColor(color, index) { return ( - + ); } diff --git a/client/src/core-components/form-field.js b/client/src/core-components/form-field.js index ee5a1441..c6e59b14 100644 --- a/client/src/core-components/form-field.js +++ b/client/src/core-components/form-field.js @@ -16,7 +16,7 @@ class FormField extends React.Component { }; static propTypes = { - decorator: React.PropTypes.func, + decorator: React.PropTypes.oneOfType(React.PropTypes.func, React.PropTypes.string), validation: React.PropTypes.string, onChange: React.PropTypes.func, onBlur: React.PropTypes.func, diff --git a/client/src/core-components/icon-selector.js b/client/src/core-components/icon-selector.js index 0ed08563..40191283 100644 --- a/client/src/core-components/icon-selector.js +++ b/client/src/core-components/icon-selector.js @@ -39,9 +39,9 @@ class IconSelector extends React.Component { ); } - renderTooltipIcon(name) { + renderTooltipIcon(name, index) { return ( -
+
); diff --git a/client/src/data/languages/en.js b/client/src/data/languages/en.js index 87eebb71..d1d9548d 100644 --- a/client/src/data/languages/en.js +++ b/client/src/data/languages/en.js @@ -349,5 +349,6 @@ export default { 'ACTIVITY_RE_OPEN_THIS': 'reopened this ticket', 'ACTIVITY_DEPARTMENT_CHANGED_THIS': 'changed department of this ticket to ', 'ACTIVITY_PRIORITY_CHANGED_THIS': 'changed priority of this ticket to', - 'DATE_PREFIX': 'on' + 'DATE_PREFIX': 'on', + 'LEFT_EMPTY_DATABASE': 'Left empty for automatic database creation' }; diff --git a/client/src/index.html b/client/src/index.html index 04d3e7f6..8271ea09 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -1,22 +1,21 @@ - - - - - + + + + + - OS4 + OpenSupports - - - - + + + + -
+
- - - - + + + \ No newline at end of file diff --git a/client/src/index.js b/client/src/index.js index 64ed5b84..e5b95387 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -37,5 +37,6 @@ let unsubscribe = store.subscribe(() => { } }); +store.dispatch(ConfigActions.checkInstallation()); store.dispatch(ConfigActions.init()); store.dispatch(SessionActions.initSession()); diff --git a/client/src/index.php b/client/src/index.php new file mode 100644 index 00000000..c73e539e --- /dev/null +++ b/client/src/index.php @@ -0,0 +1,23 @@ + + + + + + + + + OpenSupports + + + + + +
+ + + + + \ No newline at end of file diff --git a/client/src/lib-app/session-store.js b/client/src/lib-app/session-store.js index 645e5ff8..d5d1086a 100644 --- a/client/src/lib-app/session-store.js +++ b/client/src/lib-app/session-store.js @@ -69,7 +69,7 @@ class SessionStore { return { language: this.getItem('language'), reCaptchaKey: this.getItem('reCaptchaKey'), - departments: this.getDepartments(), + departments: this.getDepartments() || [], allowedLanguages: JSON.parse(this.getItem('allowedLanguages')), supportedLanguages: JSON.parse(this.getItem('supportedLanguages')), layout: this.getItem('layout'), @@ -110,7 +110,7 @@ class SessionStore { } setItem(key, value) { - return this.storage.setItem(key, value); + return this.storage.setItem(key, (value !== undefined) ? value : ''); } removeItem(key) { diff --git a/client/src/reducers/config-reducer.js b/client/src/reducers/config-reducer.js index d3861851..91928810 100644 --- a/client/src/reducers/config-reducer.js +++ b/client/src/reducers/config-reducer.js @@ -8,7 +8,9 @@ class ConfigReducer extends Reducer { getInitialState() { return { language: sessionStore.getItem('language'), - initDone: false + initDone: false, + installedDone: false, + installed: false }; } @@ -16,6 +18,7 @@ class ConfigReducer extends Reducer { return { 'CHANGE_LANGUAGE': this.onLanguageChange, 'INIT_CONFIGS_FULFILLED': this.onInitConfigs, + 'CHECK_INSTALLATION_FULFILLED': this.onInstallationChecked, 'UPDATE_DATA_FULFILLED': this.onInitConfigs }; } @@ -44,6 +47,13 @@ class ConfigReducer extends Reducer { initDone: true }); } + + onInstallationChecked(state, payload) { + return _.extend({}, state, { + installedDone: true, + installed: payload.data + }); + } } export default ConfigReducer.getInstance(); \ No newline at end of file diff --git a/server/controllers/staff/edit.php b/server/controllers/staff/edit.php index 6bc3f7e1..eaf8839a 100644 --- a/server/controllers/staff/edit.php +++ b/server/controllers/staff/edit.php @@ -57,7 +57,7 @@ class EditStaffController extends Controller { $this->staffInstance->sharedDepartmentList = $this->getDepartmentList(); } - if($fileUploader = $this->uploadFile()) { + if($fileUploader = $this->uploadFile(true)) { $this->staffInstance->profilePic = ($fileUploader instanceof FileUploader) ? $fileUploader->getFileName() : null; } diff --git a/server/controllers/staff/get-all-tickets.php b/server/controllers/staff/get-all-tickets.php index 98c3f4d6..44350d2d 100644 --- a/server/controllers/staff/get-all-tickets.php +++ b/server/controllers/staff/get-all-tickets.php @@ -18,6 +18,13 @@ class GetAllTicketsStaffController extends Controller { } public function handler() { + if (Ticket::isTableEmpty()) { + Response::respondSuccess([ + 'tickets' => [], + 'pages' => 0 + ]); + return; + } Response::respondSuccess([ 'tickets' => $this->getTicketList()->toArray(), diff --git a/server/controllers/staff/get-new-tickets.php b/server/controllers/staff/get-new-tickets.php index bc2e5ca8..67f631db 100644 --- a/server/controllers/staff/get-new-tickets.php +++ b/server/controllers/staff/get-new-tickets.php @@ -13,6 +13,11 @@ class GetNewTicketsStaffController extends Controller { ]; } public function handler() { + if (Ticket::isTableEmpty()) { + Response::respondSuccess([]); + return; + } + $user = Controller::getLoggedUser(); $query = ' ('; foreach ($user->sharedDepartmentList as $department) { diff --git a/server/controllers/system/check-requirements.php b/server/controllers/system/check-requirements.php index 81a07d52..855470f6 100644 --- a/server/controllers/system/check-requirements.php +++ b/server/controllers/system/check-requirements.php @@ -14,6 +14,8 @@ class CheckRequirementsController extends Controller { } public function handler() { + $configWritable = !!fopen('config.php', 'w+'); + Response::respondSuccess([ 'phpVersion' => [ 'name' => 'PHP Version', @@ -32,8 +34,8 @@ class CheckRequirementsController extends Controller { ], 'files' => [ 'name' => 'Folder: /api/files', - 'value' => is_writable('files/') ? 'Writable' : 'Not writable', - 'ok' => is_writable('files/') + 'value' => $configWritable ? 'Writable' : 'Not writable', + 'ok' => $configWritable ] ]); } diff --git a/server/controllers/system/get-settings.php b/server/controllers/system/get-settings.php index 15f1df8d..8b3a1be2 100644 --- a/server/controllers/system/get-settings.php +++ b/server/controllers/system/get-settings.php @@ -12,44 +12,47 @@ class GetSettingsController extends Controller { } public function handler() { + $settingsList = []; - if(Controller::request('allSettings') && Controller::isStaffLogged(3)) { - $settingsList = [ - 'language' => Setting::getSetting('language')->getValue(), - 'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(), - 'reCaptchaPrivate' => Setting::getSetting('recaptcha-private')->getValue(), - 'time-zone' => Setting::getSetting('time-zone')->getValue(), - 'maintenance-mode' => Setting::getSetting('maintenance-mode')->getValue(), - 'layout' => Setting::getSetting('layout')->getValue(), - 'allow-attachments' => Setting::getSetting('allow-attachments')->getValue(), - 'max-size' => Setting::getSetting('max-size')->getValue(), - 'url' => Setting::getSetting('url')->getValue(), - 'title' => Setting::getSetting('title')->getValue(), - 'no-reply-email' => Setting::getSetting('no-reply-email')->getValue(), - 'smtp-port' => Setting::getSetting('smtp-port')->getValue(), - 'smtp-host' => Setting::getSetting('smtp-host')->getValue(), - 'smtp-user' => Setting::getSetting('smtp-user')->getValue(), - 'registration' => Setting::getSetting('registration')->getValue(), - 'departments' => Department::getDepartmentNames(), - 'supportedLanguages' => Language::getSupportedLanguages(), - 'allowedLanguages' => Language::getAllowedLanguages() - ]; - } else { - $settingsList = [ - 'language' => Setting::getSetting('language')->getValue(), - 'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(), - 'time-zone' => Setting::getSetting('time-zone')->getValue(), - 'maintenance-mode' => Setting::getSetting('maintenance-mode')->getValue(), - 'layout' => Setting::getSetting('layout')->getValue(), - 'allow-attachments' => Setting::getSetting('allow-attachments')->getValue(), - 'max-size' => Setting::getSetting('max-size')->getValue(), - 'title' => Setting::getSetting('title')->getValue(), - 'registration' => Setting::getSetting('registration')->getValue(), - 'departments' => Department::getDepartmentNames(), - 'supportedLanguages' => Language::getSupportedLanguages(), - 'allowedLanguages' => Language::getAllowedLanguages(), - 'user-system-enabled' => Setting::getSetting('user-system-enabled')->getValue() - ]; + if(InstallationDoneController::isInstallationDone()) { + if(Controller::request('allSettings') && Controller::isStaffLogged(3)) { + $settingsList = [ + 'language' => Setting::getSetting('language')->getValue(), + 'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(), + 'reCaptchaPrivate' => Setting::getSetting('recaptcha-private')->getValue(), + 'time-zone' => Setting::getSetting('time-zone')->getValue(), + 'maintenance-mode' => Setting::getSetting('maintenance-mode')->getValue() * 1, + 'layout' => Setting::getSetting('layout')->getValue(), + 'allow-attachments' => Setting::getSetting('allow-attachments')->getValue() * 1, + 'max-size' => Setting::getSetting('max-size')->getValue(), + 'url' => Setting::getSetting('url')->getValue(), + 'title' => Setting::getSetting('title')->getValue(), + 'no-reply-email' => Setting::getSetting('no-reply-email')->getValue(), + 'smtp-port' => Setting::getSetting('smtp-port')->getValue(), + 'smtp-host' => Setting::getSetting('smtp-host')->getValue(), + 'smtp-user' => Setting::getSetting('smtp-user')->getValue(), + 'registration' => Setting::getSetting('registration')->getValue(), + 'departments' => Department::getDepartmentNames(), + 'supportedLanguages' => Language::getSupportedLanguages(), + 'allowedLanguages' => Language::getAllowedLanguages() + ]; + } else { + $settingsList = [ + 'language' => Setting::getSetting('language')->getValue(), + 'reCaptchaKey' => Setting::getSetting('recaptcha-public')->getValue(), + 'time-zone' => Setting::getSetting('time-zone')->getValue(), + 'maintenance-mode' => Setting::getSetting('maintenance-mode')->getValue() * 1, + 'layout' => Setting::getSetting('layout')->getValue(), + 'allow-attachments' => Setting::getSetting('allow-attachments')->getValue() * 1, + 'max-size' => Setting::getSetting('max-size')->getValue(), + 'title' => Setting::getSetting('title')->getValue(), + 'registration' => Setting::getSetting('registration')->getValue(), + 'departments' => Department::getDepartmentNames(), + 'supportedLanguages' => Language::getSupportedLanguages(), + 'allowedLanguages' => Language::getAllowedLanguages(), + 'user-system-enabled' => Setting::getSetting('user-system-enabled')->getValue() * 1 + ]; + } } Response::respondSuccess($settingsList); diff --git a/server/controllers/system/init-database.php b/server/controllers/system/init-database.php index 73d539be..a360bff5 100644 --- a/server/controllers/system/init-database.php +++ b/server/controllers/system/init-database.php @@ -14,17 +14,43 @@ class InitDatabaseController extends Controller { } public function handler() { - if(defined('MYSQL_HOST')) { + if(InstallationDoneController::isInstallationDone()) { throw new Exception(ERRORS::INIT_SETTINGS_DONE); - return; + } + + $dbHost = Controller::request('dbHost'); + $dbName = Controller::request('dbName'); + $dbUser = Controller::request('dbUser'); + $dbPass = Controller::request('dbPassword'); + + if(!defined('MYSQL_HOST')) { + RedBean::setup('mysql:host=' . $dbHost, $dbUser, $dbPass); + } + + if($dbName) { + RedBean::addDatabase($dbName, 'mysql:host='. $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass); + RedBean::selectDatabase($dbName); + + if(!RedBean::testConnection()) { + throw new Exception(ERRORS::DATABASE_CONNECTION); + } + } else { + $dbName = 'opensupports_' . Hashing::generateRandomNumber(100, 999); + RedBean::exec('CREATE DATABASE ' . $dbName); + RedBean::addDatabase($dbName, 'mysql:host='. $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass); + RedBean::selectDatabase($dbName); + + if(!RedBean::testConnection()) { + throw new Exception(ERRORS::DATABASE_CREATION); + } } $configFile = fopen('config.php', 'w+') or die(ERRORS::INVALID_FILE); $content = ' !!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), + 'ticket-gap' => Hashing::generateRandomPrime(1000000, 9999999), + 'file-gap' => Hashing::generateRandomPrime(1000000, 9999999), + 'file-first-number' => Hashing::generateRandomNumber(1000000, 9999999), 'file-quantity' => 0 ]); } diff --git a/server/controllers/system/installation-done.php b/server/controllers/system/installation-done.php index 64f52386..ace2d667 100644 --- a/server/controllers/system/installation-done.php +++ b/server/controllers/system/installation-done.php @@ -5,6 +5,10 @@ class InstallationDoneController extends Controller { const PATH = '/installation-done'; const METHOD = 'POST'; + public static function isInstallationDone() { + return RedBean::testConnection() && !Setting::isTableEmpty() && !Staff::isTableEmpty(); + } + public function validations() { return [ 'permission' => 'any', @@ -13,7 +17,7 @@ class InstallationDoneController extends Controller { } public function handler() { - if(RedBean::testConnection() && !Setting::isTableEmpty() && !Staff::isTableEmpty()) { + if(InstallationDoneController::isInstallationDone()) { Response::respondSuccess(1); } else { Response::respondSuccess(0); diff --git a/server/controllers/ticket/comment.php b/server/controllers/ticket/comment.php index 5f401d85..333b6eb8 100644 --- a/server/controllers/ticket/comment.php +++ b/server/controllers/ticket/comment.php @@ -99,8 +99,8 @@ class CommentController extends Controller { $mailSender = new MailSender(); $mailSender->setTemplate(MailTemplate::TICKET_RESPONDED, [ - 'to' => $this->ticket->author->email, - 'name' => $this->ticket->author->name, + 'to' => ($this->ticket->author) ? $this->ticket->author->email : $this->ticket->authorEmail, + 'name' => ($this->ticket->author) ? $this->ticket->author->name : $this->ticket->authorName, 'ticketNumber' => $this->ticket->ticketNumber, 'title' => $this->ticket->title, 'url' => Setting::getSetting('url')->getValue() diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index d75c7e2b..22f2291b 100644 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -41,4 +41,6 @@ class ERRORS { const INVALID_PERIOD = 'INVALID_PERIOD'; const NAME_ALREADY_USED = 'NAME_ALREADY_USED'; const INVALID_FILE = 'INVALID_FILE'; + const DATABASE_CONNECTION = 'DATABASE_CONNECTION'; + const DATABASE_CREATION = 'DATABASE_CREATION'; } diff --git a/server/index.php b/server/index.php index e8eb2c4d..083cb613 100644 --- a/server/index.php +++ b/server/index.php @@ -1,5 +1,5 @@ validate(); $this->handler(); } catch (\Exception $exception) { - Response::respondError($exception->getMessage()); + Response::respondError($exception->getMessage() . ' on line ' . $exception->getFile() . ':' . $exception->getLine()); return; } }; diff --git a/server/models/Ticketevent.php b/server/models/Ticketevent.php index a8a23fed..c178d349 100644 --- a/server/models/Ticketevent.php +++ b/server/models/Ticketevent.php @@ -60,15 +60,15 @@ class Ticketevent extends DataStore { } public function toArray() { - $user = ($this->authorUser instanceof User) ? $this->authorUser : $this->authorStaff; + $user = ($this->authorStaff) ? $this->authorStaff : $this->authorUser; return [ 'type' => $this->type, 'ticketNumber' => $this->ticket->ticketNumber, 'author' => [ - 'name' => $user->name, + 'name' => $user ? $user->name : null, 'staff' => $user instanceOf Staff, - 'id' => $user->id + 'id' => $user ? $user->id : null ] ]; }