Doc Chat - PlutoGr/TravelAgency GitHub Wiki
Chat
src/Services/Chat/. Переписка клиента и менеджера внутри заявки, в реальном времени через SignalR. База travel_chat.
Простой пример
Клиент открывает свою заявку в личном кабинете:
- Фронтенд загружает историю:
GET /api/v1/chat/booking/{bookingId}/messages. - Открывает соединение SignalR с
/api/v1/chat/hubs/chatи вызываетJoinBookingGroup(bookingId). - Клиент пишет «Можно на неделю позже?», фронтенд вызывает
SendMessage(bookingId, text). - Сервер сохраняет сообщение и рассылает событие
MessageReceivedвсем в группеbooking_{bookingId}. Менеджер, у которого открыта та же заявка, видит сообщение сразу.
Доступ
Каждый вызов (GET messages, JoinBookingGroup, SendMessage) спрашивает у Booking по gRPC ValidateBookingAccess(bookingId, userId). Доступ есть у клиента этой заявки и у любого Manager или Admin (роль Booking уточняет у Identity).
GET messagesбез доступа: 403.- В хабе без доступа:
HubException, сообщение не сохраняется. - Booking недоступен: ошибка gRPC считается отказом в доступе (403 или
HubException), в лог пишется предупреждение. Ответа 503 у Chat нет.
Сообщение
ChatMessage: Id, BookingId, SenderId, SenderName, SenderRole (Client, Manager, Admin, System), Text, Attachments (список строк, необязательно), CreatedAt. В JSON те же поля в camelCase.
Соединение и вход
Браузер не передаёт заголовок Authorization в WebSocket. Gateway берёт токен из cookie сессии и сам добавляет заголовок при проксировании, поэтому хаб видит обычного вошедшего пользователя. Подробно: Вход и сессия.
На фронтенде (src/api/chat.ts):
- адрес хаба
${origin}/api/v1/chat/hubs/chat, можно переопределитьVITE_CHAT_HUB_URL; withCredentials, автоматическое переподключение;- одно соединение на открытую заявку.
Redis
Redis используется только для проверки готовности (/health/ready), и только если задана строка ConnectionStrings__Redis. Backplane SignalR не настроен: при нескольких экземплярах Chat сообщения не дойдут до клиентов на другом экземпляре. Сейчас экземпляр один.
Настройки
ConnectionStrings__ChatDb, ConnectionStrings__Redis, JwtSettings__*, GrpcSettings__InternalServiceToken, GrpcClients__BookingServiceUrl.