Merge pull request #452 from MyIgel/rebuild-database

Rebuild database
main
msquare 6 years ago committed by GitHub
commit a103bc06e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -29,15 +29,14 @@ before_script:
- &before_install_xdebug |- - &before_install_xdebug |-
pecl install xdebug pecl install xdebug
docker-php-ext-enable xdebug docker-php-ext-enable xdebug
# MySQL DB
- &before_setup_mysql |-
apt install -yqq mariadb-client
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < db/install.sql
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < db/update.sql
# Install Composer # Install Composer
- &before_install_composer |- - &before_install_composer |-
curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
composer --no-ansi install composer --no-ansi install
# MySQL DB
- &before_setup_mysql |-
chmod +x ./bin/migrate
./bin/migrate
# Install Node.js and Yarn # Install Node.js and Yarn
- &before_install_yarn |- - &before_install_yarn |-
apt -yqq install gnupg2 apt-transport-https apt -yqq install gnupg2 apt-transport-https
@ -86,7 +85,7 @@ test:7.1:
# Install project and dependencies # Install project and dependencies
- &deployment_dependencies |- - &deployment_dependencies |-
chmod +x ./deploy.sh chmod +x ./bin/deploy.sh
apt update && apt install -yqq rsync openssh-client apt update && apt install -yqq rsync openssh-client
composer --no-ansi install --no-dev composer --no-ansi install --no-dev
composer --no-ansi dump-autoload --optimize composer --no-ansi dump-autoload --optimize
@ -116,7 +115,7 @@ deploy_staging:
- *deployment_ssh - *deployment_ssh
- *deployment_dependencies - *deployment_dependencies
# Deploy to server # Deploy to server
- ./deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}" - ./bin/deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"
deploy_production: deploy_production:
<<: *deploy_definition <<: *deploy_definition
@ -133,4 +132,4 @@ deploy_production:
- *deployment_ssh - *deployment_ssh
- *deployment_dependencies - *deployment_dependencies
# Deploy to server # Deploy to server
- ./deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}" - ./bin/deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"

@ -41,8 +41,8 @@ To report bugs use [engelsystem/issues](https://github.com/engelsystem/engelsyst
* Recommended: Directory Listing should be disabled. * Recommended: Directory Listing should be disabled.
* There must a be MySQL database created with a user who has full rights to that database. * There must a be MySQL database created with a user who has full rights to that database.
* It must be created by the ```db/install.sql``` and ```db/update.sql``` files.
* If necessary, create a ```config/config.php``` to override values from ```config/config.default.php```. * If necessary, create a ```config/config.php``` to override values from ```config/config.default.php```.
* To import the database the ```bin/migrate``` script has to be called.
* In the browser, login with credentials ```admin```:```asdfasdf``` and change the password. * In the browser, login with credentials ```admin```:```asdfasdf``` and change the password.
Engelsystem can now be used. Engelsystem can now be used.
@ -103,10 +103,16 @@ docker exec -i db_container mysql -u engelsystem -pengelsystem engelsystem < db/
To be able to send mails a relay is needed. Set `SMTPHOST=[mail container]` to configure it. To be able to send mails a relay is needed. Set `SMTPHOST=[mail container]` to configure it.
#### deploy.sh #### Scripts
The `deploy.sh` script can be used to deploy the engelsystem. It uses rsync to deploy the application to a server over ssh. ##### bin/deploy.sh
The `bin/deploy.sh` script can be used to deploy the engelsystem. It uses rsync to deploy the application to a server over ssh.
For usage see `./deploy.sh -h` For usage see `./bin/deploy.sh -h`
##### bin/migrate
The `bin/migrate` script can be used to import and update the database of the engelsystem.
For more information on how to use it call `bin/migrate help`
### Codestyle ### Codestyle
Please ensure that your pull requests follow [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/). Please ensure that your pull requests follow [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/).

@ -0,0 +1,38 @@
#!/usr/bin/env php
<?php
use Composer\Autoload\ClassLoader;
use Engelsystem\Application;
use Engelsystem\Database\Migration\Migrate;
use Engelsystem\Database\Migration\MigrationServiceProvider;
require_once __DIR__ . '/../includes/application.php';
/** @var $loader ClassLoader */
$baseDir = __DIR__ . '/../db/migrations';
/** @var Application $app */
$app = app();
$app->register(MigrationServiceProvider::class);
/** @var Migrate $migration */
$migration = $app->get('db.migration');
$migration->setOutput(function ($text) { echo $text . PHP_EOL; });
if (isset($argv[1]) && strtolower($argv[1]) == 'help') {
echo PHP_EOL . 'Usage: ' . $argv[1] . ' [up|down] [one-step]' . PHP_EOL . PHP_EOL;
exit;
}
$method = Migrate::UP;
if (isset($argv[1]) && strtolower($argv[1]) == 'down') {
$argv = array_values($argv);
$method = Migrate::DOWN;
}
$oneStep = false;
if (isset($argv[2]) && strtolower($argv[2]) == 'one-step') {
$oneStep = true;
}
$migration->run($baseDir, $method, $oneStep);

@ -17,6 +17,8 @@
"php": ">=7.0.0", "php": ">=7.0.0",
"erusev/parsedown": "^1.6", "erusev/parsedown": "^1.6",
"illuminate/container": "5.5.*", "illuminate/container": "5.5.*",
"illuminate/database": "5.5.*",
"illuminate/support": "^5.5",
"psr/container": "^1.0", "psr/container": "^1.0",
"psr/log": "^1.0", "psr/log": "^1.0",
"symfony/http-foundation": "^3.3" "symfony/http-foundation": "^3.3"

@ -6,9 +6,9 @@ return [
// MySQL-Connection Settings // MySQL-Connection Settings
'database' => [ 'database' => [
'host' => env('MYSQL_HOST', (env('CI', false) ? 'mariadb' : 'localhost')), 'host' => env('MYSQL_HOST', (env('CI', false) ? 'mariadb' : 'localhost')),
'user' => env('MYSQL_USER', 'root'), 'database' => env('MYSQL_DATABASE', 'engelsystem'),
'pw' => env('MYSQL_PASSWORD', ''), 'username' => env('MYSQL_USER', 'root'),
'db' => env('MYSQL_DATABASE', 'engelsystem'), 'password' => env('MYSQL_PASSWORD', ''),
], ],
// For accessing stats // For accessing stats

@ -0,0 +1,59 @@
<?php
use Engelsystem\Database\Migration\Migration;
class ImportInstallSql extends Migration
{
protected $oldTables = [
'AngelTypes',
'EventConfig',
'GroupPrivileges',
'Groups',
'LogEntries',
'Messages',
'NeededAngelTypes',
'News',
'NewsComments',
'Privileges',
'Questions',
'Room',
'ShiftEntry',
'Shifts',
'ShiftTypes',
'User',
'UserAngelTypes',
'UserDriverLicenses',
'UserGroups',
];
/**
* Run the migration
*/
public function up()
{
foreach ($this->oldTables as $table) {
if ($this->schema->hasTable($table)) {
return;
}
}
$sql = file_get_contents(__DIR__ . '/../install.sql');
$this->schema->getConnection()->unprepared($sql);
}
/**
* Reverse the migration
*/
public
function down()
{
$this->schema->getConnection()->statement('SET FOREIGN_KEY_CHECKS=0;');
foreach ($this->oldTables as $table) {
if ($this->schema->hasTable($table)) {
$this->schema->dropIfExists($table);
}
}
}
}

@ -0,0 +1,27 @@
<?php
use Engelsystem\Database\Migration\Migration;
class ImportUpdateSql extends Migration
{
/**
* Run the migration
*/
public function up()
{
if ($this->schema->hasTable('UserWorkLog')) {
return;
}
$sql = file_get_contents(__DIR__ . '/../update.sql');
$this->schema->getConnection()->unprepared($sql);
}
/**
* Reverse the migration
*/
public function down()
{
$this->schema->dropIfExists('UserWorkLog');
}
}

@ -0,0 +1,37 @@
<?php
use Engelsystem\Application;
use Engelsystem\Config\Config;
use Engelsystem\Exceptions\Handler;
use Engelsystem\Exceptions\Handlers\HandlerInterface;
/**
* Include the autoloader
*/
require_once __DIR__ . '/autoload.php';
/**
* Initialize and bootstrap the application
*/
$app = new Application(realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'));
$appConfig = $app->make(Config::class);
$appConfig->set(require config_path('app.php'));
$app->bootstrap($appConfig);
/**
* Configure application
*/
date_default_timezone_set($app->get('config')->get('timezone'));
if (config('environment') == 'development') {
$errorHandler = $app->get('error.handler');
$errorHandler->setEnvironment(Handler::ENV_DEVELOPMENT);
$app->bind(HandlerInterface::class, 'error.handler.development');
ini_set('display_errors', true);
error_reporting(E_ALL);
} else {
ini_set('display_errors', false);
}

@ -2,7 +2,8 @@
// Check for autoloader // Check for autoloader
if (!is_readable(__DIR__ . '/../vendor/autoload.php')) { if (!is_readable(__DIR__ . '/../vendor/autoload.php')) {
die('Please run composer.phar install'); echo 'Please run composer.phar install';
exit(1);
} }
// Include composer autoloader // Include composer autoloader

@ -154,7 +154,7 @@ function angeltype_edit_controller()
$angeltype['contact_email'] = strip_request_item('contact_email', $angeltype['contact_email']); $angeltype['contact_email'] = strip_request_item('contact_email', $angeltype['contact_email']);
if ($valid) { if ($valid) {
if ($angeltype['id'] != null) { if (!empty($angeltype['id'])) {
AngelType_update($angeltype); AngelType_update($angeltype);
} else { } else {
$angeltype = AngelType_create($angeltype); $angeltype = AngelType_create($angeltype);
@ -308,7 +308,7 @@ function angeltypes_list_controller()
} }
$angeltype['membership'] = AngelType_render_membership($angeltype); $angeltype['membership'] = AngelType_render_membership($angeltype);
if ($angeltype['user_angeltype_id'] != null) { if (!empty($angeltype['user_angeltype_id'])) {
$actions[] = button( $actions[] = button(
page_link_to('user_angeltypes', page_link_to('user_angeltypes',
['action' => 'delete', 'user_angeltype_id' => $angeltype['user_angeltype_id']] ['action' => 'delete', 'user_angeltype_id' => $angeltype['user_angeltype_id']]
@ -355,7 +355,7 @@ function load_angeltype()
} }
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist . ')); error(_('Angeltype doesn\'t exist . '));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }

@ -28,7 +28,7 @@ function event_config_edit_controller()
$teardown_end_date = null; $teardown_end_date = null;
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config != null) { if (!empty($event_config)) {
$event_name = $event_config['event_name']; $event_name = $event_config['event_name'];
$buildup_start_date = $event_config['buildup_start_date']; $buildup_start_date = $event_config['buildup_start_date'];
$event_start_date = $event_config['event_start_date']; $event_start_date = $event_config['event_start_date'];
@ -70,22 +70,22 @@ function event_config_edit_controller()
$teardown_end_date = $result->getValue(); $teardown_end_date = $result->getValue();
$valid &= $result->isValid(); $valid &= $result->isValid();
if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) { if (!is_null($buildup_start_date) && !is_null($event_start_date) && $buildup_start_date > $event_start_date) {
$valid = false; $valid = false;
error(_('The buildup start date has to be before the event start date.')); error(_('The buildup start date has to be before the event start date.'));
} }
if ($event_start_date != null && $event_end_date != null && $event_start_date > $event_end_date) { if (!is_null($event_start_date) && !is_null($event_end_date) && $event_start_date > $event_end_date) {
$valid = false; $valid = false;
error(_('The event start date has to be before the event end date.')); error(_('The event start date has to be before the event end date.'));
} }
if ($event_end_date != null && $teardown_end_date != null && $event_end_date > $teardown_end_date) { if (!is_null($event_end_date) && !is_null($teardown_end_date) && $event_end_date > $teardown_end_date) {
$valid = false; $valid = false;
error(_('The event end date has to be before the teardown end date.')); error(_('The event end date has to be before the teardown end date.'));
} }
if ($buildup_start_date != null && $teardown_end_date != null && $buildup_start_date > $teardown_end_date) { if (!is_null($buildup_start_date) && !is_null($teardown_end_date) && $buildup_start_date > $teardown_end_date) {
$valid = false; $valid = false;
error(_('The buildup start date has to be before the teardown end date.')); error(_('The buildup start date has to be before the teardown end date.'));
} }

@ -110,7 +110,7 @@ function load_room()
} }
$room = Room(request()->input('room_id')); $room = Room(request()->input('room_id'));
if ($room == null) { if (empty($room)) {
redirect(page_link_to()); redirect(page_link_to());
} }

@ -16,7 +16,7 @@ function shift_entries_controller()
} }
$action = strip_request_item('action'); $action = strip_request_item('action');
if ($action == null) { if (empty($action)) {
redirect(user_link($user)); redirect(user_link($user));
} }
@ -43,7 +43,7 @@ function shift_entry_create_controller()
} }
$shift = Shift($request->input('shift_id')); $shift = Shift($request->input('shift_id'));
if ($shift == null) { if (empty($shift)) {
redirect(user_link($user)); redirect(user_link($user));
} }
@ -53,7 +53,7 @@ function shift_entry_create_controller()
return shift_entry_create_controller_admin($shift, $angeltype); return shift_entry_create_controller_admin($shift, $angeltype);
} }
if ($angeltype == null) { if (empty($angeltype)) {
redirect(user_link($user)); redirect(user_link($user));
} }
@ -81,7 +81,7 @@ function shift_entry_create_controller_admin($shift, $angeltype)
if ($request->has('user_id')) { if ($request->has('user_id')) {
$signup_user = User($request->input('user_id')); $signup_user = User($request->input('user_id'));
} }
if ($signup_user == null) { if (empty($signup_user)) {
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
@ -89,7 +89,7 @@ function shift_entry_create_controller_admin($shift, $angeltype)
if ($request->has('angeltype_id')) { if ($request->has('angeltype_id')) {
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
} }
if ($angeltype == null) { if (empty($angeltype)) {
if (count($angeltypes) == 0) { if (count($angeltypes) == 0) {
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
@ -321,7 +321,7 @@ function shift_entry_load()
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
$shiftEntry = ShiftEntry($request->input('shift_entry_id')); $shiftEntry = ShiftEntry($request->input('shift_entry_id'));
if ($shiftEntry == null) { if (empty($shiftEntry)) {
error(_('Shift entry not found.')); error(_('Shift entry not found.'));
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }

@ -217,7 +217,7 @@ function shift_delete_controller()
$shift_id = $request->input('delete_shift'); $shift_id = $request->input('delete_shift');
$shift = Shift($shift_id); $shift = Shift($shift_id);
if ($shift == null) { if (empty($shift)) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
@ -264,7 +264,7 @@ function shift_controller()
} }
$shift = Shift($request->input('shift_id')); $shift = Shift($request->input('shift_id'));
if ($shift == null) { if (empty($shift)) {
error(_('Shift could not be found.')); error(_('Shift could not be found.'));
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
@ -277,6 +277,10 @@ function shift_controller()
$shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0); $shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0);
foreach ($angeltypes as &$angeltype) { foreach ($angeltypes as &$angeltype) {
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype); $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype);
if(empty($needed_angeltype)) {
continue;
}
$shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']); $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']);
$angeltype_signup_state = Shift_signup_allowed( $angeltype_signup_state = Shift_signup_allowed(
@ -288,11 +292,7 @@ function shift_controller()
$needed_angeltype, $needed_angeltype,
$shift_entries $shift_entries
); );
if ($shift_signup_state == null) {
$shift_signup_state = $angeltype_signup_state;
} else {
$shift_signup_state->combineWith($angeltype_signup_state); $shift_signup_state->combineWith($angeltype_signup_state);
}
$angeltype['shift_signup_state'] = $angeltype_signup_state; $angeltype['shift_signup_state'] = $angeltype_signup_state;
} }
@ -361,7 +361,7 @@ function shifts_json_export_controller()
$key = $request->input('key'); $key = $request->input('key');
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if (empty($user)) {
engelsystem_error('Key invalid.'); engelsystem_error('Key invalid.');
} }
if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) { if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) {

@ -22,8 +22,7 @@ function shifttype_delete_controller()
} }
$shifttype = ShiftType($request->input('shifttype_id')); $shifttype = ShiftType($request->input('shifttype_id'));
if (empty($shifttype)) {
if ($shifttype == null) {
redirect(page_link_to('shifttypes')); redirect(page_link_to('shifttypes'));
} }
@ -58,7 +57,7 @@ function shifttype_edit_controller()
if ($request->has('shifttype_id')) { if ($request->has('shifttype_id')) {
$shifttype = ShiftType($request->input('shifttype_id')); $shifttype = ShiftType($request->input('shifttype_id'));
if ($shifttype == null) { if (empty($shifttype)) {
error(_('Shifttype not found.')); error(_('Shifttype not found.'));
redirect(page_link_to('shifttypes')); redirect(page_link_to('shifttypes'));
} }
@ -120,12 +119,12 @@ function shifttype_controller()
redirect(page_link_to('shifttypes')); redirect(page_link_to('shifttypes'));
} }
$shifttype = ShiftType($request->input('shifttype_id')); $shifttype = ShiftType($request->input('shifttype_id'));
if ($shifttype == null) { if (empty($shifttype)) {
redirect(page_link_to('shifttypes')); redirect(page_link_to('shifttypes'));
} }
$angeltype = null; $angeltype = [];
if ($shifttype['angeltype_id'] != null) { if (!empty($shifttype['angeltype_id'])) {
$angeltype = AngelType($shifttype['angeltype_id']); $angeltype = AngelType($shifttype['angeltype_id']);
} }

