Темный режим

API Survey Get Workflow

1. Обзор workflow

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

Названиеapi-survey-get
База данныхPostgreSQL (surveys, employees, question_groups, questions, companies)
Основной метод1 webhook-узел для получения данных опроса
ОсобенностиМногоуровневая проверка прав доступа, поддержка мультиязычности

2. GET /survey/data/get

Получение данных опроса с проверкой прав доступа пользователя и поддержкой мультиязычности.

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

  1. Webhook (survey/data/get)

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

    • query.surveyId - ID опроса
    • query.userId - ID пользователя
    • query.lang - язык интерфейса (ru/en)
  2. Edit Fields1

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

    query.surveyId = $json.query.surveyId
    query.userId = $json.query.userId
    query.lang = $json.query.lang
  3. survey data (Postgres)

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

    Логика работы запроса:

    1. Проверяет существование активного опроса с указанным surveyId
    2. Проверяет существование активного пользователя с указанным userId
    3. Возвращает разные статусы:
      • "success" - если все проверки пройдены
      • "no survey" - если опрос не найден
      • "no employee" - если пользователь не найден
    4. Объединяет данные из surveys и employees

    Ключевые поля результата:

    surveyId, name, respondents, type, groupIndex, test, companyId, userId, departmentId, lang, status
  4. Switch

    Разветвляет поток в зависимости от статуса:

    • Ветка 1: status == "success"
    • Ветка 2: status == "no survey"
    • Ветка 3: status == "no employee"
  5. Ветка 1 (success):

    1. Code1 (Python)

      Проверяет, есть ли пользователь в списке respondents:

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

      if 'respondents' in data and data['userId'] in data['respondents']:
          data['result'] = "success"
      else:
          data['result'] = "no user"

      Добавляет поле result с результатом проверки.

    2. If

      Проверяет условие:

      $json.result == "success"
    3. Подветка 1.1 (result == "success"):
      1. questions list (Postgres)

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

        SELECT 
            qg."question_list",
            $3 AS lang,
            c."name" AS companyName
        FROM question_groups qg
        JOIN companies c ON c."companyId" = $4
        WHERE qg."type" = $1
          AND qg."index" = $2;

        Параметры:

        • $1 - type из данных опроса
        • $2 - groupIndex из данных опроса
        • $3 - lang из запроса
        • $4 - companyId из данных опроса

      2. Code (JavaScript)

        Генерирует SQL-запрос для получения данных вопросов на нужном языке:

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

        1. Получает список question_list из предыдущего узла
        2. В зависимости от языка (lang) формирует запрос:
          • Для 'ru' - выбирает русские версии текстов (questionRussian, answerRussian, hintRu)
          • Для 'en' - выбирает английские версии текстов (questionEn, answerEn, hintEn)
        3. Сортирует вопросы согласно порядку в question_list
        4. Возвращает массив объектов с данными вопросов

        Пример сгенерированного SQL (для ru):

        SELECT 
            array_agg(
                jsonb_build_object(
                    'questionId', "questionId", 
                    'paramNameMetric', "paramNameMetric", 
                    'paramNameSubmetric', "paramNameSubmetric", 
                    'type', "type",
                    'question', "questionRussian",
                    'answer', "answerRussian",
                    'hint', "hintRu"
                ) ORDER BY array_position(ARRAY[...], "questionId")
            ) AS questions
        FROM questions
        WHERE "questionId" IN (...);
      3. questions data (Postgres)

        Выполняет сгенерированный запрос для получения данных вопросов.

      4. Merge1

        Объединяет данные:

        • Основные данные опроса
        • Список вопросов
        • Данные вопросов

      5. Respond to survey/data/get

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

    4. Подветка 1.2 (result != "success"):
      1. Edit Fields2

        Устанавливает статус:

        status = "no employee"
      2. Respond to survey/data/get2

        Возвращает ошибку:

        {"status": "no employee"}
  6. Ветка 2 (no survey):

    1. Edit Fields

      Устанавливает статус:

      status = "no survey"
    2. Respond to survey/data/get1

      Возвращает ошибку:

      {"status": "no survey"}
  7. Ветка 3 (no employee):

    1. Edit Fields2

      Устанавливает статус:

      status = "no employee"
    2. Respond to survey/data/get2

      Возвращает ошибку:

      {"status": "no employee"}

Пример успешного ответа:

{
  "surveyId": "2cb7a2a9-25aa-4057-ab85-49ae4a43ad3f",
  "name": "Оценка удовлетворенности",
  "respondents": ["aeb96598-d07b-4ba4-a13e-48b13d5fca15", ...],
  "type": "standard",
  "groupIndex": 1,
  "test": false,
  "companyId": "5jCpeRvNOGIN8DKBbmCF",
  "userId": "aeb96498-d07v-4ba4-a13e-48b13d5fca15",
  "departmentId": 16,
  "lang": "ru",
  "status": "success",
  "question_list": ["q1", "q2", "q3"],
  "companyName": "Example Corp",
  "questions": [
    {
      "questionId": "q1",
      "paramNameMetric": "satisfaction",
      "paramNameSubmetric": "general",
      "type": "scale",
      "question": "Насколько вы довольны работой компании?",
      "answer": "Шкала от 1 до 10",
      "hint": "Выберите значение от 1 (совсем не доволен) до 10 (полностью доволен)"
    },
    ...
  ]
}

Примеры ошибочных ответов:

{"status": "no survey"}
{"status": "no employee"}

Особенности реализации:

  • Многоуровневая проверка прав:
    1. Существование опроса
    2. Существование пользователя
    3. Принадлежность пользователя к списку respondents опроса
  • Поддержка мультиязычности через динамическое формирование SQL-запроса
  • Сохранение порядка вопросов согласно question_list
  • Комплексный ответ, включающий все необходимые данные для отображения опроса