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.