Added EventConfig model
parent
c4867811e2
commit
63d1292bf8
@ -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');
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue