4
4
5
5
use Illuminate \Contracts \Validation \ValidationRule ;
6
6
use Illuminate \Database \Eloquent \Builder ;
7
+ use Illuminate \Validation \ValidationException ;
7
8
use InvalidArgumentException ;
8
- use Matteoc99 \LaravelPreference \Casts \RuleCaster ;
9
9
use Matteoc99 \LaravelPreference \Casts \ValueCaster ;
10
10
use Matteoc99 \LaravelPreference \Contracts \CastableEnum ;
11
11
use Matteoc99 \LaravelPreference \Contracts \PreferenceGroup ;
12
+ use Matteoc99 \LaravelPreference \Contracts \PreferencePolicy ;
12
13
use Matteoc99 \LaravelPreference \Enums \Cast ;
13
14
use Matteoc99 \LaravelPreference \Models \Preference ;
14
15
use Matteoc99 \LaravelPreference \Utils \SerializeHelper ;
16
+ use Matteoc99 \LaravelPreference \Utils \ValidationHelper ;
15
17
16
18
class PreferenceBuilder
17
19
{
@@ -56,6 +58,12 @@ private function withName(PreferenceGroup $name): static
56
58
}
57
59
58
60
61
+ public function withPolicy (PreferencePolicy $ policy ): static
62
+ {
63
+ $ this ->preference ->policy = $ policy ;
64
+ return $ this ;
65
+ }
66
+
59
67
public function withDefaultValue (mixed $ value ): static
60
68
{
61
69
$ this ->preference ->default_value = $ value ;
@@ -76,16 +84,25 @@ public function withRule(ValidationRule $rule): static
76
84
77
85
public function create (): Preference
78
86
{
79
- $ this ->preference ->save ();
80
- return $ this ->preference ;
87
+ return $ this ->updateOrCreate ();
81
88
}
82
89
83
90
public function updateOrCreate (): Preference
84
91
{
85
- $ this ->preference = Preference::updateOrCreate ($ this ->preference ->toArrayOnly (['name ' , 'group ' ]));
86
- return $ this ->preference ;
92
+ if (isset ($ this ->preference ->default_value )) {
93
+ ValidationHelper::validatePreference ($ this ->preference );
94
+ }
95
+
96
+ $ this ->preference = Preference::updateOrCreate (
97
+ $ this ->preference ->toArrayOnly (['name ' , 'group ' ]),
98
+ $ this ->preference ->attributesToArray ()
99
+ );
100
+ return $ this ->preference ->fresh ();
87
101
}
88
102
103
+ /**
104
+ * @throws ValidationException
105
+ */
89
106
public static function initBulk (array $ preferences ): void
90
107
{
91
108
if (empty ($ preferences )) {
@@ -96,25 +113,27 @@ public static function initBulk(array $preferences): void
96
113
if (empty ($ preferenceData ['cast ' ])) {
97
114
$ preferenceData ['cast ' ] = Cast::STRING ;
98
115
}
99
-
100
116
if (empty ($ preferenceData ['name ' ]) || !($ preferenceData ['name ' ] instanceof PreferenceGroup)) {
101
117
throw new InvalidArgumentException (
102
118
sprintf ("index: #%s name is required and needs to be a PreferenceGroup " , $ key )
103
119
);
104
120
}
105
-
106
121
if (empty ($ preferenceData ['cast ' ]) || !($ preferenceData ['cast ' ] instanceof CastableEnum)) {
107
122
throw new InvalidArgumentException (
108
123
sprintf ("index: #%s cast is required and needs to implement 'CastableEnum' " , $ key )
109
124
);
110
125
}
111
-
112
- if (!empty ($ preferenceData ['default_value ' ]) && !empty ($ preferenceData ['rule ' ]) && !$ preferenceData ['rule ' ]->passes ('' , $ preferenceData ['default_value ' ])) {
126
+ if (!empty ($ preferenceData ['rule ' ]) && !$ preferenceData ['rule ' ] instanceof ValidationRule) {
113
127
throw new InvalidArgumentException (
114
- sprintf ("index: #%s default_value fails the validation rule " , $ key )
128
+ sprintf ("index: #%s validation rule musst implement ValidationRule " , $ key )
115
129
);
116
130
}
117
131
132
+ if (!empty ($ preferenceData ['default_value ' ])) {
133
+ ValidationHelper::validateValue ($ preferenceData ['default_value ' ], $ preferenceData ['cast ' ], $ preferenceData ['rule ' ]);
134
+ }
135
+
136
+
118
137
if (array_key_exists ('group ' , $ preferenceData )) {
119
138
throw new InvalidArgumentException (
120
139
sprintf ("index: #%s group has been deprecated " , $ key )
@@ -170,4 +189,6 @@ public static function deleteBulk(array $preferences): int
170
189
171
190
return $ query ->delete ();
172
191
}
192
+
193
+
173
194
}
0 commit comments