Added EventConfig model

This commit is contained in:
Igor Scheller 2018-09-24 14:19:13 +02:00 committed by msquare
parent c4867811e2
commit 63d1292bf8
4 changed files with 323 additions and 0 deletions

View File

@ -0,0 +1,101 @@
<?php
namespace Engelsystem\Migrations;
use Carbon\Carbon;
use Engelsystem\Database\Migration\Migration;
use Engelsystem\Models\EventConfig;
use Illuminate\Database\Schema\Blueprint;
class CreateEventConfigTable extends Migration
{
protected $mapping = [
'buildup_start_date' => 'buildup_start',
'event_start_date' => 'event_start',
'event_end_date' => 'event_end',
'teardown_end_date' => 'teardown_end',
];
/**
* Run the migration
*/
public function up()
{
$this->schema->create('event_config', function (Blueprint $table) {
$table->string('name')->index()->unique();
$table->json('value');
$table->timestamps();
});
if ($this->schema->hasTable('EventConfig')) {
$config = $this->schema->getConnection()
->table('EventConfig')
->first();
if (!empty($config)) {
(new EventConfig([
'name' => 'name',
'value' => $config->event_name,
]))->save();
(new EventConfig([
'name' => 'welcome_msg',
'value' => $config->event_welcome_msg,
]))->save();
foreach ($this->mapping as $old => $new) {
(new EventConfig([
'name' => $new,
'value' => (new Carbon())->setTimestamp($config->{$old}),
]))->save();
}
}
$this->schema->drop('EventConfig');
}
}
/**
* Reverse the migration
*/
public function down()
{
$this->schema->create('EventConfig', function (Blueprint $table) {
$table->string('event_name')->nullable();
$table->integer('buildup_start_date')->nullable();
$table->integer('event_start_date')->nullable();
$table->integer('event_end_date')->nullable();
$table->integer('teardown_end_date')->nullable();
$table->string('event_welcome_msg')->nullable();
});
$config = new EventConfig();
$data = [
'event_name' => $config->findOrNew('name')->value,
'event_welcome_msg' => $config->findOrNew('welcome_msg')->value,
];
foreach ($this->mapping as $new => $old) {
/** @var Carbon $value */
$value = $config->findOrNew($old)->value;
if (!$value) {
continue;
}
$data[$new] = $value->getTimestamp();
}
$dataNotEmpty = false;
foreach ($data as $value) {
$dataNotEmpty |= !empty($value);
}
if ($dataNotEmpty) {
$this->schema->getConnection()
->table('EventConfig')
->insert($data);
}
$this->schema->dropIfExists('event_config');
}
}

View File

@ -0,0 +1,93 @@
<?php
namespace Engelsystem\Models;
use Carbon\Carbon;
class EventConfig extends BaseModel
{
/** @var string The primary key for the model */
protected $primaryKey = 'name';
/** @var bool Indicates if the IDs are auto-incrementing */
public $incrementing = false;
/** @var string Required because it is not event_configs */
protected $table = 'event_config';
/** @var array Values that are mass assignable */
protected $fillable = ['name', 'value'];
/** @var array The configuration values that should be cast to native types */
protected $valueCasts = [
'buildup_start' => 'date',
'event_start' => 'date',
'event_end' => 'date',
'teardown_end' => 'date',
];
/** @var bool It could be interesting to know when a value changed the last time */
public $timestamps = true;
/**
* Value accessor
*
* @param mixed $value
* @return mixed
*/
public function getValueAttribute($value)
{
$value = $this->fromJson($value);
/** @see \Illuminate\Database\Eloquent\Concerns\HasAttributes::castAttribute */
if (!empty($value)) {
switch ($this->getValueCast($this->name)) {
case 'date':
return Carbon::createFromFormat('Y-m-d', $value)
->setTime(0, 0);
case 'datetime':
return Carbon::createFromFormat(Carbon::ISO8601, $value);
}
}
return $value;
}
/**
* Value mutator
*
* @param mixed $value
* @return static
*/
public function setValueAttribute($value)
{
if (!empty($value)) {
switch ($this->getValueCast($this->name)) {
case 'date':
/** @var Carbon $value */
$value = $value->toDateString();
break;
case 'datetime':
/** @var Carbon $value */
$value = $value->toIso8601String();
break;
}
}
$value = $this->castAttributeAsJson('value', $value);
$this->attributes['value'] = $value;
return $this;
}
/**
* Check if the value has to be casted
*
* @param string $value
* @return string|null
*/
protected function getValueCast($value)
{
return isset($this->valueCasts[$value]) ? $this->valueCasts[$value] : null;
}
}

