Темный режим

API Survey Processing Workflow

1. Обзор workflow

Workflow для обработки опросов с различными статусами (planned, active, processing).

Названиеapi-survey-processing
База данныхPostgreSQL (surveys, companies, managers, employees)
Основной webhookPOST /processing/survey
Основные операцииОбновление статусов опросов, отправка email уведомлений

2. POST /processing/survey

Центральный обработчик опросов, управляющий их жизненным циклом.

Цепочка выполнения:

  1. Webhook (processing/survey)

    Принимает POST-запрос с параметрами:

    • query.surveyId - ID опроса
    • query.status - текущий статус опроса

    Пример запроса:

    {
      "query": {
        "surveyId": "49",
        "status": "processing"
      }
    }
  2. If

    Проверяет, что статус не равен "processing":

    Условие: $json.query.status != "processing"

    Это защита от повторной обработки.

  3. Ветка 1 (status != processing):

    1. get survey data

      Получает основные данные опроса:

      SELECT 
          "surveyId", "auditory", "respondents", "status",
          "start_date", "end_date", "type", "groupIndex", "companyId"
      FROM surveys
      WHERE "surveyId" = $1;
  4. Ветка 2 (status == processing):

    1. get survey "processing"

      Проверяет, можно ли обрабатывать опрос:

      SELECT 
          "surveyId", "auditory", "respondents", "status",
          "start_date", "end_date", "type", "groupIndex", "companyId"
      FROM surveys
      WHERE "surveyId" = $1 AND "processing" <= 0;

      Защита от параллельной обработки.

  5. If serveys>

    Проверяет, что данные опроса не пустые:

    Условие: $json != null
  6. make sql code

    Генерирует SQL-запросы в зависимости от статуса опроса:

    Логика работы:

    1. planned → active: обновляет статус, устанавливает даты
    2. active → processing: меняет статус, сбрасывает счетчик обработки
    3. processing → completed: завершает опрос

    Пример для статуса "planned":

    UPDATE "surveys"
    SET "status" = 'active', "start_date" = '{start_date}', "end_date" = '{end_date}'
    WHERE "surveyId" = {surveyId}
    RETURNING "surveyId", "token" AS "survey_token", "status", "start_date", "end_date";

    Дополнительные SQL:

    • Запрос данных компании
    • Запрос менеджеров компании
    • Запрос респондентов (для planned)
  7. Switch

    Разделяет поток по значению switch:

    • start_surveys - начало опроса
    • end_surveys - завершение активной фазы
    • processing_surveys - обработка результатов
  8. Ветка start_surveys:

    1. update_survey

      Обновляет статус опроса на "active":

      {{ $json.survey_sql }}
    2. get_respondents

      Получает список респондентов:

      SELECT "userId", "token", "email", "subscribe", "companyId"
      FROM "employees"
      WHERE "userId" IN (...) OR "departmentId" IN (...);
    3. Code

      Подсчитывает респондентов:

      return {
          "users_total": len(data),
          "respondents": [item['json']['userId'] for item in data]
      }
    4. Code1

      Рассчитывает дни опроса и форматирует дату окончания:

      # Пример вывода:
      {
          "days_count": 14,
          "end_date_description": "15 мая 2024 года в 18:00 (UTC+3)"
      }
    5. subscribe check

      Проверяет подписку респондента:

      Условие: $json.subscribe == true
    6. EMAIL to respondents

      Отправляет email с приглашением:

      POST https://api.beta.rusender.ru/api/v1/external-mails/send-by-template
      Параметры: email, token, survey_token, days_count, end_date_description
  9. Ветка end_surveys:

    1. update_survey

      Обновляет статус на "processing":

      UPDATE "surveys"
      SET "status" = 'processing', "processing" = 0
      WHERE "surveyId" = {surveyId}
      RETURNING "surveyId", "token" AS "survey_token", "status";
    2. Split departments

      Разделяет departmentIds для дальнейшей обработки.

    3. Execute Workflow

      Запускает внешний workflow (api-ai-syncdata).

  10. Ветка processing_surveys:

    1. update_survey

      Завершает опрос:

      UPDATE "surveys"
      SET "status" = 'completed'
      WHERE "surveyId" = {surveyId}
      RETURNING "surveyId", "token" AS "survey_token", "status";
    2. Postgres1

      Рассчитывает процент завершения:

      SELECT 
          total_respondents_count,
          current_respondents_count,
          ROUND((current_respondents_count * 100.0 / total_respondents_count)) AS completion_percentage
      FROM surveys
      WHERE "surveyId" = $1;
    3. Postgres2

      Считает AI-данные:

      SELECT COUNT(*) AS "survey_ai"
      FROM raw_ai_data
      WHERE "surveyId" = $1;
    4. Edit Fields

      Форматирует статистику:

      "survey-respondents": "12 из 50 (24%)"
    5. Switch2

      Проверяет подписку менеджера:

      Условие: $json.subscribe == true
    6. EMAIL to respondents1

      Отправляет отчет менеджеру:

      POST https://api.beta.rusender.ru/api/v1/external-mails/send-by-template
      Параметры: email, firstName, lastName, token, survey-respondents, survey_ai

Особенности:

  • Автоматический переход между статусами опроса
  • Защита от параллельной обработки (processing counter)
  • Интеграция с email-сервисом для уведомлений
  • Поддержка разных сценариев для каждого статуса