Skip to content

Работа с push-уведомлениями

📍 Ручка GET /sync/send_push

Опиcание: Ручка инициирует синхронную отправку push-уведомлений и метрик.

В рамках одного вызова параллельно запускаются 4 подзадачи:

📩 Отправка уведомлений участникам событий.

📊 Отправка метрик по регистрации в школе и приглашениям.

🧑‍🏫 Уведомления менторам о ближайших событиях.

❌ Оповещение студентов, чьи заявки были отклонены.

Каждая подзадача работает изолированно, ошибки логируются и отправляются в Telegram-бота, но не прерывают выполнение других задач.

Полный адрес: https://mobile-api.terraprod.ru/sync/send_push

Тело запроса: Отсутствует.

🧩 Подзадачи#

SendPushes

Метод SendPushes является основным методом для отправки push-уведомлений различным группам пользователей. Он запускает несколько параллельных процессов для разных типов уведомлений с использованием механизма sync.WaitGroup.

SendPushes#

Назначение: Основной метод, который запускает параллельную отправку push-уведомлений четырех различных типов.


⚙️ Основные действия

  1. Отправка push-уведомлений студентам по событиям:

    • Запускается sendPushesForEvents(...).

    • Отправляет уведомления студентам о ближайших мероприятиях.

  2. Сбор и отправка метрик по активности и приглашениям:

    • Вызывается метод sendMetricFlow(...).

    • Собираются данные по заявкам, приглашениям, регистрациям и отправляются в Google Таблицы.

  3. Отправка уведомлений наставникам:

    • Используется метод sendPushesForMentors(...).

    • Отправляются уведомления наставникам, у которых есть новые или ожидающие студенты. (Отправляется в случае если наставник не рассматривал заявку студента в течение суток.)

  4. Уведомление студентов об отклонённых регистрациях:

    • Запускается sendPushesForStudentsReject(...).

    • Студенты получают push-уведомление, если их регистрация была avto-отклонена.

  5. Обработка ошибок:

    • Если любая из горутин возвращает ошибку, она логируется с помощью span.SetStatus(...) и отправляется в Telegram через notificationService.SendErrorToTgBot(...).

🧩 Используемые сервисы

  • authService

  • mentorService

  • eventService

  • schoolService

  • inviteService

sendPushesForEvents

Назначение: Отправляет push-уведомления о предстоящих событиях.


⚙️ Основные действия

  1. Установка временного окна для оповещений через 24 часа с длительностью 10 минут:

    • Вычисляется startTime — текущий момент плюс 24 часа.
    • Вычисляется endDatestartTime плюс 10 минут.
    • Вызывается метод sendPushesWithDates с параметрами для данного окна.
  2. Установка второго временного окна для оповещений через 1 час с длительностью 10 минут:

    • Вычисляется startTime — текущий момент плюс 1 час.
    • Вычисляется endDatestartTime плюс 10 минут.
    • Снова вызывается sendPushesWithDates с новым временным окном.
  3. Обработка ошибок:

    • Если любой из вызовов sendPushesWithDates возвращает ошибку, метод прерывает работу и возвращает ошибку вверх по стеку.
sendPushesWithDates

Назначение: Вспомогательный метод для отправки push-уведомлений в заданный временной интервал.


⚙️ Основные действия

  1. Получение регистраций студентов для отправки пушей:

    • Вызывает eventService.GetStudentRegistrationsForPush с параметрами временного диапазона из args.
    • В случае ошибки устанавливает статус спана в трассировщике и возвращает ошибку.
    • Если регистраций нет, метод завершается без ошибок.
  2. Формирование уникального списка UUID пользователей:

    • Из регистраций собирается множество уникальных UserUUID.
  3. Получение FCM-токенов для пользователей:

    • По списку UUID запрашиваются FCM-токены через authService.GetFCMTokens.
    • Ошибка при получении токенов приводит к установке статуса ошибки и возврату ошибки.
  4. Формирование карты пользователей и их токенов:

    • Результаты GetFCMTokens конвертируются в карту map[userUUID][]FCMToken для удобства доступа.
  5. Отправка push-уведомлений каждому пользователю:

    • Для каждого регистрационного события берутся FCM-токены пользователя.
    • Если токены отсутствуют, уведомление не отправляется.
    • Используется метод notificationService.SendMessage для отправки пуша.
    • В случае ошибки отправки в спан записывается ошибка, но процесс продолжается для других пользователей.
sendMetricFlow

Метод sendMetricFlow используется для сбора и отправки метрик, связанных с регистрациями, приглашениями и активностью пользователей в системе. Эти метрики записываются в Google Таблицы для последующего анализа. Метод реализован с использованием горутин и канала ошибок для параллельной обработки.


