Skip to content

Commit bb33583

Browse files
committed
bugfixes: BulkInit had no casting
readme for production
1 parent 77c79be commit bb33583

File tree

6 files changed

+40
-24
lines changed

6 files changed

+40
-24
lines changed

README.md

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
#
2-
3-
# work in progress
4-
51
# Laravel User Preferences
62

73
[![Latest Version on Packagist](https://img.shields.io/packagist/v/matteoc99/laravel-preference.svg?style=flat-square)](https://packagist.org/packages/matteoc99/laravel-preference)
@@ -223,7 +219,7 @@ class MyRule extends DataRule
223219

224220
## Test
225221

226-
`composer test ./tests`
222+
`composer test <path>`
227223

228224
## Security Vulnerabilities
229225

@@ -232,6 +228,7 @@ Please review [our security policy](SECURITY.md) on how to report security vulne
232228
## Credits
233229

234230
- [matteoc99](https://github.com/mattoc99)
231+
- [Joel Brown](https://stackoverflow.com/users/659653/joel-brown) for [this](https://stackoverflow.com/questions/10204902/database-design-for-user-settings/10228192#10228192) awesome starting point and initial inspiration
235232

236233
## License
237234

src/Casts/EnumCaster.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class EnumCaster implements CastsAttributes
1212
{
1313

1414

15-
public function get(Model $model, string $key, mixed $value, array $attributes): CastableEnum|null
15+
public function get(?Model $model, string $key, mixed $value, array $attributes): CastableEnum|null
1616
{
1717
return $this->deserializeEnum($value);
1818
}
@@ -33,7 +33,7 @@ protected function deserializeEnum($value)
3333
return $enumClass::tryFrom($value['value']);
3434
}
3535

36-
public function set(Model $model, string $key, mixed $value, array $attributes)
36+
public function set(?Model $model, string $key, mixed $value, array $attributes)
3737
{
3838
return json_encode($this->serializeEnum($value));
3939
}

src/Casts/RuleCaster.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class RuleCaster implements CastsAttributes
1212
{
13-
public function get(Model $model, string $key, mixed $value, array $attributes)
13+
public function get(?Model $model, string $key, mixed $value, array $attributes)
1414
{
1515
return $this->deserializerRule($value);
1616
}
@@ -38,7 +38,7 @@ protected function deserializerRule($value)
3838
return $rule;
3939
}
4040

41-
public function set(Model $model, string $key, mixed $value, array $attributes)
41+
public function set(?Model $model, string $key, mixed $value, array $attributes)
4242
{
4343
return json_encode($this->serializeRule($value));
4444
}

src/Casts/ValueCaster.php

+6-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
class ValueCaster implements CastsAttributes
1010
{
1111

12-
public function get(Model $model, string $key, mixed $value, array $attributes)
12+
public function __construct(protected ?CastableEnum $caster = null) { }
13+
14+
public function get(?Model $model, string $key, mixed $value, array $attributes)
1315
{
1416
$caster = $this->getCaster($model);
1517

@@ -22,7 +24,7 @@ public function get(Model $model, string $key, mixed $value, array $attributes)
2224

2325
}
2426

25-
public function set(Model $model, string $key, mixed $value, array $attributes)
27+
public function set(?Model $model, string $key, mixed $value, array $attributes)
2628
{
2729
$caster = $this->getCaster($model);
2830

@@ -34,9 +36,9 @@ public function set(Model $model, string $key, mixed $value, array $attributes)
3436
return $value;
3537
}
3638

37-
private function getCaster(Model $model): CastableEnum|null
39+
private function getCaster(?Model $model): CastableEnum|null
3840
{
39-
$caster = $model->cast ?? $model->preference?->cast ?? null;
41+
$caster = $this->caster ?? $model?->cast ?? $model?->preference?->cast ?? null;
4042

4143
return $caster instanceof CastableEnum ? $caster : null;
4244
}

src/Factory/PreferenceBuilder.php

+23-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
namespace Matteoc99\LaravelPreference\Factory;
44

55
use Illuminate\Database\Eloquent\Builder;
6+
use Matteoc99\LaravelPreference\Casts\EnumCaster;
7+
use Matteoc99\LaravelPreference\Casts\RuleCaster;
8+
use Matteoc99\LaravelPreference\Casts\ValueCaster;
69
use Matteoc99\LaravelPreference\Contracts\CastableEnum;
710
use Matteoc99\LaravelPreference\Contracts\HasValidation;
811
use Matteoc99\LaravelPreference\Enums\Cast;
@@ -101,20 +104,33 @@ public static function initBulk(array $preferences)
101104
);
102105
}
103106

107+
if (!empty($preferenceData['default_value']) && !empty($preferenceData['rule']) && !$preferenceData['rule']->passes('', $preferenceData['default_value'])) {
108+
throw new \InvalidArgumentException(
109+
sprintf("index: #%s default_value fails the validation rule", $key)
110+
);
111+
}
112+
113+
//cast values for DB
114+
115+
if(array_key_exists('rule',$preferenceData)){
116+
$ruleCaster = new RuleCaster();
117+
$preferenceData['rule'] = $ruleCaster->set(null,'',$preferenceData['rule'],[]);
118+
}
119+
if(array_key_exists('default_value',$preferenceData)){
120+
$valueCaster = new ValueCaster($preferenceData['cast']);
121+
$preferenceData['default_value'] = $valueCaster->set(null,'',$preferenceData['default_value'],[]);
122+
}
123+
124+
$enumCaster = new EnumCaster();
125+
$preferenceData['cast'] = $enumCaster->set(null,'',$preferenceData['cast'],[]);
126+
104127
// Ensure Defaults
105128
$preferenceData = array_merge([
106129
'group' => 'general',
107130
'default_value' => null,
108131
'description' => '',
109132
'rule' => null,
110133
], $preferenceData);
111-
112-
if ($preferenceData['default_value'] && $preferenceData['rule'] && !$preferenceData['rule']->passes('', $preferenceData['default_value'])) {
113-
throw new \InvalidArgumentException(
114-
sprintf("index: #%s default_value fails the validation rule", $key)
115-
);
116-
}
117-
118134
}
119135

120136
Preference::upsert($preferences, ['name', 'group']);

tests/PreferenceBuilderBulkTest.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Foundation\Testing\RefreshDatabase;
66
use Matteoc99\LaravelPreference\Enums\Cast;
77
use Matteoc99\LaravelPreference\Factory\PreferenceBuilder;
8+
use Matteoc99\LaravelPreference\Models\Preference;
89
use Matteoc99\LaravelPreference\Tests\Models\LowerThanRule;
910

1011
class PreferenceBuilderBulkTest extends TestCase
@@ -106,10 +107,10 @@ public function init_bulk_creates_new_and_updates_existing_preferences()
106107

107108
$this->assertDatabaseCount('preferences', 2);
108109
$this->assertDatabaseHas('preferences', ['name' => 'new_pref']);
109-
$this->assertDatabaseHas('preferences', [
110-
'name' => 'existing_pref',
111-
'cast' => Cast::INT->value,
112-
]);
110+
111+
$found = Preference::query()->where('name',"=",'existing_pref');
112+
$this->assertEquals(1, $found->count());
113+
$this->assertEquals(Cast::INT, $found->first()->cast);
113114
}
114115

115116
public function delete_bulk_does_not_deletes_all_matching_preferences_when_multiple_exist()

0 commit comments

Comments
 (0)