Skip to content

Doc Chat

PlutoGr edited this page Oct 17, 2026 · 1 revision

Chat

src/Services/Chat/. Переписка клиента и менеджера внутри заявки, в реальном времени через SignalR. База travel_chat.

Простой пример

Клиент открывает свою заявку в личном кабинете:

  1. Фронтенд загружает историю: GET /api/v1/chat/booking/{bookingId}/messages.
  2. Открывает соединение SignalR с /api/v1/chat/hubs/chat и вызывает JoinBookingGroup(bookingId).
  3. Клиент пишет «Можно на неделю позже?», фронтенд вызывает SendMessage(bookingId, text).
  4. Сервер сохраняет сообщение и рассылает событие 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.

Clone this wiki locally