Темный режим

API Questions Workflow

1. Обзор workflow

API для получения данных опросов с различными фильтрами и агрегацией результатов.

Названиеapi-questions
База данныхPostgreSQL (questions, raw_survey_data, translations)
Основной метод1 webhook с разветвленной логикой обработки

2. POST /questions/get

Получение данных опросов с возможностью фильтрации по departmentId, paramNameMetric и типу запроса.

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

  1. Webhook (questions/get)

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

    • headers.authorization - токен компании
    • body.departmentId - ID отдела для фильтрации (опционально)
    • body.paramNameMetric - название метрики для фильтрации (опционально)
    • body.type - тип запроса (например, "comments")
  2. Edit Fields1

    Извлекает параметры из запроса:

    query.token = $json.headers.authorization
    query.departmentId = $json.body.departmentId
    query.paramNameMetric = $json.body.paramNameMetric
    query.type = $json.body.type
  3. Postgres4

    Проверяет валидность токена:

    SELECT "companyId" FROM companies WHERE "token" = $1;

    Возвращает companyId для дальнейших запросов.

  4. Merge1

    Объединяет данные из Edit Fields1 и Postgres4.

  5. Code

    Определяет тип запроса и устанавливает значение switch:

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

    1. Обрабатывает departmentId и paramNameMetric:
      • Преобразует "null", "all", "", "1" в None
      • Пытается преобразовать departmentId в integer
    2. Определяет тип запроса (type = 'comments')
    3. Устанавливает switch в зависимости от условий:
      • 1 - если указаны и departmentId и paramNameMetric
      • 2 - если указан только departmentId
      • 3 - если указан только paramNameMetric или type = 'comments'
      • 4 - если не указаны оба параметра
  6. Switch

    Направляет выполнение по одной из 4 веток в зависимости от значения switch.

  7. Ветка 1 (switch == 1): departmentId и paramNameMetric указаны

    1. Postgres get metrics

      Выполняет запрос с фильтрацией по обоим параметрам:

      SELECT 
          "departmentId", "paramNameMetric", "value", 
          "userId", "questionId", "paramNameSubmetric"
      FROM "raw_survey_data"
      WHERE "companyId" = $1 AND "questionId" <> 123;

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

      • Исключает questionId = 123 (специальный идентификатор)
      • Фильтрация по companyId из проверки токена

    2. Code1

      Агрегирует данные:

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

      1. Группирует данные по questionId
      2. Усредняет значения по userId
      3. Распределяет ответы по категориям:
        • 0-3.3: Отрицательно
        • 3.31-6.6: Нейтрально
        • 6.61-10: Положительно
        • NULL: Без ответа
      4. Рассчитывает процентное соотношение
      5. Сортирует по среднему значению
    3. Postgres find names

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

      SELECT "questionId", "questionRussian", "paramNameMetric", "paramNameSubmetric"
      FROM questions
      WHERE "questionId" <> 123;
    4. Merge

      Объединяет данные по questionId.

    5. Postgres find names1

      Получает переводы для метрик и субметрик:

      SELECT "key", "ru", "type"
      FROM translations
      WHERE "type" IN ('metric', 'submetric');
    6. Code2

      Преобразует структуру переводов:

      # Для type = 'metric' переименовывает 'ru' в 'paramNameMetricRu'
      # Для type = 'submetric' переименовывает 'ru' в 'paramNameSubmetricRu'
    7. Merge2

      Объединяет данные по paramNameMetric.

    8. Merge4

      Объединяет данные по paramNameSubmetric.

    9. Respond to questions/get

      Возвращает агрегированные данные с переводами.

  8. Ветка 2 (switch == 2): только departmentId указан

    1. Postgres get metrics

      Выполняет аналогичный запрос с фильтрацией только по departmentId.

    2. Code1

      Агрегирует данные аналогично ветке 1.

    3. Postgres find names

      Получает русские названия вопросов.

    4. Merge

      Объединяет данные по questionId.

    5. Respond to questions/get

      Возвращает агрегированные данные.

  9. Ветка 3 (switch == 3): только paramNameMetric указан или type = 'comments'

    1. Postgres get metrics 1

      Для type = 'comments' получает комментарии:

      SELECT "questionId", "comment", "createdAt"
      FROM raw_survey_data
      WHERE "companyId" = $1
      AND "comment" IS NOT NULL
      AND TRIM("comment") != 'null';
    2. Postgres find names2

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

      SELECT "questionId", "questionRussian"
      FROM questions;
    3. Merge3

      Объединяет данные по questionId.

    4. Respond to questions/get

      Возвращает комментарии с названиями вопросов.

  10. Ветка 4 (switch == 4): параметры не указаны

    1. Respond to questions/get

      Возвращает пустой или базовый ответ.

Пример ответа (switch == 1):

[
  {
    "questionId": 1,
    "totalUserCount": 15,
    "averageValue": 7.2,
    "groupCounts": {
      "Отрицательно": 2,
      "Нейтрально": 5,
      "Положительно": 7,
      "Без ответа": 1
    },
    "groupPercentages": {
      "Отрицательно": 13,
      "Нейтрально": 33,
      "Положительно": 47,
      "Без ответа": 7
    },
    "questionRussian": "Удовлетворенность работой",
    "paramNameMetric": "job_satisfaction",
    "paramNameSubmetric": "team_work",
    "paramNameMetricRu": "Удовлетворенность работой",
    "paramNameSubmetricRu": "Работа в команде"
  }
]

Пример ответа (switch == 3, comments):

[
  {
    "questionId": 5,
    "comment": "Нужно больше встреч с командой",
    "createdAt": "2024-05-15T10:30:00Z",
    "questionRussian": "Командное взаимодействие"
  }
]