View File

@ -21,6 +21,7 @@ trait HasDatabase
{ {
$dbManager = new CapsuleManager(); $dbManager = new CapsuleManager();
$dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']); $dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']);
$dbManager->bootEloquent();
$connection = $dbManager->getConnection(); $connection = $dbManager->getConnection();
$connection->getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $connection->getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

View File

@ -0,0 +1,128 @@
<?php
namespace Engelsystem\Test\Unit\Models;
use Carbon\Carbon;
use Engelsystem\Models\EventConfig;
use Engelsystem\Test\Unit\HasDatabase;
use PHPUnit\Framework\TestCase;
class EventConfigTest extends TestCase
{
use HasDatabase;
/**
* @covers \Engelsystem\Models\EventConfig::setValueAttribute
*/
public function testSetValueAttribute()
{
(new EventConfig())
->setAttribute('name', 'foo')
->setAttribute('value', 'bar')
->save();
$this->assertEquals(
'"bar"',
$this->database
->selectOne("SELECT `value` FROM event_config WHERE name='foo'")
->value
);
(new EventConfig())
->setAttribute('name', 'buildup_start')
->setAttribute('value', new Carbon('2000-01-01 10:20'))
->save();
$this->assertEquals(
'"2000-01-01"',
$this->database
->selectOne("SELECT `value` FROM event_config WHERE name='buildup_start'")
->value
);
($this->getEventConfig())
->setAttribute('name', 'event_start')
->setValueCast('event_start', 'datetime')
->setAttribute('value', new Carbon('2010-11-11 20:22'))
->save();
$this->assertEquals(
'"' . (new Carbon('2010-11-11 20:22'))->format(Carbon::ATOM) . '"',
$this->database
->selectOne("SELECT `value` FROM event_config WHERE name='event_start'")
->value
);
}
/**
* @covers \Engelsystem\Models\EventConfig::getValueAttribute
*/
public function testGetValueAttribute()
{
$model = new EventConfig(['name', 'buildup_start', 'value' => '']);
$this->assertEquals('', $model->value);
(new EventConfig())
->setAttribute('name', 'buildup_start')
->setAttribute('value', new Carbon('2001-02-03 11:12'))
->save();
$this->assertEquals(
'2001-02-03 00:00',
EventConfig::find('buildup_start')
->value
->format('Y-m-d H:i')
);
($this->getEventConfig())
->setAttribute('name', 'event_start')
->setValueCast('event_start', 'datetime')
->setAttribute('value', new Carbon('2010-11-11 20:22'))
->save();
$this->assertEquals(
'2010-11-11 20:22',
($this->getEventConfig())->find('event_start')
->setValueCast('event_start', 'datetime')
->value
->format('Y-m-d H:i')
);
}
/**
* @covers \Engelsystem\Models\EventConfig::getValueCast
*/
public function testGetValueCast()
{
$model = new EventConfig(['value' => 'bar']);
$this->assertEquals('bar', $model->value);
return;
}
/**
* Init a new EventConfig class
*
* @return EventConfig
*/
protected function getEventConfig()
{
return new class extends EventConfig
{
/**
* @param string $value
* @param string $type
* @return EventConfig
*/
public function setValueCast($value, $type)
{
$this->valueCasts[$value] = $type;
return $this;
}
};
}
/**
* Prepare test
*/
protected function setUp()
{
$this->initDatabase();
}
}