# Исправление проблемы с WebSocket уведомлениями

## Проблема

События успешно отправляются в Redis (видно по логам Laravel), но не доходят до фронтенда.

## Возможные причины

### 1. Подписка на события до подписки на канал

**Проблема:** Подписка на события происходит до того, как канал успешно подписался.

**Решение:** Обновлен `websocketStore.js` - теперь события подписываются только после успешной подписки на канал.

### 2. Laravel Echo Server не получает события из Redis

**Проверка:**
```bash
tail -f /home/kartulirest/public_html/kartulirest.de/storage/logs/echoserver.log
```

Должны видеть записи о получении событий из Redis.

### 3. Проблема с авторизацией канала (403 Forbidden)

**Симптомы:**
- В консоли браузера: `["subscription_error","private-admin-orders",403]`
- Запрос к `/api/broadcasting/auth` возвращает 403
- В логах: `Broadcasting auth error` с пустым сообщением об ошибке

**Причины:**
1. Пользователь не имеет роли `admin` или `manager`
2. Роли пользователя не загружены правильно
3. Исключение в callback канала не обрабатывается правильно
4. Метод `hasAnyRole` выбрасывает исключение

**Исправления:**
1. Добавлен try-catch в callback канала для обработки исключений
2. Заменен метод `hasAnyRole` на прямую проверку через `array_intersect`
3. Добавлено подробное логирование на каждом этапе авторизации
4. Улучшена обработка ошибок в маршруте `/api/broadcasting/auth`

**Проверка:**
1. Откройте консоль браузера (F12)
2. Проверьте Network tab
3. Найдите запрос к `/api/broadcasting/auth`
4. Должен быть статус 200 и возвращать `{auth: "..."}`

**Отладка:**
1. Проверьте логи Laravel:
```bash
tail -f storage/logs/laravel.log | grep -i "broadcasting\|channel"
```

2. Должны увидеть логи:
- `Broadcasting auth request` - с информацией о пользователе и канале
- `Broadcasting auth: User roles` - с ролями пользователя
- `Broadcasting channel authorization: Start` - начало авторизации канала
- `Broadcasting channel authorization: Roles loaded` - роли загружены
- `Broadcasting channel authorization: Result` - результат авторизации
- `Broadcasting auth: Response` - финальный ответ

3. Если есть ошибка, увидите:
- `Broadcasting channel authorization: Exception` - исключение в callback канала
- `Broadcasting auth: Broadcast::auth() exception` - исключение в Broadcast::auth()

4. Убедитесь, что пользователь имеет роль `admin` или `manager`:
```sql
SELECT u.id, u.email, r.slug as role_slug
FROM users u
JOIN role_user ru ON u.id = ru.user_id
JOIN roles r ON ru.role_id = r.id
WHERE u.id = YOUR_USER_ID;
```

Или через Laravel Tinker:
```bash
php artisan tinker
>>> $user = \App\Models\User::where('email', 'YOUR_EMAIL')->first();
>>> $user->roles->pluck('slug');
```

### 4. Неправильное имя события

**Проверка:**
- Событие отправляется как `order.created` (из `broadcastAs()`)
- Подписка должна быть на `.order.created` (с точкой в начале)

## Что проверить

### 1. Консоль браузера

Должны увидеть:
- `🔌 Socket.io connected` - подключение установлено
- `✅ Successfully subscribed to admin-orders channel` - подписка на канал
- `✅ Subscribed to event: .order.created` - подписка на событие

### 2. Логи Laravel Echo Server

```bash
tail -f /home/kartulirest/public_html/kartulirest.de/storage/logs/echoserver.log
```

Должны видеть:
- Подключения клиентов
- Подписки на канал `private-admin-orders`
- Получение событий из Redis

### 3. Проверка Redis

```bash
redis-cli
> PSUBSCRIBE laravel_database_*
```

Затем создайте заказ - должны увидеть сообщения в Redis.

## Отладка

### Проверка подключения

В консоли браузера выполните:
```javascript
// Проверка подключения Socket.io
window.Echo.connector.socket.connected
// Должно быть: true

// Проверка канала
window.Echo.private('admin-orders')
// Должен вернуть объект канала

// Проверка подписки
window.Echo.private('admin-orders').subscribed
// Должно быть: true
```

### Ручная подписка на событие

```javascript
window.Echo.private('admin-orders')
    .listen('.order.created', (data) => {
        console.log('Event received:', data);
    });
```

Затем создайте заказ - должно появиться событие.

## Следующие шаги

1. Пересоберите фронтенд: `npm run build`
2. Очистите кэш браузера (Ctrl+Shift+Delete)
3. Откройте админ-панель
4. Проверьте консоль браузера
5. Создайте тестовый заказ
6. Проверьте логи Laravel Echo Server
