UserNotificationSetting.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  6. class UserNotificationSetting extends Model
  7. {
  8. use HasFactory;
  9. protected $fillable = [
  10. 'user_id',
  11. 'order_settings',
  12. 'reclamation_settings',
  13. 'schedule_settings',
  14. 'chat_settings',
  15. ];
  16. protected function casts(): array
  17. {
  18. return [
  19. 'order_settings' => 'array',
  20. 'reclamation_settings' => 'array',
  21. 'schedule_settings' => 'array',
  22. 'chat_settings' => 'array',
  23. ];
  24. }
  25. public function user(): BelongsTo
  26. {
  27. return $this->belongsTo(User::class);
  28. }
  29. public static function defaultsForUser(int $userId): array
  30. {
  31. return [
  32. 'user_id' => $userId,
  33. 'order_settings' => [],
  34. 'reclamation_settings' => [],
  35. 'schedule_settings' => [],
  36. 'chat_settings' => [],
  37. ];
  38. }
  39. /**
  40. * Проверяет, включены ли уведомления хотя бы для одного статуса/источника в секции.
  41. * Секция считается активной если есть хотя бы один true-канал.
  42. */
  43. public function isSectionEnabled(string $settingsKey): bool
  44. {
  45. $settings = $this->{$settingsKey};
  46. if (!is_array($settings) || empty($settings)) {
  47. return false;
  48. }
  49. foreach ($settings as $channels) {
  50. if (is_array($channels) && array_filter($channels)) {
  51. return true;
  52. }
  53. }
  54. return false;
  55. }
  56. /**
  57. * Возвращает включённые каналы для конкретного статуса/источника.
  58. * @return array<string, bool> ['browser' => true, 'push' => false, 'email' => true]
  59. */
  60. public function getChannelsForKey(string $settingsKey, int|string $key): array
  61. {
  62. $settings = $this->{$settingsKey};
  63. if (!is_array($settings) || !isset($settings[$key])) {
  64. return [];
  65. }
  66. return array_filter($settings[$key]);
  67. }
  68. /**
  69. * Проверяет, включён ли хотя бы один канал для конкретного статуса/источника.
  70. */
  71. public function hasEnabledChannelForKey(string $settingsKey, int|string $key): bool
  72. {
  73. return !empty($this->getChannelsForKey($settingsKey, $key));
  74. }
  75. }