44
55use Illuminate \Contracts \Validation \ValidationRule ;
66use Illuminate \Database \Eloquent \Builder ;
7+ use Illuminate \Validation \ValidationException ;
78use InvalidArgumentException ;
8- use Matteoc99 \LaravelPreference \Casts \RuleCaster ;
99use Matteoc99 \LaravelPreference \Casts \ValueCaster ;
1010use Matteoc99 \LaravelPreference \Contracts \CastableEnum ;
1111use Matteoc99 \LaravelPreference \Contracts \PreferenceGroup ;
12+ use Matteoc99 \LaravelPreference \Contracts \PreferencePolicy ;
1213use Matteoc99 \LaravelPreference \Enums \Cast ;
1314use Matteoc99 \LaravelPreference \Models \Preference ;
1415use Matteoc99 \LaravelPreference \Utils \SerializeHelper ;
16+ use Matteoc99 \LaravelPreference \Utils \ValidationHelper ;
1517
1618class PreferenceBuilder
1719{
@@ -56,6 +58,12 @@ private function withName(PreferenceGroup $name): static
5658 }
5759
5860
61+ public function withPolicy (PreferencePolicy $ policy ): static
62+ {
63+ $ this ->preference ->policy = $ policy ;
64+ return $ this ;
65+ }
66+
5967 public function withDefaultValue (mixed $ value ): static
6068 {
6169 $ this ->preference ->default_value = $ value ;
@@ -76,16 +84,25 @@ public function withRule(ValidationRule $rule): static
7684
7785 public function create (): Preference
7886 {
79- $ this ->preference ->save ();
80- return $ this ->preference ;
87+ return $ this ->updateOrCreate ();
8188 }
8289
8390 public function updateOrCreate (): Preference
8491 {
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 ();
87101 }
88102
103+ /**
104+ * @throws ValidationException
105+ */
89106 public static function initBulk (array $ preferences ): void
90107 {
91108 if (empty ($ preferences )) {
@@ -96,25 +113,27 @@ public static function initBulk(array $preferences): void
96113 if (empty ($ preferenceData ['cast ' ])) {
97114 $ preferenceData ['cast ' ] = Cast::STRING ;
98115 }
99-
100116 if (empty ($ preferenceData ['name ' ]) || !($ preferenceData ['name ' ] instanceof PreferenceGroup)) {
101117 throw new InvalidArgumentException (
102118 sprintf ("index: #%s name is required and needs to be a PreferenceGroup " , $ key )
103119 );
104120 }
105-
106121 if (empty ($ preferenceData ['cast ' ]) || !($ preferenceData ['cast ' ] instanceof CastableEnum)) {
107122 throw new InvalidArgumentException (
108123 sprintf ("index: #%s cast is required and needs to implement 'CastableEnum' " , $ key )
109124 );
110125 }
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) {
113127 throw new InvalidArgumentException (
114- sprintf ("index: #%s default_value fails the validation rule " , $ key )
128+ sprintf ("index: #%s validation rule musst implement ValidationRule " , $ key )
115129 );
116130 }
117131
132+ if (!empty ($ preferenceData ['default_value ' ])) {
133+ ValidationHelper::validateValue ($ preferenceData ['default_value ' ], $ preferenceData ['cast ' ], $ preferenceData ['rule ' ]);
134+ }
135+
136+
118137 if (array_key_exists ('group ' , $ preferenceData )) {
119138 throw new InvalidArgumentException (
120139 sprintf ("index: #%s group has been deprecated " , $ key )
@@ -170,4 +189,6 @@ public static function deleteBulk(array $preferences): int
170189
171190 return $ query ->delete ();
172191 }
192+
193+
173194}
0 commit comments