Added EventConfig model
This commit is contained in:
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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