Skip to content

Unibell

Описание#

Является сервисом-пройслойкой, который отвечает только за один тип уведомлений - голосовую передачу одноразового кода, через входящий звонок.

Принцип работы#

Сервис принимает gRPC-запрос SendNotification с номером телефона и секретным кодом от NotificationService.

Модель входящих данных#
    type NotificationRequest struct {
        ContactType int32   // тип контакта
        User_UUID   *string  // уникальный идентификатор пользователя
        Contacts    []string  // контакты - номера телефонов
        SecretCode  int32 // секретный код подтверждения
    }

Обработчик вызывает метод SendNotification из usecase слоя. Этот метод кладёт данные в буферизированный канал, а также проверяет, не пуст ли массив с номерами телефонов, в противном лучае устанавливает статус в Span - код и текст ошибки, а также возвращает её.

На один инстанс сервиса запущен один worker(). Что он делает:

  • Каждые 250мс проверяет очередь.
  • Берёт запрос из канала и вызывает для него sendNotification(). В случае ошибки создаёт новый Span и в отложенном вызове завершает его.

Что делает sendNotification():

  • Проверяет не пуст ли массив с номерами телефонов, в противном лучае устанавливает статус в Span - код и текст ошибки, а также возвращает её.
  • Формирует JSON с полезной нагрузкой - номер телефона, секретный код и тайм-аут.
  • Формирует POST-запрос на URL из конфига, куда передаёт сформированный JSON. В случае ошибки устанавливает статус в Span - код и текст ошибки, а также возвращает её.
  • Устанавливает заголовки запроса - Content-Type и X-Authorization.
  • Отправляет запрос, в случае ошибки устанавливает статус в Span, логгирует в Sentry и возвращает её.
  • В отложенном вызове функции-замыкании читает тело ответа и закрывает соединение. В случае ошибки: В Span устанавливается статус - код и текст ошибки; В Sentry - ошибка логгируется.
  • Независимо от результата сохранет данные запроса в БД.
  • В случае успеха возвращает nil.