Skip to content

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 - то канал для сообщения выбирается случайно.