Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
EventConfig
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
3 / 3
6
100.00% covered (success)
100.00%
1 / 1
 getValueAttribute
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 setValueAttribute
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 getValueCast
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Engelsystem\Models;
6
7use DateTimeInterface;
8use Engelsystem\Helpers\Carbon;
9use Illuminate\Database\Query\Builder as QueryBuilder;
10
11/**
12 * @property string $name
13 * @property string $value
14 * @property Carbon|null $created_at
15 * @property Carbon|null $updated_at
16 *
17 * @method static QueryBuilder|EventConfig[] whereName($value)
18 * @method static QueryBuilder|EventConfig[] whereValue($value)
19 * @method static QueryBuilder|EventConfig[] whereCreatedAt($value)
20 * @method static QueryBuilder|EventConfig[] whereUpdatedAt($value)
21 */
22class EventConfig extends BaseModel
23{
24    /** @var string The primary key for the model */
25    protected $primaryKey = 'name'; // phpcs:ignore
26
27    /** @var bool Indicates if the IDs are auto-incrementing */
28    public $incrementing = false; // phpcs:ignore
29
30    /** @var string Required because it is not event_configs */
31    protected $table = 'event_config'; // phpcs:ignore
32
33    /** @var array Values that are mass assignable */
34    protected $fillable = ['name', 'value']; // phpcs:ignore
35
36    /** @var array<string, string> The configuration values that should be cast to native types */
37    protected array $valueCasts = [
38        'buildup_start' => 'datetime_human',
39        'event_start'   => 'datetime_human',
40        'event_end'     => 'datetime_human',
41        'teardown_end'  => 'datetime_human',
42        'last_metrics'  => 'datetime',
43    ];
44
45    /** @var bool It could be interesting to know when a value changed the last time */
46    public $timestamps = true; // phpcs:ignore
47
48    /**
49     * Value accessor
50     */
51    public function getValueAttribute(mixed $value): mixed
52    {
53        $value = $value ? $this->fromJson($value) : null;
54
55        /** @see \Illuminate\Database\Eloquent\Concerns\HasAttributes::castAttribute */
56        if (!empty($value)) {
57            return match ($this->getValueCast($this->name)) {
58                'datetime_human' => Carbon::make($value),
59                'datetime'       => Carbon::createFromFormat(DateTimeInterface::ATOM, $value),
60                default          => $value,
61            };
62        }
63
64        return $value;
65    }
66
67    /**
68     * Value mutator
69     */
70    public function setValueAttribute(mixed $value): static
71    {
72        if (!empty($value)) {
73            /** @var Carbon $value */
74            $value = match ($this->getValueCast($this->name)) {
75                'datetime_human' => $value->toDateTimeString('minute'),
76                'datetime'       => $value->format(DateTimeInterface::ATOM),
77                default          => $value,
78            };
79        }
80
81        $value = $this->castAttributeAsJson('value', $value);
82        $this->attributes['value'] = $value;
83
84        return $this;
85    }
86
87    /**
88     * Check if the value has to be casted
89     */
90    protected function getValueCast(string $value): ?string
91    {
92        return $this->valueCasts[$value] ?? null;
93    }
94}