Темный режим

API Surveys Workflow

1. Обзор workflow

CRUD API для управления опросами компании с авторизацией по токену.

Названиеapi-surveys
База данныхPostgreSQL (surveys, companies, employees)
Методы6 webhook-узлов для разных операций
Основные сущностиОпросы с аудиторией и респондентами

2. POST /surveys/get

Получение списка всех опросов компании.

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

  1. Webhook (surveys/get)

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

    • headers.authorization - токен компании
  2. Edit Fields1

    Извлекает токен из заголовков:

    headers.authorization = $json.headers.authorization
  3. Postgres4

    Получает companyId по токену:

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

    Параметр: $1 = authorization token

  4. Postgres

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

    SELECT 
        "surveyId", "name", "auditory", "respondents", "type", 
        "groupIndex", "test", "status", "start_date", "end_date",
        "createdAt", "total_respondents_count", "current_respondents_count"
    FROM surveys
    WHERE "companyId" = $1;

    Параметр: $1 = companyId

    Возвращает полную информацию по всем опросам компании.

  5. Respond to surveys/get

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

Пример ответа:

[
  {
    "surveyId": 1,
    "name": "Опрос вовлеченности",
    "auditory": {"departmentIds": [1,2]},
    "respondents": [101,102],
    "type": "q20",
    "test": false,
    "status": "active",
    "start_date": "2024-01-01T00:00",
    "end_date": "2024-01-31T00:00",
    "total_respondents_count": 50,
    "current_respondents_count": 30
  }
]

3. POST /surveys/create

Создание нового опроса с указанием аудитории и респондентов.

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

  1. Webhook (surveys/create)

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

    • headers.authorization - токен компании
    • body.name - название опроса
    • body.status - статус (planned/active/completed)
    • body.type - тип опроса (q20 и др.)
    • body.test - тестовый режим (boolean)
    • body.start_date, body.end_date - даты
    • body.auditory - объект с departmentIds
    • body.respondents - массив ID респондентов
  2. Edit Fields2

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

    token = $json.headers.authorization
    name = $json.body.name
    status = $json.body.status
    type = $json.body.type
    test = $json.body.test
    start_date = $json.body.start_date
    end_date = $json.body.end_date
    auditory = $json.body.auditory
    respondents = $json.body.respondents
  3. check company token

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

    SELECT "companyId" FROM companies WHERE "token" = $1;
  4. Merge

    Объединяет данные из Edit Fields2 и check company token.

  5. Code

    Генерирует SQL для подсчета респондентов:

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

    1. Если есть departmentIds - считает сотрудников этих отделов
    2. Если есть respondents - добавляет их к подсчету
    3. Если оба массива пусты - возвращает 0

    Пример SQL:

    SELECT COUNT(DISTINCT "userId") FROM employees
    WHERE "departmentId" = ANY(ARRAY[1,2])
    UNION
    SELECT UNNEST(ARRAY['101','102'])
  6. get_respondents2

    Выполняет SQL для подсчета респондентов.

  7. Merge3

    Объединяет данные с результатом подсчета.

  8. If1

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

    Условие: $json.total_respondents_count != 0
  9. Ветка 1 (есть респонденты):

    1. make sql

      Генерирует INSERT-запрос для surveys:

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

      1. Проверяет обязательные поля (companyId, name, status и др.)
      2. Строит запрос с учетом наличия respondents и auditory
      3. Добавляет groupIndex=1 и total_respondents_count

      Пример SQL:

      INSERT INTO surveys (
          "companyId", "name", "status", "type", "test",
          "start_date", "end_date", "groupIndex", "respondents",
          "auditory", "total_respondents_count"
      ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);
    2. insert survey

      Выполняет сгенерированный INSERT.

    3. Respond to surveys/create

      Возвращает статус успеха.

  10. Ветка 2 (нет респондентов):

    1. Edit Fields6

      Устанавливает статус "need respondents".

    2. Respond to surveys/create1

      Возвращает соответствующее сообщение.

      {"status": "need respondents"}

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

  • Автоматический подсчет общего числа респондентов
  • Проверка наличия хотя бы одного респондента
  • Поддержка как отделов, так и конкретных пользователей

4. POST /surveys/update

