# Чаты
## Основные репозитории
* Бэкенд чатов [chatd-nodejs](http://git.rn/projects/N1/repos/chatd-nodejs/browse)
* Фронтенд чатов [chat](http://git.rn/projects/N1/repos/chat/browse)
* Десктопный контейнер для чатов [n1-bundle-cabinet](http://git.rn/projects/N1/repos/n1-bundle-cabinet/browse)
* Контейнер с мобильной версией чатов [n1-mobile-bundle-offera](http://git.rn/projects/N1/repos/n1-mobile-bundle-offers/browse)
* Кроны, для выполнения отложенных операций по чатам [api](http://git.rn/projects/N1/repos/api/browse)
* Логи для отравки в clickhouse [frontend](http://git.rn/projects/N1/repos/frontend/browse)
* Сервис для сбора и отправки аналитики в clickhouse [view-stats-parser](https://gitlab.n1.org.ru/bi/view-stats-parser)
## Dashboard чатов
https://dash.pusher.com/chatkit
g.fokin@n1.ru
000000
(но лучше привяжи свой аккаунт, попроси у Лёши Мышко инвайт)
## Мониторинг
* Основные метрики чатов мы отслеживаем в [графане ](http://grafana.n1.org.ru/d/VjJ61NRWk/chatd-nodejs?orgId=1&refresh=1m)
* Баги смотрим в [Sentry](http://sentry.n1.s/n1/chatd-nodejs/)
* Критовые баги дублируются к нам в канал в mattermost: https://chat.n1.org.ru/n1ru/channels/notify-team-buyer
* Баги по работе кронов на php смотрим [тут](http://sentry.n1.s/n1/n1-api/?query=is%3Aunresolved+team%3ABuyer)
### Настройка оповещений о багах через mattermost
Чтобы оперативно реагировать на критовые баги, мы настроили их дублирование из sentry в mattermost, делаем мы это посредством [Zappier](https://zapier.com/app/zaps)
Логин: g.fokin@n1.ru
Пароль: q12345
После авторизации выбираем вкладку My Zaps и ищем `Sentry to mattermost: notify-team-buyer`
### Метрики на мониторе
На мониторах у нас дублируются графики из графаны. Чтобы запустить/перезапустить мониторинг нужно:
1. `ssh monitor@192.168.10.84` pass: monitor
2. Запустить скрипт `./start-monitoring`
### Как узнать ip-шник mongoDB, Rabbit или чего-либо ещё
1. Зайди на [https://deployer.n1.s/](https://deployer.n1.s/)
2. Выбери свою среду, появится таблица со всеми ресурсами 
3. Ищи нужный тебе Unit (например БД для чатов называется `mongo-chatd`)
## Отправка писем о непрочитанных сообщениях
### Отладка событий
Во время отправки сообщения чаты эмитят событие message.sent. Событие отправляется в RabbitMQ. Если есть необходимость подебажить эти события, нужно открыть веб морду рэббита:
1. Узнай ip своего рэббита, как это сделать описано [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `rabbitmq-realty`)
2. Открой браузер и введи этот ip, добавив порт 15672 `твой_ip:15672`
4. Введи логин и пароль (`guest`, `guest`)
5. Выбери вкладку **Exchanges** и ищи `chat`, жмякни на него и увидишь все очереди, которые мы используем для работы с чатами

7. Ищи нужную очередь (в нашем случае это `unread_messages < chat`)
8. Далее выбери вкладку **Queues** и жмякни по нужной очереди
### Логика работы
Есть [скрипт](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesListener.php), который слушает очередь `unread_messages < chat` и создаёт таски в mongoDB(коллекция `unread_chat_messages`). Далее специальный [крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesHandler.php) разгребает эти таски и раз в 7 минут триггерит событие в Emarsys о том что нужно отправить уведомление о непрочитанных сообщениях.
#### Emarsys
Попасть в Emarsys можно по ссылке https://suite16.emarsys.net/.
Account - n1_ru, логин и пароль проси у Булгаковой Натальи
После авторизации нужно выбрать Campaigns -> Email campaigns и вбить в поиск чаты, там есть вся информация о шаблоне и логике отправки
### Как протестировать отправку письма
1. Отправить сообщение в чате
2. Убедиться что в очереди `unread_messages < chat` появилось сообщение (см. пункт Отладка событий)
3. Зайти в монгу и в коллекции `unread_chat_messages` отредактировать дату на 10 минут назад (адрес монги смотри в [тут](https://deployer.n1.s), ищи mongo-n1 )
4. Далее нужно зайти на php-ноду: `ssh root@phpnode7-bionic.твоя.среда` и запустить 2 крона
4.1. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesListener process`
4.2. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesHandler run`
Если что-то не выходит, обратись к Наташе Булгаковой, она поможет с тестированием
## Отправка хита в статистику просмотров по карточке объявления
Создание канала в чате равносильно открытию контакта в карточке, такие действия мы трекаем и отправляем в специальный сервис стастики, чтобы продавец видел у себя в личном кабинете в том числе и статистику по открытию чатов.
Во время создания канала в RabbitMQ в очередь `offers_hits < chat.new_channel` отправляется соответсвующее событие
Далее cli-скрипт на php `/data/projects/n1.ru/scripts/cli.php offers Offers_HitsCount NewChatChannelsListener process` отправит это в сервис статистики просмотров. (Как запускать cli-скрипты смотри в 'Отправка писем о непрочитанных сообщениях').
За подробностями работы сервиса стастики обращайся к команде продавцов.
## Отключение возможности писать сообщения
Пользователи могут отключать у себя чаты из личного кабинета, также чаты могут отключать модераторы из админки.
Апишка для отключения чатов:
```
curl -X POST \
http://api.n1.ru.b.dobrovolskiy.n1/api/v1/chat/user-rpc/ \
-H 'Authorization: Bearer f64ab47dfc5c8d2df499e46886bdc43a5ae0dea2' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 6b2d2e20-ad1b-4862-95c8-31045d6cbded' \
-H 'cache-control: no-cache' \
-d '{
"jsonrpc": "2.0",
"method": "disableChat",
"params": {},
"id": 1
}'
```
***Реализация этого эндпоинта и других связанных с включением/отключением чатов и их проверкой лежит [тут](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/handlers/createUserJsonRpc.js)***
После отключения чатов происходит 2 вещи:
1. В коллекцию `'users_settings'` в бд чатов записывается информация о том что пользователь отключил у себя чаты (как узнать ip MongoDB смотри [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё), тебя интересует Unit `mongo-chatd`)
2. Эмитится событие в RabbitMQ в очередь `users < chat.change_is_chat_enabled` (как отлаживать события смотри [тут](#Отладка-событий)
3. Событие слушает [PHP-й крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/elastic_indexer/Realty/ElasticIndexer/Cli/ChatEnabledChangesListener.php), по userID он получает все объявления и инициирует их реиндексацию.
### Реиндексация объявлений
Если упрощённо, то объявления, которые ты получаешь из апишки, возвращаются тебе из эластика.
Для подключения к эластику удобней всего пользоваться плагином хрома elasticsearch-head. IP эластика можешь посмотреть [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `n1_elastic`). Ищи коллекцию с алиасом `offers`. Информацию о состоянии чатов у оффера мы храним в поле `chat.enabled`
Каждый раз когда происходит процесс реиндексации, мы ходим в апи чатов за настройками пользователя и проверяем не отключил ли он у себя чаты и если это так проставляем `chat.enabled = false` (чуть выше я давал ссылку на реализацию эндпоинтов для работы с настройками пользователя чатов)
Если у объявления, которое вернет тебе api, этот флаг будет установлен в `false` то кнопка **Написать сообщение** скрывается в карточке объявлений.
## Отправка аналитики в Clickhouse
Каждую отправку нового сообщения мы фиксируем в clickhouse. Делается это в 2 этапа
1. Ходим на специальный урл [(логика начинается тут)](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/services/sendMessage.js#98), по которому nginx складирует логи [ссылка на пул реквест](http://git.rn/projects/N1/repos/frontend/pull-requests/323/overview)
2. Go-й [демон](https://gitlab.n1.org.ru/bi/view-stats-parser) скачивает файл с этими логами, парсит их и отправляет в clickhouse.
### Подключение к clickhouse
Веб интерфейс: [http://clickhouse.n1.org.ru/](http://clickhouse.n1.org.ru/)
dev сервер кликхаус: `http://clickhouse-dev.n1.s:80`
user: `default`
tcp порт dev сервера: `clickhouse-dev.n1.s:32007`
### Логи ошибок
Ошибки смотри в mattermost, канал `notify-team-buyer`, выглядят они так:
