Работа с push-уведомлениями
📍 Ручка GET /sync/send_push
Опиcание: Ручка инициирует синхронную отправку push-уведомлений и метрик.
В рамках одного вызова параллельно запускаются 4 подзадачи:
📩 Отправка уведомлений участникам событий.
📊 Отправка метрик по регистрации в школе и приглашениям.
🧑🏫 Уведомления менторам о ближайших событиях.
❌ Оповещение студентов, чьи заявки были отклонены.
Каждая подзадача работает изолированно, ошибки логируются и отправляются в Telegram-бота, но не прерывают выполнение других задач.
Полный адрес: https://mobile-api.terraprod.ru/sync/send_push
Тело запроса: Отсутствует.
🧩 Подзадачи#
SendPushes
Метод SendPushes является основным методом для отправки push-уведомлений различным группам пользователей. Он запускает несколько параллельных процессов для разных типов уведомлений с использованием механизма sync.WaitGroup.
SendPushes#
Назначение: Основной метод, который запускает параллельную отправку push-уведомлений четырех различных типов.
⚙️ Основные действия
-
Отправка push-уведомлений студентам по событиям:
-
Запускается sendPushesForEvents(...).
-
Отправляет уведомления студентам о ближайших мероприятиях.
-
-
Сбор и отправка метрик по активности и приглашениям:
-
Вызывается метод sendMetricFlow(...).
-
Собираются данные по заявкам, приглашениям, регистрациям и отправляются в Google Таблицы.
-
-
Отправка уведомлений наставникам:
-
Используется метод sendPushesForMentors(...).
-
Отправляются уведомления наставникам, у которых есть новые или ожидающие студенты. (Отправляется в случае если наставник не рассматривал заявку студента в течение суток.)
-
-
Уведомление студентов об отклонённых регистрациях:
-
Запускается sendPushesForStudentsReject(...).
-
Студенты получают push-уведомление, если их регистрация была avto-отклонена.
-
-
Обработка ошибок:
- Если любая из горутин возвращает ошибку, она логируется с помощью span.SetStatus(...) и отправляется в Telegram через notificationService.SendErrorToTgBot(...).
🧩 Используемые сервисы
-
authService
-
mentorService
-
eventService
-
schoolService
-
inviteService
sendPushesForEvents
Назначение: Отправляет push-уведомления о предстоящих событиях.
⚙️ Основные действия
-
Установка временного окна для оповещений через 24 часа с длительностью 10 минут:
- Вычисляется
startTime— текущий момент плюс 24 часа. - Вычисляется
endDate—startTimeплюс 10 минут. - Вызывается метод
sendPushesWithDatesс параметрами для данного окна.
- Вычисляется
-
Установка второго временного окна для оповещений через 1 час с длительностью 10 минут:
- Вычисляется
startTime— текущий момент плюс 1 час. - Вычисляется
endDate—startTimeплюс 10 минут. - Снова вызывается
sendPushesWithDatesс новым временным окном.
- Вычисляется
-
Обработка ошибок:
- Если любой из вызовов
sendPushesWithDatesвозвращает ошибку, метод прерывает работу и возвращает ошибку вверх по стеку.
- Если любой из вызовов
sendPushesWithDates
Назначение: Вспомогательный метод для отправки push-уведомлений в заданный временной интервал.
⚙️ Основные действия
-
Получение регистраций студентов для отправки пушей:
- Вызывает
eventService.GetStudentRegistrationsForPushс параметрами временного диапазона изargs. - В случае ошибки устанавливает статус спана в трассировщике и возвращает ошибку.
- Если регистраций нет, метод завершается без ошибок.
- Вызывает
-
Формирование уникального списка UUID пользователей:
- Из регистраций собирается множество уникальных
UserUUID.
- Из регистраций собирается множество уникальных
-
Получение FCM-токенов для пользователей:
- По списку UUID запрашиваются FCM-токены через
authService.GetFCMTokens. - Ошибка при получении токенов приводит к установке статуса ошибки и возврату ошибки.
- По списку UUID запрашиваются FCM-токены через
-
Формирование карты пользователей и их токенов:
- Результаты
GetFCMTokensконвертируются в картуmap[userUUID][]FCMTokenдля удобства доступа.
- Результаты
-
Отправка push-уведомлений каждому пользователю:
- Для каждого регистрационного события берутся FCM-токены пользователя.
- Если токены отсутствуют, уведомление не отправляется.
- Используется метод
notificationService.SendMessageдля отправки пуша. - В случае ошибки отправки в спан записывается ошибка, но процесс продолжается для других пользователей.
sendMetricFlow
Метод sendMetricFlow используется для сбора и отправки метрик, связанных с регистрациями, приглашениями и активностью пользователей в системе. Эти метрики записываются в Google Таблицы для последующего анализа. Метод реализован с использованием горутин и канала ошибок для параллельной обработки.
⚙️ Основные действия
-
- Используется метод
schoolService.GetRegMetrics(...). - Возвращает общее количество заявок, одобренных и ожидающих.
Получение метрик по школам:
-
Сбор информации по инвайтам (приглашениям):
- Вызывается
invite.FetchInviteToken(...)для получения токенов приглашений по нужному потоку (neededFlow). - Считается общее количество токенов, использованных (
UsedTokens) и активных (LivedTokens).
- Вызывается
-
Получение регистраций по статусам:
- Метод
fetchRegistrationsByStatus(...)вызывается несколько раз с различными статусами:Pending,Accepted,Unregistered,Rejected,Canceled
- Получается общее количество регистраций без учёта отменённых.
- Метод
-
Отправка метрик в Google Таблицы:
- Используется
google.MetricInvites(...)с передачей всех собранных данных. - Это позволяет систематизировать показатели вовлечённости пользователей и работы с приглашениями.
- Используется
- Используется метод
📤 Записываемые метрики в Google Таблицы
| Поле | Описание |
|---|---|
Tokens |
Общее количество токенов приглашений |
UsedTokens |
Количество использованных токенов |
LivedTokens |
Количество активных токенов |
RegistrationsToMentor |
Количество регистраций к наставнику (валидных) |
WaitingStudents |
Ожидающие подтверждения студенты |
ApprovedStudents |
Одобренные студенты |
CanceledStudents |
Отменённые/отклонённые студенты |
SchoolTotal |
Общее количество заявок в школе |
SchoolPending |
Ожидающие подтверждения заявки в школе |
SchoolApproved |
Одобренные заявки в школе |
sendPushesForMentors
Метод sendPushesForMentors отправляет push-уведомления наставникам о новых заявках студентов, которые ещё не были подтверждены. Он также обновляет статус отправки пушей для соответствующих регистраций и учитывает настройки конфигурации для включения/отключения рассылки.
⚙️ Основные действия
-
Получение списка заявок студентов, не находящихся в статусе ожидания:
- Запрашивает через
mentorService.GetNotPendingStudentзаявки, созданные за последние 24 часа и имеющие статусStatusID = 1. - Обрабатывает ошибки, включая специфическую проверку
mentorserviceerrors.ErrFlowRegistrationNotFound, при которой возвращаетсяnil.
- Запрашивает через
-
Формирование списка ID регистраций, по которым ещё не отправлялись пуши:
- Из полученных заявок фильтрует записи, у которых
PushSend == false. - Если таких заявок нет, метод завершает работу.
- Из полученных заявок фильтрует записи, у которых
-
Асинхронное обновление статуса отправки пушей для заявок:
- Вызывает
mentorService.UsersForUpdatePushв отдельной горутине для обновления статусов.
- Вызывает
-
Проверка конфигурации, разрешающей отправку пушей наставникам:
- Если опция
cfg.MentorSettings.SendPushesForMentorsвыключена, метод завершается без отправки уведомлений.
- Если опция
-
Формирование списка уникальных UUID наставников, связанных с заявками:
- Собирает уникальные
EventMentorIDиз заявок сPushSend == false.
- Собирает уникальные
-
Получение FCM-токенов наставников:
- Через
authService.GetFCMTokensпо списку UUID наставников. - В случае ошибки записывает статус ошибки в спан и возвращает ошибку.
- Через
-
Отправка push-уведомлений наставникам:
- Для каждого наставника отправляется пуш с сообщением "Ответьте ему на заявку".
- Используется
notificationService.SendMessage. - Ошибки отправки логируются в спан, но не прерывают цикл отправки другим наставникам.
sendPushesForStudentsReject
Метод sendPushesForStudentsReject Отправляет push-уведомления студентам о reject (отказе).
⚙️ Основные действия
- Проверка включенности функционала отказов:
-
Если в конфигурации
cfg.MentorSettings.RejectUsersстоитfalse, метод завершает выполнение без действий. -
Получение списка заявок студентов, не находящихся в статусе ожидания и старше заданного периода:
- Вычисляется временной порог: текущее время минус
DayRejectдней из настроек. - Запрашиваются заявки с помощью
mentorService.GetNotPendingStudentс фильтром по времени и статусу.
- Вычисляется временной порог: текущее время минус
-
Обработка ошибок при получении заявок:
- При ошибках проводится проверка на специфическую ошибку
mentorserviceerrors.ErrFlowRegistrationNotFound. - Если обнаружена эта ошибка — возвращается
nil, иначе ошибка пробрасывается дальше.
- При ошибках проводится проверка на специфическую ошибку
-
Формирование списков UUID студентов и ID регистраций:
- Из полученных заявок создаются два среза:
studentSliceс UUID студентов.regIDSliceс ID регистраций студентов.
- Из полученных заявок создаются два среза:
-
Асинхронное обновление статуса аннулирования заявок:
- В отдельной горутине вызывается
mentorService.RejectStudentRegistrationсregIDSlice.
- В отдельной горутине вызывается
-
Получение FCM-токенов для студентов:
- Через
authService.GetFCMTokensпо UUID студентов.
- Через
-
Проверка включения отправки пушей студентам:
- Если в конфигурации
cfg.MentorSettings.SendPushesForStudentsстоитfalse, метод завершает работу без рассылки.
- Если в конфигурации
-
Отправка push-уведомлений студентам:
- Для каждого студента отправляется пуш с сообщением об аннулировании заявки и возможностью подачи новой.
- Используется метод
notificationService.SendMessage. - Ошибки отправки пушей записываются в спан, но не прерывают выполнение.