Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

HandlesResourceRecordUpdate.php 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Traits;
  3. use App\Models\User;
  4. use BackedEnum;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Model;
  7. trait HandlesResourceRecordUpdate
  8. {
  9. protected function handleRecordUpdateWithUniqueField(Model $record, array $data, User $user, ?string $uniqueField = null, ?array $evaluatedTypes = null): Model
  10. {
  11. if (is_array($evaluatedTypes)) {
  12. $evaluatedTypes = $this->ensureUpdateEnumValues($evaluatedTypes);
  13. }
  14. if ($uniqueField && ! in_array($data[$uniqueField] ?? '', $evaluatedTypes ?? [], true)) {
  15. $data['enabled'] = false;
  16. return tap($record)->update($data);
  17. }
  18. $companyId = $user->currentCompany->id;
  19. $oldValue = $uniqueField ? $record->{$uniqueField} : null;
  20. $newValue = $uniqueField ? $data[$uniqueField] : null;
  21. $enabled = (bool) ($data['enabled'] ?? false);
  22. $wasOriginallyEnabled = (bool) $record->getAttribute('enabled');
  23. if ($oldValue instanceof BackedEnum) {
  24. $oldValue = $oldValue->value;
  25. }
  26. if ($newValue instanceof BackedEnum) {
  27. $newValue = $newValue->value;
  28. }
  29. if ($uniqueField && $oldValue !== $newValue && $wasOriginallyEnabled) {
  30. $newValue = $oldValue;
  31. $data[$uniqueField] = $oldValue;
  32. }
  33. if ($enabled === true && ! $wasOriginallyEnabled) {
  34. $this->toggleRecord($companyId, $record, $uniqueField, $newValue, true, false);
  35. } elseif ($enabled === false && $wasOriginallyEnabled) {
  36. $enabled = true;
  37. }
  38. $data['enabled'] = $enabled;
  39. return tap($record)->update($data);
  40. }
  41. private function ensureUpdateEnumValues(array $evaluatedTypes): array
  42. {
  43. return array_map(static function ($type) {
  44. return $type instanceof BackedEnum ? $type->value : $type;
  45. }, $evaluatedTypes);
  46. }
  47. protected function toggleRecord(int $companyId, Model $record, ?string $uniqueField, $value, bool $enabled, bool $newStatus): void
  48. {
  49. $query = $this->buildQuery($companyId, $record, $uniqueField, $value, $enabled);
  50. if ($newStatus && ($otherRecord = $query->first())) {
  51. $otherRecord->update(['enabled' => true]);
  52. } else {
  53. $query->update(['enabled' => false]);
  54. }
  55. }
  56. protected function buildQuery(int $companyId, Model $record, ?string $uniqueField, $value, bool $enabled): Builder
  57. {
  58. return $record::query()
  59. ->where('company_id', $companyId)
  60. ->where('id', '!=', $record->getKey())
  61. ->where('enabled', $enabled)
  62. ->when($uniqueField, static fn ($q) => $q->where($uniqueField, $value));
  63. }
  64. }