Обновление данных существующего опроса.

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

  1. Webhook (surveys/update)

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

    • headers.authorization - токен компании
    • body.surveyId - ID опроса
    • Остальные параметры аналогичны create (опциональные)
  2. Edit Fields5

    Извлекает параметры из запроса, включая surveyId.

  3. check company token1

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

  4. Merge2

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

  5. Code1

    Генерирует SQL для подсчета респондентов (аналогично create).

  6. get_respondents

    Выполняет подсчет респондентов.

  7. Merge4

    Объединяет данные с результатом подсчета.

  8. If

    Проверяет наличие респондентов.

  9. Ветка 1 (есть респонденты):

    1. make sql1

      Генерирует UPDATE-запрос:

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

      1. Проверяет обязательные поля (включая surveyId)
      2. Обновляет только переданные поля
      3. Добавляет условие WHERE по surveyId

      Пример SQL:

      UPDATE surveys SET
          "name" = $1, "status" = $2, "type" = $3,
          "test" = $4, "start_date" = $5, "end_date" = $6,
          "respondents" = $7, "auditory" = $8,
          "total_respondents_count" = $9
      WHERE "surveyId" = $10;
    2. insert survey1

      Выполняет UPDATE.

    3. Respond to surveys/create2

      Возвращает статус успеха.

  10. Ветка 2 (нет респондентов):

    1. Edit Fields7

      Устанавливает статус "need respondents".

    2. Respond to surveys/create3

      Возвращает соответствующее сообщение.

5. POST /surveys/delete

Удаление опроса и связанных данных.

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

  1. Webhook (surveys/delete)

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

    • headers.authorization - токен компании
    • body.surveyId - ID опроса
  2. Edit Fields3

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

    token = $json.headers.authorization
    body.surveyId = $json.body.surveyId
  3. Postgres6

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

    SELECT c."companyId"
    FROM companies c
    JOIN surveys s ON c."companyId" = s."companyId"
    WHERE c."token" = $1 AND s."surveyId" = $2;

    Параметры: $1 = token, $2 = surveyId

  4. Merge1

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

  5. delete survey, raw_data, ai_data

    Удаляет все связанные данные:

    DELETE FROM raw_ai_data WHERE "surveyId" = $1 AND "companyId" = $2;
    DELETE FROM raw_survey_data WHERE "surveyId" = $1 AND "companyId" = $2;
    DELETE FROM surveys WHERE "surveyId" = $1 AND "companyId" = $2;

    Параметры: $1 = surveyId, $2 = companyId

  6. Respond to surveys/delete

    Возвращает статус успеха.

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

  • Каскадное удаление связанных данных (raw_ai_data, raw_survey_data)
  • Двойная проверка прав компании

6. POST /surveys/complete

Отметка опроса как завершенного с вызовом внешнего API.

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

  1. Webhook (surveys/complete)

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

    • headers.authorization - токен компании
    • body.surveyId - ID опроса
  2. Edit Fields

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

    token = $json.headers.authorization
    body.surveyId = $json.body.surveyId
  3. check company token2

    Проверяет права компании на опрос (аналогично delete).

  4. Merge5

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

  5. HTTP Request

    Вызывает внешний API для обработки завершенного опроса:

    POST https://api.hroom.ai/webhook/processing/survey
    Параметры:
      surveyId = $json.body.surveyId
      status = active
    Заголовки:
      Authorization = $json.token

7. POST /surveys/count

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

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

  1. Webhook (surveys/count)

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

    • headers.authorization - токен компании
  2. Edit Fields4

    Извлекает токен:

    headers.authorization = $json.headers.authorization
  3. Postgres5

    Получает companyId по токену.

  4. Postgres1

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

    SELECT COALESCE(COUNT(*)::integer, 0) AS surveys_count
    FROM surveys
    WHERE "companyId" = $1;
  5. Respond to surveys/count

    Возвращает количество опросов.

    {"surveys_count": 5}

8. Общие компоненты

Авторизация

Все запросы требуют валидного токена компании в заголовке Authorization.

Проверка токена выполняется запросом:

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

Структура БД

Таблица surveys

  • surveyId - первичный ключ
  • companyId - ссылка на компанию
  • name - название опроса
  • auditory - JSON с departmentIds
  • respondents - массив ID респондентов
  • status - статус опроса
  • start_date, end_date - даты
  • total_respondents_count - общее число респондентов

Таблица companies

  • companyId - первичный ключ
  • token - токен для авторизации

Таблица employees

  • userId - первичный ключ
  • departmentId - ссылка на отдел

Обработка ошибок

Общие сценарии ошибок:

  • Неверный токен - 401 Unauthorized
  • Отсутствуют обязательные поля - 400 Bad Request
  • Попытка работы с чужим опросом - 403 Forbidden
  • Нет респондентов - 422 Unprocessable Entity