@ -45,7 +45,7 @@ function user_angeltypes_delete_all_controller()
} }
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist.')); error(_('Angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -85,7 +85,7 @@ function user_angeltypes_confirm_all_controller()
} }
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist.')); error(_('Angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -125,13 +125,13 @@ function user_angeltype_confirm_controller()
} }
$user_angeltype = UserAngelType($request->input('user_angeltype_id')); $user_angeltype = UserAngelType($request->input('user_angeltype_id'));
if ($user_angeltype == null) { if (empty($user_angeltype)) {
error(_('User angeltype doesn\'t exist.')); error(_('User angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($user_angeltype['angeltype_id']); $angeltype = AngelType($user_angeltype['angeltype_id']);
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist.')); error(_('Angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -142,7 +142,7 @@ function user_angeltype_confirm_controller()
} }
$user_source = User($user_angeltype['user_id']); $user_source = User($user_angeltype['user_id']);
if ($user_source == null) { if (empty($user_source)) {
error(_('User doesn\'t exist.')); error(_('User doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -185,19 +185,19 @@ function user_angeltype_delete_controller()
} }
$user_angeltype = UserAngelType($request->input('user_angeltype_id')); $user_angeltype = UserAngelType($request->input('user_angeltype_id'));
if ($user_angeltype == null) { if (empty($user_angeltype)) {
error(_('User angeltype doesn\'t exist.')); error(_('User angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($user_angeltype['angeltype_id']); $angeltype = AngelType($user_angeltype['angeltype_id']);
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist.')); error(_('Angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$user_source = User($user_angeltype['user_id']); $user_source = User($user_angeltype['user_id']);
if ($user_source == null) { if (empty($user_source)) {
error(_('User doesn\'t exist.')); error(_('User doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -252,19 +252,19 @@ function user_angeltype_update_controller()
} }
$user_angeltype = UserAngelType($request->input('user_angeltype_id')); $user_angeltype = UserAngelType($request->input('user_angeltype_id'));
if ($user_angeltype == null) { if (empty($user_angeltype)) {
error(_('User angeltype doesn\'t exist.')); error(_('User angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$angeltype = AngelType($user_angeltype['angeltype_id']); $angeltype = AngelType($user_angeltype['angeltype_id']);
if ($angeltype == null) { if (empty($angeltype)) {
error(_('Angeltype doesn\'t exist.')); error(_('Angeltype doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
$user_source = User($user_angeltype['user_id']); $user_source = User($user_angeltype['user_id']);
if ($user_source == null) { if (empty($user_source)) {
error(_('User doesn\'t exist.')); error(_('User doesn\'t exist.'));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }
@ -359,7 +359,7 @@ function user_angeltype_join_controller($angeltype)
global $user, $privileges; global $user, $privileges;
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
if ($user_angeltype != null) { if (!empty($user_angeltype)) {
error(sprintf(_('You are already a %s.'), $angeltype['name'])); error(sprintf(_('You are already a %s.'), $angeltype['name']));
redirect(page_link_to('angeltypes')); redirect(page_link_to('angeltypes'));
} }

@ -14,7 +14,7 @@ function user_driver_license_required_hint()
$user_driver_license = UserDriverLicense($user['UID']); $user_driver_license = UserDriverLicense($user['UID']);
// User has already entered data, no hint needed. // User has already entered data, no hint needed.
if ($user_driver_license != null) { if (!empty($user_driver_license)) {
return null; return null;
} }
@ -60,7 +60,7 @@ function user_driver_licenses_controller()
*/ */
function user_driver_license_edit_link($user = null) function user_driver_license_edit_link($user = null)
{ {
if ($user == null) { if (empty($user)) {
return page_link_to('user_driver_licenses'); return page_link_to('user_driver_licenses');
} }
return page_link_to('user_driver_licenses', ['user_id' => $user['UID']]); return page_link_to('user_driver_licenses', ['user_id' => $user['UID']]);
@ -79,7 +79,7 @@ function user_driver_license_load_user()
if ($request->has('user_id')) { if ($request->has('user_id')) {
$user_source = User($request->input('user_id')); $user_source = User($request->input('user_id'));
if ($user_source == null) { if (empty($user_source)) {
redirect(user_driver_license_edit_link()); redirect(user_driver_license_edit_link());
} }
} }
@ -104,7 +104,7 @@ function user_driver_license_edit_controller()
} }
$user_driver_license = UserDriverLicense($user_source['UID']); $user_driver_license = UserDriverLicense($user_source['UID']);
if ($user_driver_license == null) { if (empty($user_driver_license)) {
$wants_to_drive = false; $wants_to_drive = false;
$user_driver_license = UserDriverLicense_new(); $user_driver_license = UserDriverLicense_new();
} else { } else {
@ -122,7 +122,7 @@ function user_driver_license_edit_controller()
$user_driver_license['has_license_forklift'] = $request->has('has_license_forklift'); $user_driver_license['has_license_forklift'] = $request->has('has_license_forklift');
if (UserDriverLicense_valid($user_driver_license)) { if (UserDriverLicense_valid($user_driver_license)) {
if ($user_driver_license['user_id'] == null) { if (empty($user_driver_license['user_id'])) {
$user_driver_license = UserDriverLicenses_create($user_driver_license, $user_source); $user_driver_license = UserDriverLicenses_create($user_driver_license, $user_source);
} else { } else {
UserDriverLicenses_update($user_driver_license); UserDriverLicenses_update($user_driver_license);
@ -133,7 +133,7 @@ function user_driver_license_edit_controller()
} else { } else {
error(_('Please select at least one driving license.')); error(_('Please select at least one driving license.'));
} }
} elseif ($user_driver_license['user_id'] != null) { } elseif (!empty($user_driver_license['user_id'])) {
UserDriverLicenses_delete($user_source['UID']); UserDriverLicenses_delete($user_source['UID']);
engelsystem_log('Driver license information removed.'); engelsystem_log('Driver license information removed.');
success(_('Your driver license information has been removed.')); success(_('Your driver license information has been removed.'));

@ -2,6 +2,8 @@
/** /**
* Delete a work log entry. * Delete a work log entry.
*
* @return array
*/ */
function user_worklog_delete_controller() function user_worklog_delete_controller()
{ {
@ -29,6 +31,8 @@ function user_worklog_delete_controller()
/** /**
* Edit work log for user. * Edit work log for user.
*
* @return array
*/ */
function user_worklog_edit_controller() function user_worklog_edit_controller()
{ {
@ -59,9 +63,10 @@ function user_worklog_edit_controller()
} }
/** /**
* Handle form
* *
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @return [bool $valid, UserWorkLog $userWorkLog] * @return array [bool $valid, UserWorkLog $userWorkLog]
*/ */
function user_worklog_from_request($userWorkLog) function user_worklog_from_request($userWorkLog)
{ {
@ -69,8 +74,11 @@ function user_worklog_from_request($userWorkLog)
$valid = true; $valid = true;
$userWorkLog['work_timestamp'] = parse_date('Y-m-d H:i', $request->input('work_timestamp') . ' 00:00'); $userWorkLog['work_timestamp'] = parse_date(
if ($userWorkLog['work_timestamp'] == null) { 'Y-m-d H:i',
$request->input('work_timestamp') . ' 00:00'
);
if (is_null($userWorkLog['work_timestamp'])) {
$valid = false; $valid = false;
error(_('Please enter work date.')); error(_('Please enter work date.'));
} }
@ -95,6 +103,8 @@ function user_worklog_from_request($userWorkLog)
/** /**
* Add work log entry to user. * Add work log entry to user.
*
* @return array
*/ */
function user_worklog_add_controller() function user_worklog_add_controller()
{ {
@ -128,7 +138,9 @@ function user_worklog_add_controller()
/** /**
* Link to work log entry add for given user. * Link to work log entry add for given user.
* *
* @param User $user * @param array $user
*
* @return string
*/ */
function user_worklog_add_link($user) function user_worklog_add_link($user)
{ {
@ -141,7 +153,8 @@ function user_worklog_add_link($user)
/** /**
* Link to work log entry edit. * Link to work log entry edit.
* *
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @return string
*/ */
function user_worklog_edit_link($userWorkLog) function user_worklog_edit_link($userWorkLog)
{ {
@ -154,8 +167,9 @@ function user_worklog_edit_link($userWorkLog)
/** /**
* Link to work log entry delete. * Link to work log entry delete.
* *
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @param array[] $parameters * @param array[] $parameters
* @return string
*/ */
function user_worklog_delete_link($userWorkLog, $parameters = []) function user_worklog_delete_link($userWorkLog, $parameters = [])
{ {
@ -167,8 +181,10 @@ function user_worklog_delete_link($userWorkLog, $parameters = [])
/** /**
* Work log entry actions * Work log entry actions
*
* @return array
*/ */
function user_worklogs_controller() function user_worklog_controller()
{ {
global $user, $privileges; global $user, $privileges;
@ -191,5 +207,3 @@ function user_worklogs_controller()
return user_worklog_delete_controller(); return user_worklog_delete_controller();
} }
} }
?>

@ -190,7 +190,7 @@ function user_controller()
$user_source = $user; $user_source = $user;
if ($request->has('user_id')) { if ($request->has('user_id')) {
$user_source = User($request->input('user_id')); $user_source = User($request->input('user_id'));
if ($user_source == null) { if (empty($user_source)) {
error(_('User not found.')); error(_('User not found.'));
redirect(page_link_to('/')); redirect(page_link_to('/'));
} }
@ -297,7 +297,7 @@ function user_password_recovery_set_new_controller()
{ {
$request = request(); $request = request();
$user_source = User_by_password_recovery_token($request->input('token')); $user_source = User_by_password_recovery_token($request->input('token'));
if ($user_source == null) { if (empty($user_source)) {
error(_('Token is not correct.')); error(_('Token is not correct.'));
redirect(page_link_to('login')); redirect(page_link_to('login'));
} }
@ -343,7 +343,7 @@ function user_password_recovery_start_controller()
$email = strip_request_item('email'); $email = strip_request_item('email');
if (check_email($email)) { if (check_email($email)) {
$user_source = User_by_email($email); $user_source = User_by_email($email);
if ($user_source == null) { if (empty($user_source)) {
$valid = false; $valid = false;
error(_('E-mail address is not correct.')); error(_('E-mail address is not correct.'));
} }
@ -412,8 +412,7 @@ function load_user()
} }
$user = User($request->input('user_id')); $user = User($request->input('user_id'));
if (empty($user)) {
if ($user == null) {
error(_('User doesn\'t exist.')); error(_('User doesn\'t exist.'));
redirect(page_link_to()); redirect(page_link_to());
} }

@ -1,14 +1,9 @@
<?php <?php
use Engelsystem\Application;
use Engelsystem\Config\Config;
use Engelsystem\Exceptions\Handler;
use Engelsystem\Exceptions\Handlers\HandlerInterface;
/** /**
* This file includes all needed functions, connects to the db etc. * Bootstrap application
*/ */
require_once __DIR__ . '/autoload.php'; require __DIR__ . '/application.php';
/** /**
@ -17,31 +12,6 @@ require_once __DIR__ . '/autoload.php';
require __DIR__ . '/includes.php'; require __DIR__ . '/includes.php';
/**
* Initialize and bootstrap the application
*/
$app = new Application(realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'));
$appConfig = $app->make(Config::class);
$appConfig->set(require config_path('app.php'));
$app->bootstrap($appConfig);
/**
* Configure application
*/
date_default_timezone_set($app->get('config')->get('timezone'));
if (config('environment') == 'development') {
$errorHandler = $app->get('error.handler');
$errorHandler->setEnvironment(Handler::ENV_DEVELOPMENT);
$app->bind(HandlerInterface::class, 'error.handler.development');
ini_set('display_errors', true);
error_reporting(E_ALL);
} else {
ini_set('display_errors', false);
}
/** /**
* Check for maintenance * Check for maintenance
*/ */

@ -48,7 +48,7 @@ function gettext_init()
*/ */
function gettext_locale($locale = null) function gettext_locale($locale = null)
{ {
if ($locale == null) { if (empty($locale)) {
$locale = session()->get('locale'); $locale = session()->get('locale');
} }

@ -159,7 +159,7 @@ function AngelType_validate_name($name, $angeltype)
if ($name == '') { if ($name == '') {
return new ValidationResult(false, ''); return new ValidationResult(false, '');
} }
if ($angeltype != null && isset($angeltype['id'])) { if (!empty($angeltype) && isset($angeltype['id'])) {
$valid = (count(DB::select(' $valid = (count(DB::select('
SELECT `id` SELECT `id`
FROM `AngelTypes` FROM `AngelTypes`
@ -229,8 +229,10 @@ function AngelType_ids()
*/ */
function AngelType($angeltype_id) function AngelType($angeltype_id)
{ {
return DB::selectOne( $angelType = DB::selectOne(
'SELECT * FROM `AngelTypes` WHERE `id`=?', 'SELECT * FROM `AngelTypes` WHERE `id`=?',
[$angeltype_id] [$angeltype_id]
); );
return empty($angelType) ? null : $angelType;
} }

@ -9,7 +9,9 @@ use Engelsystem\Database\DB;
*/ */
function EventConfig() function EventConfig()
{ {
return DB::selectOne('SELECT * FROM `EventConfig` LIMIT 1'); $config = DB::selectOne('SELECT * FROM `EventConfig` LIMIT 1');
return empty($config) ? null : $config;
} }
/** /**
@ -21,7 +23,7 @@ function EventConfig()
* @param int $event_end_date * @param int $event_end_date
* @param int $teardown_end_date * @param int $teardown_end_date
* @param string $event_welcome_msg * @param string $event_welcome_msg
* @return int Rows updated * @return bool
*/ */
function EventConfig_update( function EventConfig_update(
$event_name, $event_name,
@ -31,7 +33,8 @@ function EventConfig_update(
$teardown_end_date, $teardown_end_date,
$event_welcome_msg $event_welcome_msg
) { ) {
if (EventConfig() == null) { $eventConfig = EventConfig();
if (empty($eventConfig)) {
return DB::insert(' return DB::insert('
INSERT INTO `EventConfig` ( INSERT INTO `EventConfig` (
`event_name`, `event_name`,
@ -54,7 +57,7 @@ function EventConfig_update(
); );
} }
return DB::update(' return (bool)DB::update('
UPDATE `EventConfig` SET UPDATE `EventConfig` SET
`event_name` = ?, `event_name` = ?,
`buildup_start_date` = ?, `buildup_start_date` = ?,

@ -58,5 +58,5 @@ function LogEntries_filter($keyword)
*/ */
function LogEntries_clear_all() function LogEntries_clear_all()
{ {
return DB::statement('TRUNCATE `LogEntries`'); return DB::connection()->statement('TRUNCATE `LogEntries`');
} }

@ -20,7 +20,9 @@ function Message_ids()
*/ */
function Message($message_id) function Message($message_id)
{ {
return DB::selectOne('SELECT * FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]); $message = DB::selectOne('SELECT * FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]);
return empty($message) ? null : $message;
} }
/** /**

@ -148,14 +148,16 @@ function Room_update($room_id, $name, $from_frab, $map_url, $description)
* Returns room by id. * Returns room by id.
* *
* @param int $room_id RID * @param int $room_id RID
* @return array|false * @return array|null
*/ */
function Room($room_id) function Room($room_id)
{ {
return DB::selectOne(' $room = DB::selectOne('
SELECT * SELECT *
FROM `Room` FROM `Room`
WHERE `RID` = ?', [ WHERE `RID` = ?', [
$room_id $room_id
]); ]);
return empty($room) ? null : $room;
} }

@ -138,7 +138,9 @@ function ShiftEntry_update($shift_entry)
*/ */
function ShiftEntry($shift_entry_id) function ShiftEntry($shift_entry_id)
{ {
return DB::selectOne('SELECT * FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]); $shiftEntry = DB::selectOne('SELECT * FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]);
return empty($shiftEntry) ? null : $shiftEntry;
} }
/** /**

@ -70,7 +70,9 @@ function ShiftType_create($name, $angeltype_id, $description)
*/ */
function ShiftType($shifttype_id) function ShiftType($shifttype_id)
{ {
return DB::selectOne('SELECT * FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]); $shiftType = DB::selectOne('SELECT * FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]);
return empty($shiftType) ? null : $shiftType;
} }
/** /**

@ -48,7 +48,7 @@ class ShiftsFilter
* @param int[] $rooms * @param int[] $rooms
* @param int[] $types * @param int[] $types
*/ */
public function __construct($user_shifts_admin, $rooms, $types) public function __construct($user_shifts_admin = false, $rooms = [], $types = [])
{ {
$this->rooms = $rooms; $this->rooms = $rooms;
$this->types = $types; $this->types = $types;
@ -62,6 +62,34 @@ class ShiftsFilter
} }
} }
/**
* @return array
*/
public function sessionExport()
{
return [
'userShiftsAdmin' => $this->userShiftsAdmin,
'filled' => $this->filled,
'rooms' => $this->rooms,
'types' => $this->types,
'startTime' => $this->startTime,
'endTime' => $this->endTime,
];
}
/**
* @param array $data
*/
public function sessionImport($data)
{
$this->userShiftsAdmin = $data['userShiftsAdmin'];
$this->filled = $data['filled'];
$this->rooms = $data['rooms'];
$this->types = $data['types'];
$this->startTime = $data['startTime'];
$this->endTime = $data['endTime'];
}
/** /**
* @return int unix timestamp * @return int unix timestamp
*/ */

@ -323,7 +323,7 @@ function Shift_signup_allowed_angel(
return new ShiftSignupState(ShiftSignupState::NOT_ARRIVED, $free_entries); return new ShiftSignupState(ShiftSignupState::NOT_ARRIVED, $free_entries);
} }
if ($user_shifts == null) { if (empty($user_shifts)) {
$user_shifts = Shifts_by_user($user); $user_shifts = Shifts_by_user($user);
} }
@ -349,14 +349,14 @@ function Shift_signup_allowed_angel(
return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries);
} }
if ($user_angeltype == null) { if (empty($user_angeltype)) {
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
} }
if ( if (
$user_angeltype == null empty($user_angeltype)
|| ($angeltype['no_self_signup'] == 1 && $user_angeltype != null) || ($angeltype['no_self_signup'] == 1 && !empty($user_angeltype))
|| ($angeltype['restricted'] == 1 && $user_angeltype != null && !isset($user_angeltype['confirm_user_id'])) || ($angeltype['restricted'] == 1 && !empty($user_angeltype) && !isset($user_angeltype['confirm_user_id']))
) { ) {
// you cannot join if user is not of this angel type // you cannot join if user is not of this angel type
// you cannot join if you are not confirmed // you cannot join if you are not confirmed
@ -552,7 +552,7 @@ function Shift_update($shift)
* Update a shift by its external id. * Update a shift by its external id.
* *
* @param array $shift * @param array $shift
* @return bool|null * @return int
* @throws Exception * @throws Exception
*/ */
function Shift_update_by_psid($shift) function Shift_update_by_psid($shift)

@ -197,11 +197,13 @@ function UserAngelType_create($user, $angeltype)
*/ */
function UserAngelType($user_angeltype_id) function UserAngelType($user_angeltype_id)
{ {
return DB::selectOne(' $angelType = DB::selectOne('
SELECT * SELECT *
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `id`=? WHERE `id`=?
LIMIT 1', [$user_angeltype_id]); LIMIT 1', [$user_angeltype_id]);
return empty($angelType) ? null : $angelType;
} }
/** /**
@ -213,7 +215,7 @@ function UserAngelType($user_angeltype_id)
*/ */
function UserAngelType_by_User_and_AngelType($user, $angeltype) function UserAngelType_by_User_and_AngelType($user, $angeltype)
{ {
return DB::selectOne(' $angelType = DB::selectOne('
SELECT * SELECT *
FROM `UserAngelTypes` FROM `UserAngelTypes`
WHERE `user_id`=? WHERE `user_id`=?
@ -225,6 +227,8 @@ function UserAngelType_by_User_and_AngelType($user, $angeltype)
$angeltype['id'] $angeltype['id']
] ]
); );
return empty($angelType) ? null : $angelType;
} }
/** /**

@ -45,10 +45,12 @@ function UserDriverLicense_valid($user_driver_license)
*/ */
function UserDriverLicense($user_id) function UserDriverLicense($user_id)
{ {
return DB::selectOne(' $driverLicense = DB::selectOne('
SELECT * SELECT *
FROM `UserDriverLicenses` FROM `UserDriverLicenses`
WHERE `user_id`=?', [$user_id]); WHERE `user_id`=?', [$user_id]);
return empty($driverLicense) ? null : $driverLicense;
} }
/** /**

@ -1,22 +1,27 @@
<?php <?php
use Engelsystem\Database\Db; use Engelsystem\Database\Db;
/** /**
* Load a single work log entry. * Load a single work log entry.
* *
* @param int $user_worklog_id * @param int $user_worklog_id
* @return array|null
*/ */
function UserWorkLog($user_worklog_id) function UserWorkLog($user_worklog_id)
{ {
return Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [ $workLog = Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [
$user_worklog_id $user_worklog_id
]); ]);
return empty($workLog) ? null : $workLog;
} }
/** /**
* Returns all work log entries for a user. * Returns all work log entries for a user.
* *
* @param User $user * @param array $user
* @return array[]
*/ */
function UserWorkLogsForUser($user) function UserWorkLogsForUser($user)
{ {
@ -28,7 +33,8 @@ function UserWorkLogsForUser($user)
/** /**
* Delete a work log entry. * Delete a work log entry.
* *
* @param UserWorkLog $userWorkLog * @param $userWorkLog
* @return int
*/ */
function UserWorkLog_delete($userWorkLog) function UserWorkLog_delete($userWorkLog)
{ {
@ -37,7 +43,12 @@ function UserWorkLog_delete($userWorkLog)
$userWorkLog['id'] $userWorkLog['id']
]); ]);
engelsystem_log(sprintf('Delete work log for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment'])); engelsystem_log(sprintf(
'Delete work log for %s, %s hours, %s',
User_Nick_render($user_source),
$userWorkLog['work_hours'],
$userWorkLog['comment']
));
return $result; return $result;
} }
@ -45,7 +56,8 @@ function UserWorkLog_delete($userWorkLog)
/** /**
* Update work log entry (only work hours and comment) * Update work log entry (only work hours and comment)
* *
* @param UserWorkLog $userWorkLog * @param $userWorkLog
* @return int
*/ */
function UserWorkLog_update($userWorkLog) function UserWorkLog_update($userWorkLog)
{ {
@ -62,7 +74,12 @@ function UserWorkLog_update($userWorkLog)
$userWorkLog['id'] $userWorkLog['id']
]); ]);
engelsystem_log(sprintf('Updated work log for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment'])); engelsystem_log(sprintf(
'Updated work log for %s, %s hours, %s',
User_Nick_render($user_source),
$userWorkLog['work_hours'],
$userWorkLog['comment'])
);
return $result; return $result;
} }
@ -70,7 +87,8 @@ function UserWorkLog_update($userWorkLog)
/** /**
* Create a new work log entry * Create a new work log entry
* *
* @param UserWorkLog $userWorkLog * @param $userWorkLog
* @return bool
*/ */
function UserWorkLog_create($userWorkLog) function UserWorkLog_create($userWorkLog)
{ {
@ -95,7 +113,8 @@ function UserWorkLog_create($userWorkLog)
time() time()
]); ]);
engelsystem_log(sprintf('Added work log entry for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment'])); engelsystem_log(sprintf('Added work log entry for %s, %s hours, %s', User_Nick_render($user_source),
$userWorkLog['work_hours'], $userWorkLog['comment']));
return $result; return $result;
} }
@ -104,6 +123,7 @@ function UserWorkLog_create($userWorkLog)
* New user work log entry * New user work log entry
* *
* @param array[] $user * @param array[] $user
* @return array
*/ */
function UserWorkLog_new($user) function UserWorkLog_new($user)
{ {
@ -119,5 +139,3 @@ function UserWorkLog_new($user)
'comment' => '' 'comment' => ''
]; ];
} }
?>

@ -22,8 +22,10 @@ function User_delete($user_id)
* Accounts only ended shifts. * Accounts only ended shifts.
* *
* @param array[] $user * @param array[] $user
* @return int
*/ */
function User_tshirt_score($user) { function User_tshirt_score($user)
{
$shift_sum_formula = config('shift_sum_formula'); $shift_sum_formula = config('shift_sum_formula');
$result_shifts = DB::selectOne(' $result_shifts = DB::selectOne('
@ -347,12 +349,12 @@ function User_validate_jabber($jabber)
*/ */
function User_validate_planned_arrival_date($planned_arrival_date) function User_validate_planned_arrival_date($planned_arrival_date)
{ {
if ($planned_arrival_date == null) { if (is_null($planned_arrival_date)) {
// null is not okay // null is not okay
return new ValidationResult(false, time()); return new ValidationResult(false, time());
} }
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config == null) { if (empty($event_config)) {
// Nothing to validate against // Nothing to validate against
return new ValidationResult(true, $planned_arrival_date); return new ValidationResult(true, $planned_arrival_date);
} }
@ -376,7 +378,7 @@ function User_validate_planned_arrival_date($planned_arrival_date)
*/ */
function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date) function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date)
{ {
if ($planned_departure_date == null) { if (is_null($planned_departure_date)) {
// null is okay // null is okay
return new ValidationResult(true, null); return new ValidationResult(true, null);
} }
@ -385,7 +387,7 @@ function User_validate_planned_departure_date($planned_arrival_date, $planned_de
return new ValidationResult(false, $planned_arrival_date); return new ValidationResult(false, $planned_arrival_date);
} }
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config == null) { if (empty($event_config)) {
// Nothing to validate against // Nothing to validate against
return new ValidationResult(true, $planned_departure_date); return new ValidationResult(true, $planned_departure_date);
} }
@ -408,7 +410,9 @@ function User_validate_planned_departure_date($planned_arrival_date, $planned_de
*/ */
function User($user_id) function User($user_id)
{ {
return DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]); $user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]);
return empty($user) ? null : $user;
} }
/** /**
@ -419,18 +423,22 @@ function User($user_id)
*/ */
function User_by_api_key($api_key) function User_by_api_key($api_key)
{ {
return DB::selectOne('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]); $user = DB::selectOne('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]);
return empty($user) ? null : $user;
} }
/** /**
* Returns User by email. * Returns User by email.
* *
* @param string $email * @param string $email
* @return array|null Matching user, null on error * @return array|null Matching user, null when not found
*/ */
function User_by_email($email) function User_by_email($email)
{ {
return DB::selectOne('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]); $user = DB::selectOne('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]);
return empty($user) ? null : $user;
} }
/** /**
@ -441,7 +449,9 @@ function User_by_email($email)
*/ */
function User_by_password_recovery_token($token) function User_by_password_recovery_token($token)
{ {
return DB::selectOne('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]); $user = DB::selectOne('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]);
return empty($user) ? null : $user;
} }
/** /**

@ -101,7 +101,7 @@ function admin_active()
if ($request->has('active') && preg_match('/^\d+$/', $request->input('active'))) { if ($request->has('active') && preg_match('/^\d+$/', $request->input('active'))) {
$user_id = $request->input('active'); $user_id = $request->input('active');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]); DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.'); engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.');
$msg = success(_('Angel has been marked as active.'), true); $msg = success(_('Angel has been marked as active.'), true);
@ -111,7 +111,7 @@ function admin_active()
} elseif ($request->has('not_active') && preg_match('/^\d+$/', $request->input('not_active'))) { } elseif ($request->has('not_active') && preg_match('/^\d+$/', $request->input('not_active'))) {
$user_id = $request->input('not_active'); $user_id = $request->input('not_active');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]); DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.'); engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.');
$msg = success(_('Angel has been marked as not active.'), true); $msg = success(_('Angel has been marked as not active.'), true);
@ -121,7 +121,7 @@ function admin_active()
} elseif ($request->has('tshirt') && preg_match('/^\d+$/', $request->input('tshirt'))) { } elseif ($request->has('tshirt') && preg_match('/^\d+$/', $request->input('tshirt'))) {
$user_id = $request->input('tshirt'); $user_id = $request->input('tshirt');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]); DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.'); engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.');
$msg = success(_('Angel has got a t-shirt.'), true); $msg = success(_('Angel has got a t-shirt.'), true);
@ -131,7 +131,7 @@ function admin_active()
} elseif ($request->has('not_tshirt') && preg_match('/^\d+$/', $request->input('not_tshirt'))) { } elseif ($request->has('not_tshirt') && preg_match('/^\d+$/', $request->input('not_tshirt'))) {
$user_id = $request->input('not_tshirt'); $user_id = $request->input('not_tshirt');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]); DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.'); engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.');
$msg = success(_('Angel has got no t-shirt.'), true); $msg = success(_('Angel has got no t-shirt.'), true);

@ -27,7 +27,7 @@ function admin_arrive()
if ($request->has('reset') && preg_match('/^\d+$/', $request->input('reset'))) { if ($request->has('reset') && preg_match('/^\d+$/', $request->input('reset'))) {
$user_id = $request->input('reset'); $user_id = $request->input('reset');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update(' DB::update('
UPDATE `User` UPDATE `User`
SET `Gekommen`=0, `arrival_date` = NULL SET `Gekommen`=0, `arrival_date` = NULL
@ -43,7 +43,7 @@ function admin_arrive()
} elseif ($request->has('arrived') && preg_match('/^\d+$/', $request->input('arrived'))) { } elseif ($request->has('arrived') && preg_match('/^\d+$/', $request->input('arrived'))) {
$user_id = $request->input('arrived'); $user_id = $request->input('arrived');
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source != null) { if (!empty($user_source)) {
DB::update(' DB::update('
UPDATE `User` UPDATE `User`
SET `Gekommen`=1, `arrival_date`=? SET `Gekommen`=1, `arrival_date`=?
@ -84,7 +84,7 @@ function admin_arrive()
} }
$usr['nick'] = User_Nick_render($usr); $usr['nick'] = User_Nick_render($usr);
if ($usr['planned_departure_date'] != null) { if (!is_null($usr['planned_departure_date'])) {
$usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']); $usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']);
} else { } else {
$usr['rendered_planned_departure_date'] = '-'; $usr['rendered_planned_departure_date'] = '-';
@ -110,7 +110,7 @@ function admin_arrive()
$arrival_count_at_day[$day]++; $arrival_count_at_day[$day]++;
} }
if ($usr['planned_arrival_date'] != null) { if (!is_null($usr['planned_arrival_date'])) {
$day = date('Y-m-d', $usr['planned_arrival_date']); $day = date('Y-m-d', $usr['planned_arrival_date']);
if (!isset($planned_arrival_count_at_day[$day])) { if (!isset($planned_arrival_count_at_day[$day])) {
$planned_arrival_count_at_day[$day] = 0; $planned_arrival_count_at_day[$day] = 0;
@ -118,7 +118,7 @@ function admin_arrive()
$planned_arrival_count_at_day[$day]++; $planned_arrival_count_at_day[$day]++;
} }
if ($usr['planned_departure_date'] != null && $usr['Gekommen'] == 1) { if (!is_null($usr['planned_departure_date']) && $usr['Gekommen'] == 1) {
$day = date('Y-m-d', $usr['planned_departure_date']); $day = date('Y-m-d', $usr['planned_departure_date']);
if (!isset($planned_departure_count_at_day[$day])) { if (!isset($planned_departure_count_at_day[$day])) {
$planned_departure_count_at_day[$day] = 0; $planned_departure_count_at_day[$day] = 0;

@ -111,7 +111,7 @@ function admin_questions()
'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1', 'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1',
[$question_id] [$question_id]
); );
if (!empty($question) && $question['AID'] == null) { if (!empty($question) && empty($question['AID'])) {
$answer = trim( $answer = trim(
preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui",
'', '',

@ -55,7 +55,7 @@ function admin_rooms()
if (test_request_int('id')) { if (test_request_int('id')) {
$room = Room($request->input('id')); $room = Room($request->input('id'));
if ($room == null) { if (empty($room)) {
redirect(page_link_to('admin_rooms')); redirect(page_link_to('admin_rooms'));
} }
@ -127,7 +127,7 @@ function admin_rooms()
$needed_angeltype_info = []; $needed_angeltype_info = [];
foreach ($angeltypes_count as $angeltype_id => $angeltype_count) { foreach ($angeltypes_count as $angeltype_id => $angeltype_count) {
$angeltype = AngelType($angeltype_id); $angeltype = AngelType($angeltype_id);
if ($angeltype != null) { if (!empty($angeltype)) {
NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count); NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count);
if ($angeltype_count > 0) { if ($angeltype_count > 0) {
$needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count; $needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count;

@ -53,7 +53,7 @@ function admin_shifts()
if ($request->has('preview') || $request->has('back')) { if ($request->has('preview') || $request->has('back')) {
if ($request->has('shifttype_id')) { if ($request->has('shifttype_id')) {
$shifttype = ShiftType($request->input('shifttype_id')); $shifttype = ShiftType($request->input('shifttype_id'));
if ($shifttype == null) { if (empty($shifttype)) {
$valid = false; $valid = false;
error(_('Please select a shift type.')); error(_('Please select a shift type.'));
} else { } else {

@ -34,7 +34,7 @@ function admin_user()
$user_id = $request->input('id'); $user_id = $request->input('id');
if (!$request->has('action')) { if (!$request->has('action')) {
$user_source = User($user_id); $user_source = User($user_id);
if ($user_source == null) { if (empty($user_source)) {
error(_('This user does not exist.')); error(_('This user does not exist.'));
redirect(users_link()); redirect(users_link());
} }

@ -279,7 +279,7 @@ function guest_register()
} }
// If a welcome message is present, display registration success page. // If a welcome message is present, display registration success page.
if ($event_config != null && $event_config['event_welcome_msg'] != null) { if (!empty($event_config) && !empty($event_config['event_welcome_msg'])) {
return User_registration_success_view($event_config['event_welcome_msg']); return User_registration_success_view($event_config['event_welcome_msg']);
} }
@ -289,7 +289,7 @@ function guest_register()
$buildup_start_date = time(); $buildup_start_date = time();
$teardown_end_date = null; $teardown_end_date = null;
if ($event_config != null) { if (!empty($event_config)) {
if (isset($event_config['buildup_start_date'])) { if (isset($event_config['buildup_start_date'])) {
$buildup_start_date = $event_config['buildup_start_date']; $buildup_start_date = $event_config['buildup_start_date'];
} }

@ -16,7 +16,7 @@ function user_atom()
$key = $request->input('key'); $key = $request->input('key');
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if (empty($user)) {
engelsystem_error('Key invalid.'); engelsystem_error('Key invalid.');
} }
if (!in_array('atom', privileges_for_user($user['UID']))) { if (!in_array('atom', privileges_for_user($user['UID']))) {

@ -14,7 +14,7 @@ function user_ical()
$key = $request->input('key'); $key = $request->input('key');
$user = User_by_api_key($key); $user = User_by_api_key($key);
if ($user == null) { if (empty($user)) {
engelsystem_error('Key invalid.'); engelsystem_error('Key invalid.');
} }

@ -32,7 +32,6 @@ function user_myshifts()
} }
$shifts_user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$shift_entry_id]); $shifts_user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$shift_entry_id]);
if ($request->has('reset')) { if ($request->has('reset')) {
if ($request->input('reset') == 'ack') { if ($request->input('reset') == 'ack') {
User_reset_api_key($user); User_reset_api_key($user);
@ -72,7 +71,7 @@ function user_myshifts()
$shifts_user['UID'], $shifts_user['UID'],
] ]
); );
if (count($shift) > 0) { if (!empty($shift)) {
$freeloaded = $shift['freeloaded']; $freeloaded = $shift['freeloaded'];
$freeload_comment = $shift['freeload_comment']; $freeload_comment = $shift['freeload_comment'];

@ -215,7 +215,7 @@ function user_settings()
$buildup_start_date = null; $buildup_start_date = null;
$teardown_end_date = null; $teardown_end_date = null;
$event_config = EventConfig(); $event_config = EventConfig();
if ($event_config != null) { if (!empty($event_config)) {
if (isset($event_config['buildup_start_date'])) { if (isset($event_config['buildup_start_date'])) {
$buildup_start_date = $event_config['buildup_start_date']; $buildup_start_date = $event_config['buildup_start_date'];
} }

@ -47,7 +47,7 @@ function user_shifts()
function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days) function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days)
{ {
$start_time = $shiftsFilter->getStartTime(); $start_time = $shiftsFilter->getStartTime();
if ($start_time == null) { if (is_null($start_time)) {
$start_time = time(); $start_time = time();
} }
@ -177,18 +177,19 @@ function view_user_shifts()
$rooms = load_rooms(); $rooms = load_rooms();
$types = load_types(); $types = load_types();
if (!$session->has('ShiftsFilter')) { if (!$session->has('shifts-filter')) {
$room_ids = [ $room_ids = [
$rooms[0]['id'] $rooms[0]['id']
]; ];
$type_ids = array_map('get_ids_from_array', $types); $type_ids = array_map('get_ids_from_array', $types);
$shiftsFilter = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids); $shiftsFilter = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids);
$session->set('ShiftsFilter', $shiftsFilter); $session->set('shifts-filter', $shiftsFilter->sessionExport());
} }
/** @var ShiftsFilter $shiftsFilter */ $shiftsFilter = new ShiftsFilter();
$shiftsFilter = $session->get('ShiftsFilter'); $shiftsFilter->sessionImport($session->get('shifts-filter'));
update_ShiftsFilter($shiftsFilter, in_array('user_shifts_admin', $privileges), $days); update_ShiftsFilter($shiftsFilter, in_array('user_shifts_admin', $privileges), $days);
$session->set('shifts-filter', $shiftsFilter->sessionExport());
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);

@ -42,9 +42,10 @@ function check_request_datetime($date_name, $time_name, $allowed_days, $default_
function parse_date($pattern, $value) function parse_date($pattern, $value)
{ {
$datetime = DateTime::createFromFormat($pattern, trim($value)); $datetime = DateTime::createFromFormat($pattern, trim($value));
if ($datetime == null) { if (!$datetime) {
return null; return null;
} }
return $datetime->getTimestamp(); return $datetime->getTimestamp();
} }

@ -28,9 +28,9 @@ function AngelType_name_render($angeltype)
*/ */
function AngelType_render_membership($user_angeltype) function AngelType_render_membership($user_angeltype)
{ {
if ($user_angeltype['user_angeltype_id'] != null) { if (!empty($user_angeltype['user_angeltype_id'])) {
if ($user_angeltype['restricted']) { if ($user_angeltype['restricted']) {
if ($user_angeltype['confirm_user_id'] == null) { if (empty($user_angeltype['confirm_user_id'])) {
return glyph('lock') . _('Unconfirmed'); return glyph('lock') . _('Unconfirmed');
} elseif ($user_angeltype['supporter']) { } elseif ($user_angeltype['supporter']) {
return glyph_bool(true) . _('Supporter'); return glyph_bool(true) . _('Supporter');
@ -145,18 +145,18 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes,
); );
} }
if ($user_angeltype == null) { if (is_null($user_angeltype)) {
$buttons[] = button( $buttons[] = button(
page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]), page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]),
_('join'), _('join'),
'add' 'add'
); );
} else { } else {
if ($angeltype['requires_driver_license'] && $user_driver_license == null) { if ($angeltype['requires_driver_license'] && empty($user_driver_license)) {
error(_('This angeltype requires a driver license. Please enter your driver license information!')); error(_('This angeltype requires a driver license. Please enter your driver license information!'));
} }
if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null) { if ($angeltype['restricted'] && empty($user_angeltype['confirm_user_id'])) {
error(sprintf( error(sprintf(
_('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'), _('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'),
$angeltype['name'] $angeltype['name']
@ -212,7 +212,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a
$member['has_license_forklift'] = glyph_bool($member['has_license_forklift']); $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']);
} }
if ($angeltype['restricted'] && $member['confirm_user_id'] == null) { if ($angeltype['restricted'] && empty($member['confirm_user_id'])) {
$member['actions'] = table_buttons([ $member['actions'] = table_buttons([
button( button(
page_link_to( page_link_to(
@ -526,7 +526,7 @@ function AngelTypes_about_view_angeltype($angeltype)
if (isset($angeltype['user_angeltype_id'])) { if (isset($angeltype['user_angeltype_id'])) {
$buttons = []; $buttons = [];
if ($angeltype['user_angeltype_id'] != null) { if (!empty($angeltype['user_angeltype_id'])) {
$buttons[] = button( $buttons[] = button(
page_link_to( page_link_to(
'user_angeltypes', 'user_angeltypes',

@ -8,7 +8,7 @@
*/ */
function EventConfig_countdown_page($event_config) function EventConfig_countdown_page($event_config)
{ {
if ($event_config == null) { if (empty($event_config)) {
return div('col-md-12 text-center', [ return div('col-md-12 text-center', [
heading(sprintf(_('Welcome to the %s!'), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2) heading(sprintf(_('Welcome to the %s!'), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2)
]); ]);
@ -16,7 +16,7 @@ function EventConfig_countdown_page($event_config)
$elements = []; $elements = [];
if ($event_config['event_name'] != null) { if (!is_null($event_config['event_name'])) {
$elements[] = div('col-sm-12 text-center', [ $elements[] = div('col-sm-12 text-center', [
heading(sprintf( heading(sprintf(
_('Welcome to the %s!'), _('Welcome to the %s!'),
@ -25,7 +25,7 @@ function EventConfig_countdown_page($event_config)
]); ]);
} }
if ($event_config['buildup_start_date'] != null && time() < $event_config['buildup_start_date']) { if (!is_null($event_config['buildup_start_date']) && time() < $event_config['buildup_start_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_('Buildup starts'), 4), heading(_('Buildup starts'), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>', '<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>',
@ -33,7 +33,7 @@ function EventConfig_countdown_page($event_config)
]); ]);
} }
if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) { if (!is_null($event_config['event_start_date']) && time() < $event_config['event_start_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_('Event starts'), 4), heading(_('Event starts'), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>', '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>',
@ -41,7 +41,7 @@ function EventConfig_countdown_page($event_config)
]); ]);
} }
if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) { if (!is_null($event_config['event_end_date']) && time() < $event_config['event_end_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_('Event ends'), 4), heading(_('Event ends'), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>', '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>',
@ -49,7 +49,7 @@ function EventConfig_countdown_page($event_config)
]); ]);
} }
if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) { if (!is_null($event_config['teardown_end_date']) && time() < $event_config['teardown_end_date']) {
$elements[] = div('col-sm-3 text-center hidden-xs', [ $elements[] = div('col-sm-3 text-center hidden-xs', [
heading(_('Teardown ends'), 4), heading(_('Teardown ends'), 4),
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>', '<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>',
@ -68,15 +68,15 @@ function EventConfig_countdown_page($event_config)
*/ */
function EventConfig_info($event_config) function EventConfig_info($event_config)
{ {
if ($event_config == null) { if (empty($event_config)) {
return ''; return '';
} }
// Event name, start+end date are set // Event name, start+end date are set
if ( if (
$event_config['event_name'] != null !is_null($event_config['event_name'])
&& $event_config['event_start_date'] != null && !is_null($event_config['event_start_date'])
&& $event_config['event_end_date'] != null && !is_null($event_config['event_end_date'])
) { ) {
return sprintf( return sprintf(
_('%s, from %s to %s'), _('%s, from %s to %s'),
@ -87,7 +87,7 @@ function EventConfig_info($event_config)
} }
// Event name, start date are set // Event name, start date are set
if ($event_config['event_name'] != null && $event_config['event_start_date'] != null) { if (!is_null($event_config['event_name']) && !is_null($event_config['event_start_date'])) {
return sprintf( return sprintf(
_('%s, starting %s'), $event_config['event_name'], _('%s, starting %s'), $event_config['event_name'],
date(_('Y-m-d'), $event_config['event_start_date']) date(_('Y-m-d'), $event_config['event_start_date'])
@ -95,7 +95,7 @@ function EventConfig_info($event_config)
} }
// Event start+end date are set // Event start+end date are set
if ($event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { if (!is_null($event_config['event_start_date']) && !is_null($event_config['event_end_date'])) {
return sprintf( return sprintf(
_('Event from %s to %s'), _('Event from %s to %s'),
date(_('Y-m-d'), $event_config['event_start_date']), date(_('Y-m-d'), $event_config['event_start_date']),
@ -104,7 +104,7 @@ function EventConfig_info($event_config)
} }
// Only event name is set // Only event name is set
if ($event_config['event_name'] != null) { if (!is_null($event_config['event_name'])) {
return sprintf($event_config['event_name']); return sprintf($event_config['event_name']);
} }

@ -129,7 +129,7 @@ class ShiftCalendarRenderer
*/ */
public function getBlocksPerSlot() public function getBlocksPerSlot()
{ {
if ($this->blocksPerSlot == null) { if (is_null($this->blocksPerSlot)) {
$this->blocksPerSlot = $this->calcBlocksPerSlot(); $this->blocksPerSlot = $this->calcBlocksPerSlot();
} }
return $this->blocksPerSlot; return $this->blocksPerSlot;

@ -116,7 +116,7 @@ class ShiftCalendarShiftRenderer
$angeltype, $angeltype,
$user $user
); );
if ($shift_signup_state == null) { if (is_null($shift_signup_state)) {
$shift_signup_state = $angeltype_signup_state; $shift_signup_state = $angeltype_signup_state;
} else { } else {
$shift_signup_state->combineWith($angeltype_signup_state); $shift_signup_state->combineWith($angeltype_signup_state);
@ -124,7 +124,7 @@ class ShiftCalendarShiftRenderer
$html .= $angeltype_html; $html .= $angeltype_html;
} }
} }
if ($shift_signup_state == null) { if (is_null($shift_signup_state)) {
$shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0); $shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0);
} }

@ -50,14 +50,14 @@ function Shift_view_header($shift, $room)
function Shift_editor_info_render($shift) function Shift_editor_info_render($shift)
{ {
$info = []; $info = [];
if ($shift['created_by_user_id'] != null) { if (!empty($shift['created_by_user_id'])) {
$info[] = sprintf( $info[] = sprintf(
glyph('plus') . _('created at %s by %s'), glyph('plus') . _('created at %s by %s'),
date('Y-m-d H:i', $shift['created_at_timestamp']), date('Y-m-d H:i', $shift['created_at_timestamp']),
User_Nick_render(User($shift['created_by_user_id'])) User_Nick_render(User($shift['created_by_user_id']))
); );
} }
if ($shift['edited_by_user_id'] != null) { if (!empty($shift['edited_by_user_id'])) {
$info[] = sprintf( $info[] = sprintf(
glyph('pencil') . _('edited at %s by %s'), glyph('pencil') . _('edited at %s by %s'),
date('Y-m-d H:i', $shift['edited_at_timestamp']), date('Y-m-d H:i', $shift['edited_at_timestamp']),
@ -77,13 +77,13 @@ function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null)
{ {
global $user; global $user;
if ($user_angeltype == null) { if (empty($user_angeltype)) {
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
} }
if ($angeltype['shift_signup_state']->isSignupAllowed()) { if ($angeltype['shift_signup_state']->isSignupAllowed()) {
return button(shift_entry_create_link($shift, $angeltype), _('Sign up')); return button(shift_entry_create_link($shift, $angeltype), _('Sign up'));
} elseif ($user_angeltype == null) { } elseif (empty($user_angeltype)) {
return button( return button(
page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]), page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]),
sprintf(_('Become %s'), sprintf(_('Become %s'),

@ -36,7 +36,7 @@ class UserHintsRenderer
*/ */
public function addHint($hint, $important = false) public function addHint($hint, $important = false)
{ {
if ($hint != null && $hint != '') { if (!empty($hint)) {
if ($important) { if ($important) {
$this->important = true; $this->important = true;
$this->hints[] = error($hint, true); $this->hints[] = error($hint, true);

@ -2,13 +2,18 @@
/** /**
* Delete work log entry. * Delete work log entry.
* @param User $user_source *
* @param UserWorkLog $userWorkLog * @param array $user_source
* @param array $userWorkLog
* @return string
*/ */
function UserWorkLog_delete_view($user_source, $userWorkLog) function UserWorkLog_delete_view($user_source, $userWorkLog)
{ {
return page_with_title(UserWorkLog_delete_title(), [ return page_with_title(UserWorkLog_delete_title(), [
info(sprintf(_('Do you want to delete the worklog entry for %s?'), User_Nick_render($user_source)), true), info(sprintf(
_('Do you want to delete the worklog entry for %s?'),
User_Nick_render($user_source)
), true),
buttons([ buttons([
button(user_link($user_source), glyph('remove') . _('cancel')), button(user_link($user_source), glyph('remove') . _('cancel')),
button(user_worklog_delete_link($userWorkLog, [ button(user_worklog_delete_link($userWorkLog, [
@ -29,8 +34,9 @@ function UserWorkLog_delete_title()
/** /**
* Render edit table. * Render edit table.
* *
* @param User $user_source * @param array $user_source
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @return string
*/ */
function UserWorkLog_edit_form($user_source, $userWorkLog) function UserWorkLog_edit_form($user_source, $userWorkLog)
{ {
@ -46,8 +52,9 @@ function UserWorkLog_edit_form($user_source, $userWorkLog)
/** /**
* Form for edit a user work log entry. * Form for edit a user work log entry.
* *
* @param User $user_source * @param array $user_source
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @return string
*/ */
function UserWorkLog_edit_view($user_source, $userWorkLog) function UserWorkLog_edit_view($user_source, $userWorkLog)
{ {
@ -63,8 +70,9 @@ function UserWorkLog_edit_view($user_source, $userWorkLog)
/** /**
* Form for adding a user work log entry. * Form for adding a user work log entry.
* *
* @param User $user_source * @param array $user_source
* @param UserWorkLog $userWorkLog * @param array $userWorkLog
* @return string
*/ */
function UserWorkLog_add_view($user_source, $userWorkLog) function UserWorkLog_add_view($user_source, $userWorkLog)
{ {
@ -92,5 +100,3 @@ function UserWorkLog_add_title()
{ {
return _('Add work log entry'); return _('Add work log entry');
} }
?>

@ -406,10 +406,21 @@ function User_view_myshift($shift, $user_source, $its_me)
* @param array[] $shifts * @param array[] $shifts
* @param array $user_source * @param array $user_source
* @param bool $its_me * @param bool $its_me
* @param int $tshirt_score
* @param bool $tshirt_admin
* @param array[] $user_worklogs
* @param $admin_user_worklog_privilege
* @return array * @return array
*/ */
function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshirt_admin, $user_worklogs, $admin_user_worklog_privilege) function User_view_myshifts(
{ $shifts,
$user_source,
$its_me,
$tshirt_score,
$tshirt_admin,
$user_worklogs,
$admin_user_worklog_privilege
) {
$myshifts_table = []; $myshifts_table = [];
$timesum = 0; $timesum = 0;
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
@ -453,10 +464,13 @@ function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshi
/** /**
* Renders table entry for user work log * Renders table entry for user work log
* @param UserWorkLog $worklog *
* @param array $worklog
* @param bool $admin_user_worklog_privilege * @param bool $admin_user_worklog_privilege
* @return array
*/ */
function User_view_worklog($worklog, $admin_user_worklog_privilege) { function User_view_worklog($worklog, $admin_user_worklog_privilege)
{
$actions = ''; $actions = '';
if ($admin_user_worklog_privilege) { if ($admin_user_worklog_privilege) {
$actions = table_buttons([ $actions = table_buttons([
@ -500,6 +514,8 @@ function User_view_worklog($worklog, $admin_user_worklog_privilege) {
* @param bool $its_me * @param bool $its_me
* @param int $tshirt_score * @param int $tshirt_score
* @param bool $tshirt_admin * @param bool $tshirt_admin
* @param bool $admin_user_worklog_privilege
* @param array[] $user_worklogs
* @return string * @return string
*/ */
function User_view( function User_view(
@ -518,7 +534,15 @@ function User_view(
$user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']); $user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']);
$myshifts_table = ''; $myshifts_table = '';
if ($its_me || $admin_user_privilege) { if ($its_me || $admin_user_privilege) {
$my_shifts = User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshirt_admin, $user_worklogs, $admin_user_worklog_privilege); $my_shifts = User_view_myshifts(
$shifts,
$user_source,
$its_me,
$tshirt_score,
$tshirt_admin,
$user_worklogs,
$admin_user_worklog_privilege
);
if (count($my_shifts) > 0) { if (count($my_shifts) > 0) {
$myshifts_table = table([ $myshifts_table = table([
'date' => _('Day &amp; time'), 'date' => _('Day &amp; time'),
@ -748,7 +772,7 @@ function User_angeltypes_render($user_angeltypes)
$output = []; $output = [];
foreach ($user_angeltypes as $angeltype) { foreach ($user_angeltypes as $angeltype) {
$class = 'text-success'; $class = 'text-success';
if ($angeltype['restricted'] == 1 && $angeltype['confirm_user_id'] == null) { if ($angeltype['restricted'] == 1 && empty($angeltype['confirm_user_id'])) {
$class = 'text-warning'; $class = 'text-warning';
} }
$output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">' $output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">'
@ -821,7 +845,7 @@ function render_user_departure_date_hint()
{ {
global $user; global $user;
if (!isset($user['planned_departure_date']) || $user['planned_departure_date'] == null) { if (!isset($user['planned_departure_date']) || empty($user['planned_departure_date'])) {
$text = _('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.'); $text = _('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.');
return render_profile_link($text, null, 'alert-link'); return render_profile_link($text, null, 'alert-link');
} }
@ -857,7 +881,7 @@ function render_user_arrived_hint()
if ($user['Gekommen'] == 0) { if ($user['Gekommen'] == 0) {
$event_config = EventConfig(); $event_config = EventConfig();
if (!is_null($event_config) if (!empty($event_config)
&& !is_null($event_config['buildup_start_date']) && !is_null($event_config['buildup_start_date'])
&& time() > $event_config['buildup_start_date']) { && time() > $event_config['buildup_start_date']) {
return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.'); return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.');

@ -127,7 +127,7 @@ if (
$content = user_shifts(); $content = user_shifts();
break; break;
case 'user_worklog': case 'user_worklog':
list($title, $content) = user_worklogs_controller(); list($title, $content) = user_worklog_controller();
break; break;
case 'user_messages': case 'user_messages':
$title = messages_title(); $title = messages_title();

@ -5,6 +5,7 @@ namespace Engelsystem;
use Engelsystem\Config\Config; use Engelsystem\Config\Config;
use Engelsystem\Container\Container; use Engelsystem\Container\Container;
use Engelsystem\Container\ServiceProvider; use Engelsystem\Container\ServiceProvider;
use Illuminate\Container\Container as IlluminateContainer;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
class Application extends Container class Application extends Container
@ -44,6 +45,7 @@ class Application extends Container
$this->instance('container', $this); $this->instance('container', $this);
$this->instance(Container::class, $this); $this->instance(Container::class, $this);
$this->instance(Application::class, $this); $this->instance(Application::class, $this);
$this->instance(IlluminateContainer::class, $this);
$this->bind(ContainerInterface::class, Application::class); $this->bind(ContainerInterface::class, Application::class);
} }

@ -2,14 +2,16 @@
namespace Engelsystem\Config; namespace Engelsystem\Config;
class Config use Illuminate\Support\Fluent;
class Config extends Fluent
{ {
/** /**
* The config values * The config values
* *
* @var array * @var array
*/ */
protected $data = []; protected $attributes = [];
/** /**
* @param string|null $key * @param string|null $key
@ -19,11 +21,11 @@ class Config
public function get($key, $default = null) public function get($key, $default = null)
{ {
if (is_null($key)) { if (is_null($key)) {
return $this->data; return $this->attributes;
} }
if ($this->has($key)) { if ($this->has($key)) {
return $this->data[$key]; return $this->attributes[$key];
} }
return $default; return $default;
@ -43,7 +45,7 @@ class Config
return; return;
} }
$this->data[$key] = $value; $this->attributes[$key] = $value;
} }
/** /**
@ -52,7 +54,7 @@ class Config
*/ */
public function has($key) public function has($key)
{ {
return isset($this->data[$key]); return $this->offsetExists($key);
} }
/** /**
@ -60,41 +62,6 @@ class Config
*/ */
public function remove($key) public function remove($key)
{ {
unset($this->data[$key]); $this->offsetUnset($key);
}
/**
* @param string $key
* @return mixed
*/
public function __get($key)
{
return $this->get($key);
}
/**
* @param string $key
* @param mixed $value
*/
public function __set($key, $value)
{
$this->set($key, $value);
}
/**
* @param string $key
* @return bool
*/
public function __isset($key)
{
return $this->has($key);
}
/**
* @param string $key
*/
public function __unset($key)
{
$this->remove($key);
} }
} }

@ -4,23 +4,40 @@ namespace Engelsystem\Database;
use Engelsystem\Container\ServiceProvider; use Engelsystem\Container\ServiceProvider;
use Exception; use Exception;
use PDO; use Illuminate\Database\Capsule\Manager as CapsuleManager;
use PDOException;
class DatabaseServiceProvider extends ServiceProvider class DatabaseServiceProvider extends ServiceProvider
{ {
public function register() public function register()
{ {
$config = $this->app->get('config'); $config = $this->app->get('config');
Db::connect( $capsule = $this->app->make(CapsuleManager::class);
'mysql:host=' . $config->get('database')['host']
. ';dbname=' . $config->get('database')['db'] $dbConfig = $config->get('database');
. ';charset=utf8', $capsule->addConnection(array_merge([
$config->get('database')['user'], 'driver' => 'mysql',
$config->get('database')['pw'] 'host' => '',
) || $this->exitOnError(); 'database' => '',
'username' => '',
Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 'password' => '',
Db::getPdo()->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
], $dbConfig));
$capsule->setAsGlobal();
$capsule->bootEloquent();
$capsule->getConnection()->useDefaultSchemaGrammar();
try {
$capsule->getConnection()->getPdo();
} catch (PDOException $e) {
$this->exitOnError();
}
$this->app->instance('db', $capsule);
Db::setDbManager($capsule);
} }
/** /**

@ -2,68 +2,23 @@
namespace Engelsystem\Database; namespace Engelsystem\Database;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection as DatabaseConnection;
use PDO; use PDO;
use PDOException;
use PDOStatement;
class Db class Db
{ {
/** @var PDO */ /** @var CapsuleManager */
protected static $db; protected static $dbManager;
/** @var PDOStatement */
protected static $stm = null;
/** @var bool */
protected static $lastStatus = true;
/**
* Connect to database
*
* @param string $dsn
* @param string $username
* @param string $password
* @param array $options
* @return bool
*/
public static function connect($dsn, $username = null, $password = null, $options = [])
{
try {
self::$db = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
return false;
}
return true;
}
/**
* Run a prepared query
*
* @param string $query
* @param array $bindings
* @return PDOStatement
*/
public static function query($query, array $bindings = [])
{
self::$stm = self::$db->prepare($query);
self::$lastStatus = self::$stm->execute($bindings);
return self::$stm;
}
/** /**
* Run a sql query * Set the database connection manager
* *
* @param string $query * @param CapsuleManager $dbManager
* @return bool
*/ */
public static function unprepared($query) public static function setDbManager($dbManager)
{ {
self::$stm = self::$db->query($query); self::$dbManager = $dbManager;
self::$lastStatus = (self::$stm instanceof PDOStatement);
return self::$lastStatus;
} }
/** /**
@ -75,9 +30,14 @@ class Db
*/ */
public static function select($query, array $bindings = []) public static function select($query, array $bindings = [])
{ {
self::query($query, $bindings); $return = self::connection()->select($query, $bindings);
return self::$stm->fetchAll(PDO::FETCH_ASSOC); // @TODO: Remove type casting
foreach ($return as $key => $value) {
$return[$key] = (array)$value;
}
return $return;
} }
/** /**
@ -89,13 +49,15 @@ class Db
*/ */
public static function selectOne($query, array $bindings = []) public static function selectOne($query, array $bindings = [])
{ {
$result = self::select($query, $bindings); $result = self::connection()->selectOne($query, $bindings);
// @TODO: remove typecast
$result = (array)$result;
if (empty($result)) { if (empty($result)) {
return null; return null;
} }
return array_shift($result); return $result;
} }
/** /**
@ -103,13 +65,11 @@ class Db
* *
* @param string $query * @param string $query
* @param array $bindings * @param array $bindings
* @return int Row count * @return bool
*/ */
public static function insert($query, array $bindings = []) public static function insert($query, array $bindings = [])
{ {
self::query($query, $bindings); return self::connection()->insert($query, $bindings);
return self::$stm->rowCount();
} }
/** /**
@ -121,9 +81,7 @@ class Db
*/ */
public static function update($query, array $bindings = []) public static function update($query, array $bindings = [])
{ {
self::query($query, $bindings); return self::connection()->update($query, $bindings);
return self::$stm->rowCount();
} }
/** /**
@ -135,37 +93,15 @@ class Db
*/ */
public static function delete($query, array $bindings = []) public static function delete($query, array $bindings = [])
{ {
self::query($query, $bindings); return self::connection()->delete($query, $bindings);
return self::$stm->rowCount();
} }
/** /**
* Run a single statement * @return DatabaseConnection
*
* @param string $query
* @param array $bindings
* @return bool
*/ */
public static function statement($query, array $bindings = []) public static function connection()
{ {
self::query($query, $bindings); return self::$dbManager->getConnection();
return self::$lastStatus;
}
/**
* Returns the last error
*
* @return array
*/
public static function getError()
{
if (!self::$stm instanceof PDOStatement) {
return [-1, null, null];
}
return self::$stm->errorInfo();
} }
/** /**
@ -175,14 +111,6 @@ class Db
*/ */
public static function getPdo() public static function getPdo()
{ {
return self::$db; return self::connection()->getPdo();
}
/**
* @return PDOStatement|false|null
*/
public static function getStm()
{
return self::$stm;
} }
} }

@ -0,0 +1,192 @@
<?php
namespace Engelsystem\Database\Migration;
use Engelsystem\Application;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
class Migrate
{
const UP = 'up';
const DOWN = 'down';
/** @var Application */
protected $app;
/** @var SchemaBuilder */
protected $scheme;
/** @var callable */
protected $output;
/** @var string */
protected $table = 'migrations';
/**
* Migrate constructor
*
* @param SchemaBuilder $scheme
* @param Application $app
*/
public function __construct(SchemaBuilder $scheme, Application $app)
{
$this->app = $app;
$this->scheme = $scheme;
$this->output = function () { };
}
/**
* Run a migration
*
* @param string $path
* @param string $type (up|down)
* @param bool $oneStep
*/
public function run($path, $type = self::UP, $oneStep = false)
{
$this->initMigration();
$migrations = $this->getMigrations($path);
$migrated = $this->getMigrated();
if ($type == self::DOWN) {
$migrations = array_reverse($migrations, true);
}
foreach ($migrations as $file => $migration) {
if (
($type == self::UP && $migrated->contains('migration', $migration))
|| ($type == self::DOWN && !$migrated->contains('migration', $migration))
) {
call_user_func($this->output, 'Skipping ' . $migration);
continue;
}
call_user_func($this->output, 'Migrating ' . $migration . ' (' . $type . ')');
$this->migrate($file, $migration, $type);
$this->setMigrated($migration, $type);
if ($oneStep) {
return;
}
}
}
/**
* Get all migrated migrations
*
* @return Collection
*/
protected function getMigrated()
{
return $this->getTableQuery()->get();
}
/**
* Migrate a migration
*
* @param string $file
* @param string $migration
* @param string $type (up|down)
*/
protected function migrate($file, $migration, $type = self::UP)
{
require_once $file;
$className = Str::studly(preg_replace('/\d+_/', '', $migration));
/** @var Migration $class */
$class = $this->app->make($className);
if (method_exists($class, $type)) {
$class->{$type}();
}
}
/**
* Set a migration to migrated
*
* @param string $migration
* @param string $type (up|down)
*/
protected function setMigrated($migration, $type = self::UP)
{
$table = $this->getTableQuery();
if ($type == self::DOWN) {
$table->where(['migration' => $migration])->delete();
return;
}
$table->insert(['migration' => $migration]);
}
/**
* Get a list of migration files
*
* @param string $dir
* @return array
*/
protected function getMigrations($dir)
{
$files = $this->getMigrationFiles($dir);
$migrations = [];
foreach ($files as $dir) {
$name = str_replace('.php', '', basename($dir));
$migrations[$dir] = $name;
}
asort($migrations);
return $migrations;
}
/**
* List all migration files from the given directory
*
* @param string $dir
* @return array
*/
protected function getMigrationFiles($dir)
{
return glob($dir . '/*_*.php');
}
/**
* Setup migration tables
*/
protected function initMigration()
{
if ($this->scheme->hasTable($this->table)) {
return;
}
$this->scheme->create($this->table, function (Blueprint $table) {
$table->increments('id');
$table->string('migration');
});
}
/**
* Init a table query
*
* @return Builder
*/
protected function getTableQuery()
{
return $this->scheme->getConnection()->table($this->table);
}
/**
* Set the output function
*
* @param callable $output
*/
public function setOutput(callable $output)
{
$this->output = $output;
}
}

@ -0,0 +1,16 @@
<?php
namespace Engelsystem\Database\Migration;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
abstract class Migration
{
/** @var SchemaBuilder */
protected $schema;
public function __construct(SchemaBuilder $schemaBuilder)
{
$this->schema = $schemaBuilder;
}
}

@ -0,0 +1,20 @@
<?php
namespace Engelsystem\Database\Migration;
use Engelsystem\Container\ServiceProvider;
use Engelsystem\Database\Db;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
class MigrationServiceProvider extends ServiceProvider
{
public function register()
{
$schema = Db::connection()->getSchemaBuilder();
$this->app->instance('db.scheme', $schema);
$this->app->bind(SchemaBuilder::class, 'db.scheme');
$migration = $this->app->make(Migrate::class);
$this->app->instance('db.migration', $migration);
}
}

@ -64,21 +64,6 @@ function config_path($path = '')
return app('path.config') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path); return app('path.config') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path);
} }
/**
* @param string $key
* @param mixed $default
* @return mixed
*/
function env($key, $default = null)
{
$value = getenv($key);
if ($value === false) {
return $default;
}
return $value;
}
/** /**
* @param string $key * @param string $key
* @param mixed $default * @param mixed $default

@ -24,11 +24,11 @@ class RoomModelTest extends TestCase
$room = Room($this->room_id); $room = Room($this->room_id);
$this->assertNotFalse($room); $this->assertNotEmpty($room);
$this->assertNotNull($room); $this->assertNotNull($room);
$this->assertEquals($room['Name'], 'test'); $this->assertEquals($room['Name'], 'test');
$this->assertNull(Room(-1)); $this->assertEmpty(Room(-1));
} }
public function tearDown() public function tearDown()

@ -6,32 +6,86 @@ use Engelsystem\Config\Config;
use Engelsystem\Database\DatabaseServiceProvider; use Engelsystem\Database\DatabaseServiceProvider;
use Engelsystem\Test\Unit\ServiceProviderTest; use Engelsystem\Test\Unit\ServiceProviderTest;
use Exception; use Exception;
use PHPUnit_Framework_MockObject_MockObject; use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection;
use PDOException;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
class DatabaseServiceProviderTest extends ServiceProviderTest class DatabaseServiceProviderTest extends ServiceProviderTest
{ {
/** /**
* @covers \Engelsystem\Database\DatabaseServiceProvider::register() * @covers \Engelsystem\Database\DatabaseServiceProvider::register()
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
*/ */
public function testRegister() public function testRegister()
{ {
/** @var PHPUnit_Framework_MockObject_MockObject|Config $config */ list($app, $dbManager) = $this->prepare(['driver' => 'sqlite', 'database' => ':memory:']);
$config = $this->getMockBuilder(Config::class)
->getMock();
$app = $this->getApp(['get']); $this->setExpects($app, 'instance', ['db', $dbManager]);
$this->setExpects($app, 'get', ['config'], $config); $serviceProvider = new DatabaseServiceProvider($app);
$this->setExpects($config, 'get', ['database'], [ $serviceProvider->register();
}
/**
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
*/
public function testRegisterError()
{
list($app) = $this->prepare([
'host' => 'localhost', 'host' => 'localhost',
'db' => 'database', 'database' => 'database',
'user' => 'user', 'username' => 'user',
'pw' => 'password', 'password' => 'password',
], $this->atLeastOnce()); ], true);
$this->expectException(Exception::class); $this->expectException(Exception::class);
$serviceProvider = new DatabaseServiceProvider($app); $serviceProvider = new DatabaseServiceProvider($app);
$serviceProvider->register(); $serviceProvider->register();
} }
/**
* Prepare some mocks
*
* @param array $dbConfigData
* @param bool $getPdoThrowException
* @return array
*/
protected function prepare($dbConfigData, $getPdoThrowException = false)
{
/** @var MockObject|Config $config */
$config = $this->getMockBuilder(Config::class)
->getMock();
/** @var MockObject|CapsuleManager $config */
$dbManager = $this->getMockBuilder(CapsuleManager::class)
->getMock();
/** @var MockObject|Connection $connection */
$connection = $this->getMockBuilder(Connection::class)
->disableOriginalConstructor()
->getMock();
$app = $this->getApp(['get', 'make', 'instance']);
$this->setExpects($app, 'get', ['config'], $config);
$this->setExpects($app, 'make', [CapsuleManager::class], $dbManager);
$this->setExpects($config, 'get', ['database'], $dbConfigData, $this->atLeastOnce());
$this->setExpects($dbManager, 'setAsGlobal');
$this->setExpects($dbManager, 'bootEloquent');
$this->setExpects($connection, 'useDefaultSchemaGrammar');
$connection->expects($this->once())
->method('getPdo')
->willReturnCallback(function () use ($getPdoThrowException) {
if ($getPdoThrowException) {
throw new PDOException();
}
return '';
});
$this->setExpects($dbManager, 'getConnection', [], $connection, $this->atLeastOnce());
return [$app, $dbManager];
}
} }

@ -3,45 +3,45 @@
namespace Engelsystem\Test\Unit\Database; namespace Engelsystem\Test\Unit\Database;
use Engelsystem\Database\Db; use Engelsystem\Database\Db;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection as DatabaseConnection;
use PDO; use PDO;
use PDOStatement;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use ReflectionObject; use PHPUnit_Framework_MockObject_MockObject as MockObject;
use Throwable;
class DbTest extends TestCase class DbTest extends TestCase
{ {
/** /**
* @covers \Engelsystem\Database\Db::connect() * @covers \Engelsystem\Database\Db::setDbManager()
* @covers \Engelsystem\Database\Db::connection()
*/ */
public function testConnect() public function testSetDbManager()
{ {
$result = Db::connect('mysql:host=localhost;dbname=someTestDatabaseThatDoesNotExist;charset=utf8'); /** @var MockObject|Pdo $pdo */
$this->assertFalse($result); $pdo = $this->getMockBuilder(Pdo::class)
->disableOriginalConstructor()
$result = Db::connect('sqlite::memory:'); ->getMock();
$this->assertTrue($result); /** @var MockObject|CapsuleManager $dbManager */
} $dbManager = $this->getMockBuilder(CapsuleManager::class)
->disableOriginalConstructor()
/** ->getMock();
* @covers \Engelsystem\Database\Db::query() /** @var MockObject|DatabaseConnection $dbManager */
*/ $databaseConnection = $this->getMockBuilder(DatabaseConnection::class)
public function testQuery() ->disableOriginalConstructor()
{ ->getMock();
$stm = Db::query('SELECT * FROM test_data');
$this->assertEquals('00000', $stm->errorCode()); $dbManager
->expects($this->atLeastOnce())
$stm = Db::query('SELECT * FROM test_data WHERE id = ?', [4]); ->method('getConnection')
$this->assertEquals('00000', $stm->errorCode()); ->willReturn($databaseConnection);
} $databaseConnection
->expects($this->atLeastOnce())
/** ->method('getPdo')
* @covers \Engelsystem\Database\Db::unprepared() ->willReturn($pdo);
*/
public function testUnprepared() Db::setDbManager($dbManager);
{ $this->assertEquals($pdo, Db::getPdo());
$return = Db::unprepared('SELECT * FROM test_data WHERE id = 3'); $this->assertEquals($databaseConnection, Db::connection());
$this->assertTrue($return);
} }
/** /**
@ -77,11 +77,8 @@ class DbTest extends TestCase
*/ */
public function testInsert() public function testInsert()
{ {
$count = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')"); $result = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')");
$this->assertEquals(2, $count); $this->assertTrue($result);
$count = Db::insert('INSERT INTO test_data(id, data) VALUES (:id, :alias)', ['id' => 7, 'alias' => 'Blafoo']);
$this->assertEquals(1, $count);
} }
/** /**
@ -108,42 +105,6 @@ class DbTest extends TestCase
$this->assertEquals(3, $count); $this->assertEquals(3, $count);
} }
/**
* @covers \Engelsystem\Database\Db::statement()
*/
public function testStatement()
{
$return = Db::statement('SELECT * FROM test_data WHERE id = 3');
$this->assertTrue($return);
$return = Db::statement('SELECT * FROM test_data WHERE id = ?', [2]);
$this->assertTrue($return);
}
/**
* @covers \Engelsystem\Database\Db::getError()
*/
public function testGetError()
{
try {
Db::statement('foo');
} catch (Throwable $e) {
}
$error = Db::getError();
$this->assertTrue(is_array($error));
$this->assertEquals('near "foo": syntax error', $error[2]);
$db = new Db();
$refObject = new ReflectionObject($db);
$refProperty = $refObject->getProperty('stm');
$refProperty->setAccessible(true);
$refProperty->setValue(null, null);
$error = Db::getError();
$this->assertEquals([-1, null, null], $error);
}
/** /**
* @covers \Engelsystem\Database\Db::getPdo() * @covers \Engelsystem\Database\Db::getPdo()
*/ */
@ -153,30 +114,26 @@ class DbTest extends TestCase
$this->assertInstanceOf(PDO::class, $pdo); $this->assertInstanceOf(PDO::class, $pdo);
} }
/**
* @covers \Engelsystem\Database\Db::getStm()
*/
public function testGetStm()
{
$stm = Db::getStm();
$this->assertInstanceOf(PDOStatement::class, $stm);
}
/** /**
* Setup in memory database * Setup in memory database
*/ */
protected function setUp() protected function setUp()
{ {
Db::connect('sqlite::memory:'); $dbManager = new CapsuleManager();
$dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']);
$dbManager->setAsGlobal();
$dbManager->bootEloquent();
Db::setDbManager($dbManager);
Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Db::query( Db::connection()->statement(
' '
CREATE TABLE test_data( CREATE TABLE test_data(
id INT PRIMARY KEY NOT NULL, id INT PRIMARY KEY NOT NULL,
data TEXT NOT NULL data TEXT NOT NULL
); );
'); ');
Db::query('CREATE UNIQUE INDEX test_data_id_uindex ON test_data (id);'); Db::connection()->statement('CREATE UNIQUE INDEX test_data_id_uindex ON test_data (id);');
Db::insert(" Db::insert("
INSERT INTO test_data (id, data) INSERT INTO test_data (id, data)
VALUES VALUES

@ -0,0 +1,160 @@
<?php
namespace Engelsystem\Test\Unit\Database;
use Engelsystem\Application;
use Engelsystem\Database\Migration\Migrate;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
class MigrateTest extends TestCase
{
/**
* @covers \Engelsystem\Database\Migration\Migrate::__construct
* @covers \Engelsystem\Database\Migration\Migrate::run
* @covers \Engelsystem\Database\Migration\Migrate::getMigrations
* @covers \Engelsystem\Database\Migration\Migrate::setOutput
*/
public function testRun()
{
/** @var MockObject|Application $app */
$app = $this->getMockBuilder(Application::class)
->setMethods(['instance'])
->getMock();
/** @var MockObject|SchemaBuilder $builder */
$builder = $this->getMockBuilder(SchemaBuilder::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|Migrate $migration */
$migration = $this->getMockBuilder(Migrate::class)
->setConstructorArgs([$builder, $app])
->setMethods(['initMigration', 'getMigrationFiles', 'getMigrated', 'migrate', 'setMigrated'])
->getMock();
$migration->expects($this->atLeastOnce())
->method('initMigration');
$migration->expects($this->atLeastOnce())
->method('getMigrationFiles')
->willReturn([
'foo/1234_01_23_123456_init_foo.php',
'foo/9876_03_22_210000_random_hack.php',
'foo/4567_11_01_000000_do_stuff.php',
'foo/9999_99_99_999999_another_foo.php',
]);
$migration->expects($this->atLeastOnce())
->method('getMigrated')
->willReturn(new Collection([
['id' => 1, 'migration' => '1234_01_23_123456_init_foo'],
['id' => 2, 'migration' => '4567_11_01_000000_do_stuff'],
]));
$migration->expects($this->atLeastOnce())
->method('migrate')
->withConsecutive(
['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP],
['foo/9999_99_99_999999_another_foo.php', '9999_99_99_999999_another_foo', Migrate::UP],
['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP],
['foo/4567_11_01_000000_do_stuff.php', '4567_11_01_000000_do_stuff', Migrate::DOWN]
);
$migration->expects($this->atLeastOnce())
->method('setMigrated')
->withConsecutive(
['9876_03_22_210000_random_hack', Migrate::UP],
['9999_99_99_999999_another_foo', Migrate::UP],
['9876_03_22_210000_random_hack', Migrate::UP],
['4567_11_01_000000_do_stuff', Migrate::DOWN]
);
$messages = [];
$migration->setOutput(function ($text) use (&$messages) {
$messages[] = $text;
});
$migration->run('foo', Migrate::UP);
$this->assertCount(4, $messages);
foreach (
[
'init_foo' => 'skipping',
'do_stuff' => 'skipping',
'random_hack' => 'migrating',
'another_foo' => 'migrating',
] as $value => $type
) {
$contains = false;
foreach ($messages as $message) {
if (!Str::contains(strtolower($message), $type) || !Str::contains(strtolower($message), $value)) {
continue;
}
$contains = true;
break;
}
$this->assertTrue($contains, sprintf('Missing message "%s: %s"', $type, $value));
}
$messages = [];
$migration->run('foo', Migrate::UP, true);
$this->assertCount(3, $messages);
$migration->run('foo', Migrate::DOWN, true);
}
/**
* @covers \Engelsystem\Database\Migration\Migrate::getMigrated
* @covers \Engelsystem\Database\Migration\Migrate::migrate
* @covers \Engelsystem\Database\Migration\Migrate::setMigrated
* @covers \Engelsystem\Database\Migration\Migrate::getMigrationFiles
* @covers \Engelsystem\Database\Migration\Migrate::initMigration
* @covers \Engelsystem\Database\Migration\Migrate::getTableQuery
*/
public function testRunIntegration()
{
$app = new Application();
$dbManager = new CapsuleManager($app);
$dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']);
$dbManager->bootEloquent();
$db = $dbManager->getConnection();
$db->useDefaultSchemaGrammar();
$scheme = $db->getSchemaBuilder();
$app->instance('scheme', $scheme);
$app->bind(SchemaBuilder::class, 'scheme');
$migration = new Migrate($scheme, $app);
$messages = [];
$migration->setOutput(function ($msg) use (&$messages) {
$messages[] = $msg;
});
$migration->run(__DIR__ . '/Stub', Migrate::UP);
$this->assertTrue($scheme->hasTable('migrations'));
$migrations = $db->table('migrations')->get();
$this->assertCount(3, $migrations);
$this->assertTrue($migrations->contains('migration', '2001_04_11_123456_create_lorem_ipsum_table'));
$this->assertTrue($migrations->contains('migration', '2017_12_24_053300_another_stuff'));
$this->assertTrue($migrations->contains('migration', '2022_12_22_221222_add_some_feature'));
$this->assertTrue($scheme->hasTable('lorem_ipsum'));
$migration->run(__DIR__ . '/Stub', Migrate::DOWN, true);
$migrations = $db->table('migrations')->get();
$this->assertCount(2, $migrations);
$migration->run(__DIR__ . '/Stub', Migrate::DOWN);
$migrations = $db->table('migrations')->get();
$this->assertCount(0, $migrations);
$this->assertFalse($scheme->hasTable('lorem_ipsum'));
}
}

@ -0,0 +1,55 @@
<?php
namespace Engelsystem\Test\Unit\Database\Migration;
use Engelsystem\Database\Db;
use Engelsystem\Database\Migration\Migrate;
use Engelsystem\Database\Migration\MigrationServiceProvider;
use Engelsystem\Test\Unit\ServiceProviderTest;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
class MigrationServiceProviderTest extends ServiceProviderTest
{
/**
* @covers \Engelsystem\Database\Migration\MigrationServiceProvider::register()
*/
public function testRegister()
{
/** @var MockObject|Migrate $migration */
$migration = $this->getMockBuilder(Migrate::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|CapsuleManager $dbManager */
$dbManager = $this->getMockBuilder(CapsuleManager::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|Connection $dbConnection */
$dbConnection = $this->getMockBuilder(Connection::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|SchemaBuilder $schemaBuilder */
$schemaBuilder = $this->getMockBuilder(SchemaBuilder::class)
->disableOriginalConstructor()
->getMock();
$app = $this->getApp(['make', 'instance', 'bind']);
$app->expects($this->atLeastOnce())
->method('instance')
->withConsecutive(['db.scheme'], ['db.migration'])
->willReturnOnConsecutiveCalls($schemaBuilder, $migration);
$this->setExpects($app, 'bind', [SchemaBuilder::class, 'db.scheme']);
$this->setExpects($app, 'make', [Migrate::class], $migration);
$this->setExpects($dbConnection, 'getSchemaBuilder', null, $schemaBuilder);
$this->setExpects($dbManager, 'getConnection', null, $dbConnection);
Db::setDbManager($dbManager);
$serviceProvider = new MigrationServiceProvider($app);
$serviceProvider->register();
}
}

@ -0,0 +1,24 @@
<?php
namespace Engelsystem\Test\Unit\Database;
use AnotherStuff;
use Illuminate\Database\Schema\Builder as SchemaBuilder;
use PHPUnit\Framework\MockObject\MockBuilder;
use PHPUnit\Framework\TestCase;
class MigrationTest extends TestCase
{
public function testConstructor()
{
require_once __DIR__ . '/Stub/2017_12_24_053300_another_stuff.php';
/** @var MockBuilder|SchemaBuilder $schemaBuilder */
$schemaBuilder = $this->getMockBuilder(SchemaBuilder::class)
->disableOriginalConstructor()
->getMock();
$instance = new AnotherStuff($schemaBuilder);
$this->assertAttributeEquals($schemaBuilder, 'schema', $instance);
}
}

@ -0,0 +1,27 @@
<?php
use Engelsystem\Database\Migration\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateLoremIpsumTable extends Migration
{
/**
* Run the migration
*/
public function up()
{
$this->schema->create('lorem_ipsum', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('email');
});
}
/**
* Reverse the migration
*/
public function down()
{
$this->schema->dropIfExists('lorem_ipsum');
}
}

@ -0,0 +1,22 @@
<?php
use Engelsystem\Database\Migration\Migration;
class AnotherStuff extends Migration
{
/**
* Run the migration
*/
public function up()
{
// nope
}
/**
* Reverse the migration
*/
public function down()
{
// nope
}
}

@ -0,0 +1,22 @@
<?php
use Engelsystem\Database\Migration\Migration;
class AddSomeFeature extends Migration
{
/**
* Run the migration
*/
public function up()
{
// nope
}
/**
* Reverse the migration
*/
public function down()
{
// nope
}
}
Loading…
Cancel
Save