99use Matteoc99 \LaravelPreference \Contracts \CastableEnum ;
1010use Matteoc99 \LaravelPreference \Contracts \PreferenceGroup ;
1111use Matteoc99 \LaravelPreference \Enums \Cast ;
12+ use Matteoc99 \LaravelPreference \Exceptions \InvalidStateException ;
13+ use Matteoc99 \LaravelPreference \Factory \builders \BaseBuilder ;
1214use Matteoc99 \LaravelPreference \Factory \builders \ObjectPreferenceBuilder ;
1315use Matteoc99 \LaravelPreference \Factory \builders \PrimitivePreferenceBuilder ;
1416use Matteoc99 \LaravelPreference \Models \Preference ;
@@ -28,6 +30,7 @@ class PreferenceBuilder
2830 *
2931 * @return void Creates the preference and commits it to the database.
3032 *
33+ * @throws InvalidStateException
3134 * @example
3235 * ```
3336 * PreferenceBuilder::buildString(UserPreference::TEST, "default");
@@ -36,7 +39,7 @@ class PreferenceBuilder
3639 */
3740 public static function buildString (PreferenceGroup $ name , string $ default = null ): void
3841 {
39- self ::init ($ name )->nullable ()->withDefaultValue (null )->create ();
42+ self ::init ($ name )->nullable ()->withDefaultValue ($ default )->create ();
4043 }
4144
4245 /**
@@ -49,6 +52,7 @@ public static function buildString(PreferenceGroup $name, string $default = null
4952 *
5053 * @return void Creates the preference and commits it to the database.
5154 *
55+ * @throws InvalidStateException
5256 * @example
5357 * ```
5458 * PreferenceBuilder::buildArray(new SettingsPreferenceGroup(), ["item1", "item2"]);
@@ -58,7 +62,7 @@ public static function buildString(PreferenceGroup $name, string $default = null
5862 */
5963 public static function buildArray (PreferenceGroup $ name , array $ default = null ): void
6064 {
61- self ::init ($ name , Cast::ARRAY )->nullable ()->withDefaultValue (null )->create ();
65+ self ::init ($ name , Cast::ARRAY )->nullable ()->withDefaultValue ($ default )->create ();
6266 }
6367
6468
@@ -99,7 +103,7 @@ public static function init(PreferenceGroup $name, CastableEnum $cast = Cast::ST
99103 *
100104 * @param PreferenceGroup $name
101105 *
102- * @return int,
106+ * @return int
103107 */
104108 public static function delete (PreferenceGroup $ name ): int
105109 {
@@ -148,7 +152,23 @@ public static function initBulk(array $preferences, bool $nullable = false): voi
148152 throw new InvalidArgumentException ("no preferences provided " );
149153 }
150154
151- foreach ($ preferences as $ index => &$ preferenceData ) {
155+ $ cleanPreferences = [];
156+
157+ foreach ($ preferences as $ index => $ preferenceData ) {
158+
159+ if ($ preferenceData instanceof BaseBuilder) {
160+ if ($ preferenceData ->isStateSet (BaseBuilder::STATE_CREATED )) {
161+ throw new InvalidStateException ($ preferenceData ->getState ()
162+ , "The State should not be Created at this point, as its initBulk responsibility " );
163+ }
164+ if (!$ preferenceData ->isStateSet (BaseBuilder::STATE_NULLABLE_SET )) {
165+ $ preferenceData ->nullable ($ nullable );
166+ }
167+
168+ $ preferenceData ->updateOrCreate ();
169+ continue ;
170+ }
171+
152172 if (empty ($ preferenceData ['cast ' ])) {
153173 $ preferenceData ['cast ' ] = Cast::STRING ;
154174 }
@@ -177,7 +197,7 @@ public static function initBulk(array $preferences, bool $nullable = false): voi
177197 $ preferenceData ['cast ' ] = serialize ($ preferenceData ['cast ' ]);
178198
179199 // Ensure Defaults
180- $ preferenceData = array_merge ([
200+ $ preferenceData = array_merge ([
181201 'group ' => 'general ' ,
182202 'default_value ' => null ,
183203 'allowed_values ' => null ,
@@ -186,9 +206,10 @@ public static function initBulk(array $preferences, bool $nullable = false): voi
186206 'rule ' => null ,
187207 'nullable ' => false ,
188208 ], $ preferenceData );
209+ $ cleanPreferences [] = $ preferenceData ;
189210 }
190211
191- Preference::upsert ($ preferences , ['name ' , 'group ' ]);
212+ Preference::upsert ($ cleanPreferences , ['name ' , 'group ' ]);
192213 }
193214
194215 /**
@@ -203,6 +224,7 @@ public static function initBulk(array $preferences, bool $nullable = false): voi
203224 * @return int Returns the number of deleted preferences.
204225 *
205226 * @throws InvalidArgumentException if the preferences array is empty or if any preference lacks a required
227+ * @throws InvalidStateException
206228 * 'name' field, or if the 'name' field does not implement PreferenceGroup.
207229 */
208230 public static function deleteBulk (array $ preferences ): int
@@ -213,6 +235,18 @@ public static function deleteBulk(array $preferences): int
213235 $ query = Preference::query ();
214236
215237 foreach ($ preferences as $ index => $ preferenceData ) {
238+
239+
240+ if ($ preferenceData instanceof BaseBuilder) {
241+ if ($ preferenceData ->isStateSet (BaseBuilder::STATE_DELETED )) {
242+ throw new InvalidStateException ($ preferenceData ->getState ()
243+ , "The State should not be Deleted at this point, as its deleteBulk's responsibility " );
244+ }
245+
246+ $ preferenceData ->delete ();
247+ continue ;
248+ }
249+
216250 if (empty ($ preferenceData ['name ' ]) || !($ preferenceData ['name ' ] instanceof PreferenceGroup)) {
217251 throw new InvalidArgumentException (
218252 sprintf ("index: #%s name is required and must implement PreferenceGroup " , $ index )
0 commit comments