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 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace App\Traits;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Support\Facades\Auth;
  5. use Illuminate\Support\Facades\DB;
  6. trait HandlesResourceRecordCreation
  7. {
  8. protected function handleRecordCreationWithUniqueField(array $data, Model $model, string|null $uniqueField = null): Model
  9. {
  10. return DB::transaction(function () use ($data, $uniqueField, $model) {
  11. $currentCompanyId = Auth::user()->currentCompany->id;
  12. $uniqueFieldValue = $data[$uniqueField] ?? null;
  13. $enabled = (bool)($data['enabled'] ?? false);
  14. if ($enabled === true) {
  15. $this->disableExistingRecord($currentCompanyId, $model, $uniqueField, $uniqueFieldValue);
  16. } else {
  17. $this->ensureAtLeastOneEnabled($currentCompanyId, $model, $enabled, $uniqueField, $uniqueFieldValue);
  18. }
  19. $data['enabled'] = $enabled;
  20. return $model::create($data);
  21. });
  22. }
  23. protected function disableExistingRecord(int $companyId, Model $model, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
  24. {
  25. $query = $model::where('company_id', $companyId)
  26. ->where('enabled', true);
  27. if($uniqueField && $uniqueFieldValue){
  28. $query->where($uniqueField, $uniqueFieldValue);
  29. }
  30. $existingEnabledRecord = $query->first();
  31. if ($existingEnabledRecord !== null) {
  32. $existingEnabledRecord->enabled = false;
  33. $existingEnabledRecord->save();
  34. }
  35. }
  36. protected function ensureAtLeastOneEnabled(int $companyId, Model $model, bool &$enabled, string|null $uniqueField = null, string|null $uniqueFieldValue = null): void
  37. {
  38. $query = $model::where('company_id', $companyId)
  39. ->where('enabled', true);
  40. if($uniqueField && $uniqueFieldValue){
  41. $query->where($uniqueField, $uniqueFieldValue);
  42. }
  43. $otherEnabledRecords = $query->count();
  44. if ($otherEnabledRecords === 0) {
  45. $enabled = true;
  46. }
  47. }
  48. }