You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HandlesResourceRecordCreation.php 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. <?php
  2. namespace App\Traits;
  3. use App\Models\User;
  4. use Illuminate\Database\Eloquent\{Builder, Model};
  5. trait HandlesResourceRecordCreation
  6. {
  7. protected function handleRecordCreationWithUniqueField(array $data, Model $model, User $user, ?string $uniqueField = null): Model
  8. {
  9. $companyId = $user->currentCompany->id;
  10. $shouldBeEnabled = (bool) ($data['enabled'] ?? false);
  11. $query = $model::query()
  12. ->where('company_id', $companyId)
  13. ->where('enabled', true);
  14. if ($uniqueField && array_key_exists($uniqueField, $data)) {
  15. $query->where($uniqueField, $data[$uniqueField]);
  16. }
  17. $this->toggleRecords($query, $shouldBeEnabled);
  18. $data['enabled'] = $shouldBeEnabled;
  19. $instance = $model->newInstance($data);
  20. $instance->save();
  21. return $instance;
  22. }
  23. private function toggleRecords(Builder $query, bool &$shouldBeEnabled): void
  24. {
  25. if ($shouldBeEnabled) {
  26. $existingEnabledRecord = $query->first();
  27. $existingEnabledRecord?->update(['enabled' => false]);
  28. } elseif ($query->doesntExist()) {
  29. $shouldBeEnabled = true;
  30. }
  31. }
  32. }