commit
a103bc06e2
|
@ -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}"
|
||||
|
|
14
README.md
14
README.md
|
@ -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/).
|
||||
|
|
|
@ -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",
|
||||
"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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
if (!is_readable(__DIR__ . '/../vendor/autoload.php')) {
|
||||
die('Please run composer.phar install');
|
||||
echo 'Please run composer.phar install';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Include composer autoloader
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
|
|
|
@ -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.'));
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@ function load_room()
|
|||
}
|
||||
|
||||
$room = Room(request()->input('room_id'));
|
||||
if ($room == null) {
|
||||
if (empty($room)) {
|
||||
redirect(page_link_to());
|
||||
}
|
||||
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
|
|
|
@ -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']))) {
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
|
|
|
@ -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.'));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -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)) . ' 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());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -48,7 +48,7 @@ function gettext_init()
|
|||
*/
|
||||
function gettext_locale($locale = null)
|
||||
{
|
||||
if ($locale == null) {
|
||||
if (empty($locale)) {
|
||||
$locale = session()->get('locale');
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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` = ?,
|
||||
|
|
|
@ -58,5 +58,5 @@ function LogEntries_filter($keyword)
|
|||
*/
|
||||
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)
|
||||
{
|
||||
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.
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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' => ''
|
||||
];
|
||||
}
|
||||
|
||||
?>
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
'',
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
|
|
|
@ -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']))) {
|
||||
|
|
|
@ -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.');
|
||||
}
|
||||
|
||||
|
|
|
@ -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'];
|
||||
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
||||
?>
|
|
@ -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 & 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.');
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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…
Reference in New Issue