⚙️ Основные действия

    • Используется метод schoolService.GetRegMetrics(...).
    • Возвращает общее количество заявок, одобренных и ожидающих.

    Получение метрик по школам:

    1. Сбор информации по инвайтам (приглашениям):

      • Вызывается invite.FetchInviteToken(...) для получения токенов приглашений по нужному потоку (neededFlow).
      • Считается общее количество токенов, использованных (UsedTokens) и активных (LivedTokens).
    2. Получение регистраций по статусам:

      • Метод fetchRegistrationsByStatus(...) вызывается несколько раз с различными статусами:
        • Pending, Accepted, Unregistered, Rejected, Canceled
      • Получается общее количество регистраций без учёта отменённых.
    3. Отправка метрик в Google Таблицы:

      • Используется google.MetricInvites(...) с передачей всех собранных данных.
      • Это позволяет систематизировать показатели вовлечённости пользователей и работы с приглашениями.

📤 Записываемые метрики в Google Таблицы

Поле Описание
Tokens Общее количество токенов приглашений
UsedTokens Количество использованных токенов
LivedTokens Количество активных токенов
RegistrationsToMentor Количество регистраций к наставнику (валидных)
WaitingStudents Ожидающие подтверждения студенты
ApprovedStudents Одобренные студенты
CanceledStudents Отменённые/отклонённые студенты
SchoolTotal Общее количество заявок в школе
SchoolPending Ожидающие подтверждения заявки в школе
SchoolApproved Одобренные заявки в школе
sendPushesForMentors

Метод sendPushesForMentors отправляет push-уведомления наставникам о новых заявках студентов, которые ещё не были подтверждены. Он также обновляет статус отправки пушей для соответствующих регистраций и учитывает настройки конфигурации для включения/отключения рассылки.


⚙️ Основные действия

  1. Получение списка заявок студентов, не находящихся в статусе ожидания:

    • Запрашивает через mentorService.GetNotPendingStudent заявки, созданные за последние 24 часа и имеющие статус StatusID = 1.
    • Обрабатывает ошибки, включая специфическую проверку mentorserviceerrors.ErrFlowRegistrationNotFound, при которой возвращается nil.
  2. Формирование списка ID регистраций, по которым ещё не отправлялись пуши:

    • Из полученных заявок фильтрует записи, у которых PushSend == false.
    • Если таких заявок нет, метод завершает работу.
  3. Асинхронное обновление статуса отправки пушей для заявок:

    • Вызывает mentorService.UsersForUpdatePush в отдельной горутине для обновления статусов.
  4. Проверка конфигурации, разрешающей отправку пушей наставникам:

    • Если опция cfg.MentorSettings.SendPushesForMentors выключена, метод завершается без отправки уведомлений.
  5. Формирование списка уникальных UUID наставников, связанных с заявками:

    • Собирает уникальные EventMentorID из заявок с PushSend == false.
  6. Получение FCM-токенов наставников:

    • Через authService.GetFCMTokens по списку UUID наставников.
    • В случае ошибки записывает статус ошибки в спан и возвращает ошибку.
  7. Отправка push-уведомлений наставникам:

    • Для каждого наставника отправляется пуш с сообщением "Ответьте ему на заявку".
    • Используется notificationService.SendMessage.
    • Ошибки отправки логируются в спан, но не прерывают цикл отправки другим наставникам.
sendPushesForStudentsReject

Метод sendPushesForStudentsReject Отправляет push-уведомления студентам о reject (отказе).


⚙️ Основные действия

  1. Проверка включенности функционала отказов:
  2. Если в конфигурации cfg.MentorSettings.RejectUsers стоит false, метод завершает выполнение без действий.

  3. Получение списка заявок студентов, не находящихся в статусе ожидания и старше заданного периода:

    • Вычисляется временной порог: текущее время минус DayReject дней из настроек.
    • Запрашиваются заявки с помощью mentorService.GetNotPendingStudent с фильтром по времени и статусу.
  4. Обработка ошибок при получении заявок:

    • При ошибках проводится проверка на специфическую ошибку mentorserviceerrors.ErrFlowRegistrationNotFound.
    • Если обнаружена эта ошибка — возвращается nil, иначе ошибка пробрасывается дальше.
  5. Формирование списков UUID студентов и ID регистраций:

    • Из полученных заявок создаются два среза:
      • studentSlice с UUID студентов.
      • regIDSlice с ID регистраций студентов.
  6. Асинхронное обновление статуса аннулирования заявок:

    • В отдельной горутине вызывается mentorService.RejectStudentRegistration с regIDSlice.
  7. Получение FCM-токенов для студентов:

    • Через authService.GetFCMTokens по UUID студентов.
  8. Проверка включения отправки пушей студентам:

    • Если в конфигурации cfg.MentorSettings.SendPushesForStudents стоит false, метод завершает работу без рассылки.
  9. Отправка push-уведомлений студентам:

    • Для каждого студента отправляется пуш с сообщением об аннулировании заявки и возможностью подачи новой.
    • Используется метод notificationService.SendMessage.
    • Ошибки отправки пушей записываются в спан, но не прерывают выполнение.