Merge pull request #452 from MyIgel/rebuild-database

Rebuild database
This commit is contained in:
msquare 2018-09-02 16:55:35 +02:00 committed by GitHub
commit a103bc06e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
74 changed files with 1274 additions and 569 deletions

View File

@ -29,15 +29,14 @@ before_script:
- &before_install_xdebug |-
pecl install 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
- &before_install_composer |-
curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
composer --no-ansi install
# MySQL DB
- &before_setup_mysql |-
chmod +x ./bin/migrate
./bin/migrate
# Install Node.js and Yarn
- &before_install_yarn |-
apt -yqq install gnupg2 apt-transport-https
@ -86,7 +85,7 @@ test:7.1:
# Install project and dependencies
- &deployment_dependencies |-
chmod +x ./deploy.sh
chmod +x ./bin/deploy.sh
apt update && apt install -yqq rsync openssh-client
composer --no-ansi install --no-dev
composer --no-ansi dump-autoload --optimize
@ -116,7 +115,7 @@ deploy_staging:
- *deployment_ssh
- *deployment_dependencies
# 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_definition
@ -133,4 +132,4 @@ deploy_production:
- *deployment_ssh
- *deployment_dependencies
# 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}"

View File

@ -41,8 +41,8 @@ To report bugs use [engelsystem/issues](https://github.com/engelsystem/engelsyst
* Recommended: Directory Listing should be disabled.
* 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```.
* To import the database the ```bin/migrate``` script has to be called.
* In the browser, login with credentials ```admin```:```asdfasdf``` and change the password.
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.
#### deploy.sh
The `deploy.sh` script can be used to deploy the engelsystem. It uses rsync to deploy the application to a server over ssh.
#### Scripts
##### 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
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/).

38
bin/migrate Executable file
View File

@ -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);

View File

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

View File

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

View File

@ -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);
}
}
}
}

View File

@ -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');
}
}

37
includes/application.php Normal file
View File

@ -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);
}

View File

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

View File

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

View File

@ -28,7 +28,7 @@ function event_config_edit_controller()
$teardown_end_date = null;
$event_config = EventConfig();
if ($event_config != null) {
if (!empty($event_config)) {
$event_name = $event_config['event_name'];
$buildup_start_date = $event_config['buildup_start_date'];
$event_start_date = $event_config['event_start_date'];
@ -70,22 +70,22 @@ function event_config_edit_controller()
$teardown_end_date = $result->getValue();
$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;
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;
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;
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;
error(_('The buildup start date has to be before the teardown end date.'));
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,7 +14,7 @@ function user_driver_license_required_hint()
$user_driver_license = UserDriverLicense($user['UID']);
// User has already entered data, no hint needed.
if ($user_driver_license != null) {
if (!empty($user_driver_license)) {
return null;
}
@ -60,7 +60,7 @@ function user_driver_licenses_controller()
*/
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', ['user_id' => $user['UID']]);
@ -79,7 +79,7 @@ function user_driver_license_load_user()
if ($request->has('user_id')) {
$user_source = User($request->input('user_id'));
if ($user_source == null) {
if (empty($user_source)) {
redirect(user_driver_license_edit_link());
}
}
@ -104,7 +104,7 @@ function user_driver_license_edit_controller()
}
$user_driver_license = UserDriverLicense($user_source['UID']);
if ($user_driver_license == null) {
if (empty($user_driver_license)) {
$wants_to_drive = false;
$user_driver_license = UserDriverLicense_new();
} else {
@ -122,7 +122,7 @@ function user_driver_license_edit_controller()
$user_driver_license['has_license_forklift'] = $request->has('has_license_forklift');
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);
} else {
UserDriverLicenses_update($user_driver_license);
@ -133,7 +133,7 @@ function user_driver_license_edit_controller()
} else {
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']);
engelsystem_log('Driver license information removed.');
success(_('Your driver license information has been removed.'));

View File

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

View File

@ -190,7 +190,7 @@ function user_controller()
$user_source = $user;
if ($request->has('user_id')) {
$user_source = User($request->input('user_id'));
if ($user_source == null) {
if (empty($user_source)) {
error(_('User not found.'));
redirect(page_link_to('/'));
}
@ -225,7 +225,7 @@ function user_controller()
User_reset_api_key($user_source, false);
}
if($user_source['force_active']) {
if ($user_source['force_active']) {
$tshirt_score = _('Enough');
} else {
$tshirt_score = sprintf('%.2f', User_tshirt_score($user_source)) . '&nbsp;h';
@ -297,7 +297,7 @@ function user_password_recovery_set_new_controller()
{
$request = request();
$user_source = User_by_password_recovery_token($request->input('token'));
if ($user_source == null) {
if (empty($user_source)) {
error(_('Token is not correct.'));
redirect(page_link_to('login'));
}
@ -343,7 +343,7 @@ function user_password_recovery_start_controller()
$email = strip_request_item('email');
if (check_email($email)) {
$user_source = User_by_email($email);
if ($user_source == null) {
if (empty($user_source)) {
$valid = false;
error(_('E-mail address is not correct.'));
}
@ -412,8 +412,7 @@ function load_user()
}
$user = User($request->input('user_id'));
if ($user == null) {
if (empty($user)) {
error(_('User doesn\'t exist.'));
redirect(page_link_to());
}

View File

@ -1,14 +1,9 @@
<?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';
/**
* 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
*/

View File

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

View File

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

View File

@ -9,7 +9,9 @@ use Engelsystem\Database\DB;
*/
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 $teardown_end_date
* @param string $event_welcome_msg
* @return int Rows updated
* @return bool
*/
function EventConfig_update(
$event_name,
@ -31,7 +33,8 @@ function EventConfig_update(
$teardown_end_date,
$event_welcome_msg
) {
if (EventConfig() == null) {
$eventConfig = EventConfig();
if (empty($eventConfig)) {
return DB::insert('
INSERT INTO `EventConfig` (
`event_name`,
@ -54,7 +57,7 @@ function EventConfig_update(
);
}
return DB::update('
return (bool)DB::update('
UPDATE `EventConfig` SET
`event_name` = ?,
`buildup_start_date` = ?,

View File

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

View File

@ -20,7 +20,9 @@ function Message_ids()
*/
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;
}
/**

View File

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

View File

@ -138,7 +138,9 @@ function ShiftEntry_update($shift_entry)
*/
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;
}
/**

View File

@ -70,7 +70,9 @@ function ShiftType_create($name, $angeltype_id, $description)
*/
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;
}
/**

View File

@ -48,7 +48,7 @@ class ShiftsFilter
* @param int[] $rooms
* @param int[] $types
*/
public function __construct($user_shifts_admin, $rooms, $types)
public function __construct($user_shifts_admin = false, $rooms = [], $types = [])
{
$this->rooms = $rooms;
$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
*/

View File

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

View File

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

View File

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

View File

@ -1,22 +1,27 @@
<?php
use Engelsystem\Database\Db;
/**
* Load a single work log entry.
*
* @param int $user_worklog_id
* @return array|null
*/
function UserWorkLog($user_worklog_id)
{
return Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [
$workLog = Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [
$user_worklog_id
]);
return empty($workLog) ? null : $workLog;
}
/**
* Returns all work log entries for a user.
*
* @param User $user
* @param array $user
* @return array[]
*/
function UserWorkLogsForUser($user)
{
@ -28,7 +33,8 @@ function UserWorkLogsForUser($user)
/**
* Delete a work log entry.
*
* @param UserWorkLog $userWorkLog
* @param $userWorkLog
* @return int
*/
function UserWorkLog_delete($userWorkLog)
{
@ -37,7 +43,12 @@ function UserWorkLog_delete($userWorkLog)
$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;
}
@ -45,7 +56,8 @@ function UserWorkLog_delete($userWorkLog)
/**
* Update work log entry (only work hours and comment)
*
* @param UserWorkLog $userWorkLog
* @param $userWorkLog
* @return int
*/
function UserWorkLog_update($userWorkLog)
{
@ -62,7 +74,12 @@ function UserWorkLog_update($userWorkLog)
$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;
}
@ -70,7 +87,8 @@ function UserWorkLog_update($userWorkLog)
/**
* Create a new work log entry
*
* @param UserWorkLog $userWorkLog
* @param $userWorkLog
* @return bool
*/
function UserWorkLog_create($userWorkLog)
{
@ -95,7 +113,8 @@ function UserWorkLog_create($userWorkLog)
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;
}
@ -104,12 +123,13 @@ function UserWorkLog_create($userWorkLog)
* New user work log entry
*
* @param array[] $user
* @return array
*/
function UserWorkLog_new($user)
{
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', time()));
$event_config = EventConfig();
if (! empty($event_config['buildup_start_date'])) {
if (!empty($event_config['buildup_start_date'])) {
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', $event_config['buildup_start_date']));
}
return [
@ -119,5 +139,3 @@ function UserWorkLog_new($user)
'comment' => ''
];
}
?>

View File

@ -22,8 +22,10 @@ function User_delete($user_id)
* Accounts only ended shifts.
*
* @param array[] $user
* @return int
*/
function User_tshirt_score($user) {
function User_tshirt_score($user)
{
$shift_sum_formula = config('shift_sum_formula');
$result_shifts = DB::selectOne('
@ -43,7 +45,7 @@ function User_tshirt_score($user) {
LEFT JOIN `UserWorkLog` ON `User`.`UID` = `UserWorkLog`.`user_id`
WHERE `User`.`UID` = ?
AND `UserWorkLog`.`work_timestamp` < ?
',[
', [
$user['UID'],
time()
]);
@ -347,12 +349,12 @@ function User_validate_jabber($jabber)
*/
function User_validate_planned_arrival_date($planned_arrival_date)
{
if ($planned_arrival_date == null) {
if (is_null($planned_arrival_date)) {
// null is not okay
return new ValidationResult(false, time());
}
$event_config = EventConfig();
if ($event_config == null) {
if (empty($event_config)) {
// Nothing to validate against
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)
{
if ($planned_departure_date == null) {
if (is_null($planned_departure_date)) {
// null is okay
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);
}
$event_config = EventConfig();
if ($event_config == null) {
if (empty($event_config)) {
// Nothing to validate against
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)
{
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)
{
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.
*
* @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)
{
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)
{
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;
}
/**

View File

@ -101,7 +101,7 @@ function admin_active()
if ($request->has('active') && preg_match('/^\d+$/', $request->input('active'))) {
$user_id = $request->input('active');
$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]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.');
$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'))) {
$user_id = $request->input('not_active');
$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]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.');
$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'))) {
$user_id = $request->input('tshirt');
$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]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.');
$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'))) {
$user_id = $request->input('not_tshirt');
$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]);
engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.');
$msg = success(_('Angel has got no t-shirt.'), true);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -279,7 +279,7 @@ function guest_register()
}
// 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']);
}
@ -289,7 +289,7 @@ function guest_register()
$buildup_start_date = time();
$teardown_end_date = null;
if ($event_config != null) {
if (!empty($event_config)) {
if (isset($event_config['buildup_start_date'])) {
$buildup_start_date = $event_config['buildup_start_date'];
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,9 +28,9 @@ function AngelType_name_render($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['confirm_user_id'] == null) {
if (empty($user_angeltype['confirm_user_id'])) {
return glyph('lock') . _('Unconfirmed');
} elseif ($user_angeltype['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(
page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]),
_('join'),
'add'
);
} 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!'));
}
if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null) {
if ($angeltype['restricted'] && empty($user_angeltype['confirm_user_id'])) {
error(sprintf(
_('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'),
$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']);
}
if ($angeltype['restricted'] && $member['confirm_user_id'] == null) {
if ($angeltype['restricted'] && empty($member['confirm_user_id'])) {
$member['actions'] = table_buttons([
button(
page_link_to(
@ -526,7 +526,7 @@ function AngelTypes_about_view_angeltype($angeltype)
if (isset($angeltype['user_angeltype_id'])) {
$buttons = [];
if ($angeltype['user_angeltype_id'] != null) {
if (!empty($angeltype['user_angeltype_id'])) {
$buttons[] = button(
page_link_to(
'user_angeltypes',

View File

@ -8,7 +8,7 @@
*/
function EventConfig_countdown_page($event_config)
{
if ($event_config == null) {
if (empty($event_config)) {
return div('col-md-12 text-center', [
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 = [];
if ($event_config['event_name'] != null) {
if (!is_null($event_config['event_name'])) {
$elements[] = div('col-sm-12 text-center', [
heading(sprintf(
_('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', [
heading(_('Buildup starts'), 4),
'<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', [
heading(_('Event starts'), 4),
'<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', [
heading(_('Event ends'), 4),
'<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', [
heading(_('Teardown ends'), 4),
'<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)
{
if ($event_config == null) {
if (empty($event_config)) {
return '';
}
// Event name, start+end date are set
if (
$event_config['event_name'] != null
&& $event_config['event_start_date'] != null
&& $event_config['event_end_date'] != null
!is_null($event_config['event_name'])
&& !is_null($event_config['event_start_date'])
&& !is_null($event_config['event_end_date'])
) {
return sprintf(
_('%s, from %s to %s'),
@ -87,7 +87,7 @@ function EventConfig_info($event_config)
}
// 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(
_('%s, starting %s'), $event_config['event_name'],
date(_('Y-m-d'), $event_config['event_start_date'])
@ -95,7 +95,7 @@ function EventConfig_info($event_config)
}
// 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(
_('Event from %s to %s'),
date(_('Y-m-d'), $event_config['event_start_date']),
@ -104,7 +104,7 @@ function EventConfig_info($event_config)
}
// Only event name is set
if ($event_config['event_name'] != null) {
if (!is_null($event_config['event_name'])) {
return sprintf($event_config['event_name']);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -2,13 +2,18 @@
/**
* 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)
{
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([
button(user_link($user_source), glyph('remove') . _('cancel')),
button(user_worklog_delete_link($userWorkLog, [
@ -29,8 +34,9 @@ function UserWorkLog_delete_title()
/**
* Render edit table.
*
* @param User $user_source
* @param UserWorkLog $userWorkLog
* @param array $user_source
* @param array $userWorkLog
* @return string
*/
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.
*
* @param User $user_source
* @param UserWorkLog $userWorkLog
* @param array $user_source
* @param array $userWorkLog
* @return string
*/
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.
*
* @param User $user_source
* @param UserWorkLog $userWorkLog
* @param array $user_source
* @param array $userWorkLog
* @return string
*/
function UserWorkLog_add_view($user_source, $userWorkLog)
{
@ -92,5 +100,3 @@ function UserWorkLog_add_title()
{
return _('Add work log entry');
}
?>

View File

@ -406,10 +406,21 @@ function User_view_myshift($shift, $user_source, $its_me)
* @param array[] $shifts
* @param array $user_source
* @param bool $its_me
* @param int $tshirt_score
* @param bool $tshirt_admin
* @param array[] $user_worklogs
* @param $admin_user_worklog_privilege
* @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 = [];
$timesum = 0;
foreach ($shifts as $shift) {
@ -420,8 +431,8 @@ function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshi
}
}
if($its_me || $admin_user_worklog_privilege) {
foreach($user_worklogs as $worklog) {
if ($its_me || $admin_user_worklog_privilege) {
foreach ($user_worklogs as $worklog) {
$myshifts_table[$worklog['work_timestamp']] = User_view_worklog($worklog, $admin_user_worklog_privilege);
$timesum += $worklog['work_hours'] * 3600;
}
@ -453,12 +464,15 @@ function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshi
/**
* Renders table entry for user work log
* @param UserWorkLog $worklog
*
* @param array $worklog
* @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 = '';
if($admin_user_worklog_privilege) {
if ($admin_user_worklog_privilege) {
$actions = table_buttons([
button(
user_worklog_edit_link($worklog),
@ -500,6 +514,8 @@ function User_view_worklog($worklog, $admin_user_worklog_privilege) {
* @param bool $its_me
* @param int $tshirt_score
* @param bool $tshirt_admin
* @param bool $admin_user_worklog_privilege
* @param array[] $user_worklogs
* @return string
*/
function User_view(
@ -517,9 +533,17 @@ function User_view(
) {
$user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']);
$myshifts_table = '';
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);
if(count($my_shifts) > 0) {
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
);
if (count($my_shifts) > 0) {
$myshifts_table = table([
'date' => _('Day &amp; time'),
'duration' => _('Duration'),
@ -528,7 +552,7 @@ function User_view(
'comment' => _('Comment'),
'actions' => _('Action')
], $my_shifts);
} elseif($user_source['force_active']) {
} elseif ($user_source['force_active']) {
$myshifts_table = success(_('You have done enough to get a t-shirt.'), true);
}
}
@ -748,7 +772,7 @@ function User_angeltypes_render($user_angeltypes)
$output = [];
foreach ($user_angeltypes as $angeltype) {
$class = 'text-success';
if ($angeltype['restricted'] == 1 && $angeltype['confirm_user_id'] == null) {
if ($angeltype['restricted'] == 1 && empty($angeltype['confirm_user_id'])) {
$class = 'text-warning';
}
$output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">'
@ -821,7 +845,7 @@ function render_user_departure_date_hint()
{
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.');
return render_profile_link($text, null, 'alert-link');
}
@ -857,7 +881,7 @@ function render_user_arrived_hint()
if ($user['Gekommen'] == 0) {
$event_config = EventConfig();
if (!is_null($event_config)
if (!empty($event_config)
&& !is_null($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.');

View File

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

View File

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

View File

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

View File

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

View File

@ -2,68 +2,23 @@
namespace Engelsystem\Database;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection as DatabaseConnection;
use PDO;
use PDOException;
use PDOStatement;
class Db
{
/** @var PDO */
protected static $db;
/** @var PDOStatement */
protected static $stm = null;
/** @var bool */
protected static $lastStatus = true;
/** @var CapsuleManager */
protected static $dbManager;
/**
* Connect to database
* Set the database connection manager
*
* @param string $dsn
* @param string $username
* @param string $password
* @param array $options
* @return bool
* @param CapsuleManager $dbManager
*/
public static function connect($dsn, $username = null, $password = null, $options = [])
public static function setDbManager($dbManager)
{
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
*
* @param string $query
* @return bool
*/
public static function unprepared($query)
{
self::$stm = self::$db->query($query);
self::$lastStatus = (self::$stm instanceof PDOStatement);
return self::$lastStatus;
self::$dbManager = $dbManager;
}
/**
@ -75,9 +30,14 @@ class Db
*/
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 = [])
{
$result = self::select($query, $bindings);
$result = self::connection()->selectOne($query, $bindings);
// @TODO: remove typecast
$result = (array)$result;
if (empty($result)) {
return null;
}
return array_shift($result);
return $result;
}
/**
@ -103,13 +65,11 @@ class Db
*
* @param string $query
* @param array $bindings
* @return int Row count
* @return bool
*/
public static function insert($query, array $bindings = [])
{
self::query($query, $bindings);
return self::$stm->rowCount();
return self::connection()->insert($query, $bindings);
}
/**
@ -121,9 +81,7 @@ class Db
*/
public static function update($query, array $bindings = [])
{
self::query($query, $bindings);
return self::$stm->rowCount();
return self::connection()->update($query, $bindings);
}
/**
@ -135,37 +93,15 @@ class Db
*/
public static function delete($query, array $bindings = [])
{
self::query($query, $bindings);
return self::$stm->rowCount();
return self::connection()->delete($query, $bindings);
}
/**
* Run a single statement
*
* @param string $query
* @param array $bindings
* @return bool
* @return DatabaseConnection
*/
public static function statement($query, array $bindings = [])
public static function connection()
{
self::query($query, $bindings);
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();
return self::$dbManager->getConnection();
}
/**
@ -175,14 +111,6 @@ class Db
*/
public static function getPdo()
{
return self::$db;
}
/**
* @return PDOStatement|false|null
*/
public static function getStm()
{
return self::$stm;
return self::connection()->getPdo();
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -64,21 +64,6 @@ function config_path($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 mixed $default

View File

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

View File

@ -6,32 +6,86 @@ use Engelsystem\Config\Config;
use Engelsystem\Database\DatabaseServiceProvider;
use Engelsystem\Test\Unit\ServiceProviderTest;
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
{
/**
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
*/
public function testRegister()
{
/** @var PHPUnit_Framework_MockObject_MockObject|Config $config */
$config = $this->getMockBuilder(Config::class)
->getMock();
list($app, $dbManager) = $this->prepare(['driver' => 'sqlite', 'database' => ':memory:']);
$app = $this->getApp(['get']);
$this->setExpects($app, 'instance', ['db', $dbManager]);
$this->setExpects($app, 'get', ['config'], $config);
$this->setExpects($config, 'get', ['database'], [
$serviceProvider = new DatabaseServiceProvider($app);
$serviceProvider->register();
}
/**
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
*/
public function testRegisterError()
{
list($app) = $this->prepare([
'host' => 'localhost',
'db' => 'database',
'user' => 'user',
'pw' => 'password',
], $this->atLeastOnce());
'database' => 'database',
'username' => 'user',
'password' => 'password',
], true);
$this->expectException(Exception::class);
$serviceProvider = new DatabaseServiceProvider($app);
$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];
}
}

View File

@ -3,45 +3,45 @@
namespace Engelsystem\Test\Unit\Database;
use Engelsystem\Database\Db;
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Database\Connection as DatabaseConnection;
use PDO;
use PDOStatement;
use PHPUnit\Framework\TestCase;
use ReflectionObject;
use Throwable;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
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');
$this->assertFalse($result);
/** @var MockObject|Pdo $pdo */
$pdo = $this->getMockBuilder(Pdo::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|CapsuleManager $dbManager */
$dbManager = $this->getMockBuilder(CapsuleManager::class)
->disableOriginalConstructor()
->getMock();
/** @var MockObject|DatabaseConnection $dbManager */
$databaseConnection = $this->getMockBuilder(DatabaseConnection::class)
->disableOriginalConstructor()
->getMock();
$result = Db::connect('sqlite::memory:');
$this->assertTrue($result);
}
$dbManager
->expects($this->atLeastOnce())
->method('getConnection')
->willReturn($databaseConnection);
$databaseConnection
->expects($this->atLeastOnce())
->method('getPdo')
->willReturn($pdo);
/**
* @covers \Engelsystem\Database\Db::query()
*/
public function testQuery()
{
$stm = Db::query('SELECT * FROM test_data');
$this->assertEquals('00000', $stm->errorCode());
$stm = Db::query('SELECT * FROM test_data WHERE id = ?', [4]);
$this->assertEquals('00000', $stm->errorCode());
}
/**
* @covers \Engelsystem\Database\Db::unprepared()
*/
public function testUnprepared()
{
$return = Db::unprepared('SELECT * FROM test_data WHERE id = 3');
$this->assertTrue($return);
Db::setDbManager($dbManager);
$this->assertEquals($pdo, Db::getPdo());
$this->assertEquals($databaseConnection, Db::connection());
}
/**
@ -77,11 +77,8 @@ class DbTest extends TestCase
*/
public function testInsert()
{
$count = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')");
$this->assertEquals(2, $count);
$count = Db::insert('INSERT INTO test_data(id, data) VALUES (:id, :alias)', ['id' => 7, 'alias' => 'Blafoo']);
$this->assertEquals(1, $count);
$result = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')");
$this->assertTrue($result);
}
/**
@ -108,42 +105,6 @@ class DbTest extends TestCase
$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()
*/
@ -153,30 +114,26 @@ class DbTest extends TestCase
$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
*/
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::query(
Db::connection()->statement(
'
CREATE TABLE test_data(
id INT PRIMARY KEY 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("
INSERT INTO test_data (id, data)
VALUES

View File

@ -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'));
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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');
}
}

View File

@ -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
}
}

View File

@ -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
}
}