API Surveys Workflow
1. Обзор workflow
CRUD API для управления опросами компании с авторизацией по токену.
| Название | api-surveys |
|---|---|
| База данных | PostgreSQL (surveys, companies, employees) |
| Методы | 6 webhook-узлов для разных операций |
| Основные сущности | Опросы с аудиторией и респондентами |
2. POST /surveys/get
Получение списка всех опросов компании.
Цепочка выполнения:
-
Webhook (surveys/get)
Принимает POST-запрос с параметром:
headers.authorization- токен компании
-
Edit Fields1
Извлекает токен из заголовков:
headers.authorization = $json.headers.authorization -
Postgres4
Получает companyId по токену:
SELECT "companyId" FROM companies WHERE "token" = $1;Параметр:
$1 = authorization token -
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Возвращает полную информацию по всем опросам компании.
-
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
Создание нового опроса с указанием аудитории и респондентов.
Цепочка выполнения:
-
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- объект с departmentIdsbody.respondents- массив ID респондентов
-
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 -
check company token
Проверяет токен и получает companyId:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge
Объединяет данные из Edit Fields2 и check company token.
-
Code
Генерирует SQL для подсчета респондентов:
Логика работы:
- Если есть departmentIds - считает сотрудников этих отделов
- Если есть respondents - добавляет их к подсчету
- Если оба массива пусты - возвращает 0
Пример SQL:
SELECT COUNT(DISTINCT "userId") FROM employees WHERE "departmentId" = ANY(ARRAY[1,2]) UNION SELECT UNNEST(ARRAY['101','102']) -
get_respondents2
Выполняет SQL для подсчета респондентов.
-
Merge3
Объединяет данные с результатом подсчета.
-
If1
Проверяет количество респондентов:
Условие: $json.total_respondents_count != 0 -
Ветка 1 (есть респонденты):
-
make sql
Генерирует INSERT-запрос для surveys:
Логика работы:
- Проверяет обязательные поля (companyId, name, status и др.)
- Строит запрос с учетом наличия respondents и auditory
- Добавляет 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); -
insert survey
Выполняет сгенерированный INSERT.
-
Respond to surveys/create
Возвращает статус успеха.
-
make sql
-
Ветка 2 (нет респондентов):
-
Edit Fields6
Устанавливает статус "need respondents".
-
Respond to surveys/create1
Возвращает соответствующее сообщение.
{"status": "need respondents"}
-
Edit Fields6
Особенности:
- Автоматический подсчет общего числа респондентов
- Проверка наличия хотя бы одного респондента
- Поддержка как отделов, так и конкретных пользователей
4. POST /surveys/update
Обновление данных существующего опроса.
Цепочка выполнения:
-
Webhook (surveys/update)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.surveyId- ID опроса- Остальные параметры аналогичны create (опциональные)
-
Edit Fields5
Извлекает параметры из запроса, включая surveyId.
-
check company token1
Проверяет токен и получает companyId.
-
Merge2
Объединяет данные.
-
Code1
Генерирует SQL для подсчета респондентов (аналогично create).
-
get_respondents
Выполняет подсчет респондентов.
-
Merge4
Объединяет данные с результатом подсчета.
-
If
Проверяет наличие респондентов.
-
Ветка 1 (есть респонденты):
-
make sql1
Генерирует UPDATE-запрос:
Логика работы:
- Проверяет обязательные поля (включая surveyId)
- Обновляет только переданные поля
- Добавляет условие 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; -
insert survey1
Выполняет UPDATE.
-
Respond to surveys/create2
Возвращает статус успеха.
-
make sql1
-
Ветка 2 (нет респондентов):
-
Edit Fields7
Устанавливает статус "need respondents".
-
Respond to surveys/create3
Возвращает соответствующее сообщение.
-
Edit Fields7
5. POST /surveys/delete
Удаление опроса и связанных данных.
Цепочка выполнения:
-
Webhook (surveys/delete)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.surveyId- ID опроса
-
Edit Fields3
Извлекает параметры:
token = $json.headers.authorization body.surveyId = $json.body.surveyId -
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 -
Merge1
Объединяет данные.
-
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 -
Respond to surveys/delete
Возвращает статус успеха.
Особенности:
- Каскадное удаление связанных данных (raw_ai_data, raw_survey_data)
- Двойная проверка прав компании
6. POST /surveys/complete
Отметка опроса как завершенного с вызовом внешнего API.
Цепочка выполнения:
-
Webhook (surveys/complete)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.surveyId- ID опроса
-
Edit Fields
Извлекает параметры:
token = $json.headers.authorization body.surveyId = $json.body.surveyId -
check company token2
Проверяет права компании на опрос (аналогично delete).
-
Merge5
Объединяет данные.
-
HTTP Request
Вызывает внешний API для обработки завершенного опроса:
POST https://api.hroom.ai/webhook/processing/survey Параметры: surveyId = $json.body.surveyId status = active Заголовки: Authorization = $json.token
7. POST /surveys/count
Получение количества опросов компании.
Цепочка выполнения:
-
Webhook (surveys/count)
Принимает POST-запрос с параметром:
headers.authorization- токен компании
-
Edit Fields4
Извлекает токен:
headers.authorization = $json.headers.authorization -
Postgres5
Получает companyId по токену.
-
Postgres1
Подсчитывает опросы компании:
SELECT COALESCE(COUNT(*)::integer, 0) AS surveys_count FROM surveys WHERE "companyId" = $1; -
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