Telegram
Отправка уведомлений#
Обработчиком для запроса от Notification Service служит ручка SendNotification().
Модель входящих данных#
type NotificationRequest struct {
ContactType int32 // тип контакта
Contacts []string // tg-username'ы пользователей с `@` в начале
User_UUIDs []string // уникальные идентификаторы пользователей
SecretCode *int32 // секретный код
ImageUrl *string // URL-адрес картинки
Target map[string]string // дополнительные параметры запроса
InlineButton *InlineButton // Inline-кнопка (в сообщении)
Message *string // текст сообщения
IsBroadcast bool // флаг, массовая рассылка или нет
}
Метод вызывает SendNotification из UseCase слоя. В случае ошибки - логгирует её в Span и возвращает.
В UseCase:
- Валидирует входящие данные, в случае ошибки, логгирует её в Sentry и в Span, а также возвращает.
- Вызывается метод
FetchTelegramChatsиз repo-слоя, который находит все чаты, которым нужно отправить уведомление. - Проверяет наличие
SecretCode, если передан, то:- Получает из БД статические параметры.
- С помощью шаблона формирует сообщение и заменяет его значением поле
Messageиз входящих данных.
- Для каждого найденного чата создаётся мапа с ключом -
ChatIDи значением - структурыMessage.type Message struct { ChatID int64 // уникальный идентификатор чата telegram Video *telebot.Video // URL видео Photo *telebot.Photo // URL фото SendOptions *telebot.SendOptions // параметры отправки Markup *telebot.ReplyMarkup // кнопки, прикреплённые к сообщению InlineButton *InlineButton // кнопки в сообщении Text string // текст сообщения } - В цикле, для каждого пользователя формируется сообщение и кладётся в мапу.
- Циклом проходится по мапе и для каждого сообщение вызывает метод
pushMessage.
В pushMessage:
- Проверяется наличие каналов в срезе (
msgQueues[]chan messageизUseCase).- Если их нет - выход их функции.
- Проверяется флаг
isBroadcast. Если он установлен вfalse, то сообщение передаются в приоритетный канал -0. Если флагtrue- то канал для сообщения выбирается случайно.