API Survey Get Workflow
1. Обзор workflow
API для получения данных опроса с проверкой доступа пользователя.
| Название | api-survey-get |
|---|---|
| База данных | PostgreSQL (surveys, employees, question_groups, questions, companies) |
| Основной метод | 1 webhook-узел для получения данных опроса |
| Особенности | Многоуровневая проверка прав доступа, поддержка мультиязычности |
2. GET /survey/data/get
Получение данных опроса с проверкой прав доступа пользователя и поддержкой мультиязычности.
Цепочка выполнения:
-
Webhook (survey/data/get)
Принимает запрос с параметрами:
query.surveyId- ID опросаquery.userId- ID пользователяquery.lang- язык интерфейса (ru/en)
-
Edit Fields1
Извлекает параметры из запроса:
query.surveyId = $json.query.surveyId query.userId = $json.query.userId query.lang = $json.query.lang -
survey data (Postgres)
Выполняет комплексный запрос для проверки прав и получения основных данных:
Логика работы запроса:
- Проверяет существование активного опроса с указанным surveyId
- Проверяет существование активного пользователя с указанным userId
- Возвращает разные статусы:
- "success" - если все проверки пройдены
- "no survey" - если опрос не найден
- "no employee" - если пользователь не найден
- Объединяет данные из surveys и employees
Ключевые поля результата:
surveyId, name, respondents, type, groupIndex, test, companyId, userId, departmentId, lang, status -
Switch
Разветвляет поток в зависимости от статуса:
- Ветка 1: status == "success"
- Ветка 2: status == "no survey"
- Ветка 3: status == "no employee"
-
Ветка 1 (success):
-
Code1 (Python)
Проверяет, есть ли пользователь в списке respondents:
Логика работы:
if 'respondents' in data and data['userId'] in data['respondents']: data['result'] = "success" else: data['result'] = "no user"Добавляет поле result с результатом проверки.
-
If
Проверяет условие:
$json.result == "success" -
Подветка 1.1 (result == "success"):
-
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 из данных опроса
-
Code (JavaScript)
Генерирует SQL-запрос для получения данных вопросов на нужном языке:
Логика работы:
- Получает список question_list из предыдущего узла
- В зависимости от языка (lang) формирует запрос:
- Для 'ru' - выбирает русские версии текстов (questionRussian, answerRussian, hintRu)
- Для 'en' - выбирает английские версии текстов (questionEn, answerEn, hintEn)
- Сортирует вопросы согласно порядку в question_list
- Возвращает массив объектов с данными вопросов
Пример сгенерированного 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 (...); -
questions data (Postgres)
Выполняет сгенерированный запрос для получения данных вопросов.
-
Merge1
Объединяет данные:
- Основные данные опроса
- Список вопросов
- Данные вопросов
-
Respond to survey/data/get
Возвращает полные данные опроса с вопросами.
-
questions list (Postgres)
-
Подветка 1.2 (result != "success"):
-
Edit Fields2
Устанавливает статус:
status = "no employee" -
Respond to survey/data/get2
Возвращает ошибку:
{"status": "no employee"}
-
Edit Fields2
-
Code1 (Python)
-
Ветка 2 (no survey):
-
Edit Fields
Устанавливает статус:
status = "no survey" -
Respond to survey/data/get1
Возвращает ошибку:
{"status": "no survey"}
-
Edit Fields
-
Ветка 3 (no employee):
-
Edit Fields2
Устанавливает статус:
status = "no employee" -
Respond to survey/data/get2
Возвращает ошибку:
{"status": "no employee"}
-
Edit Fields2
Пример успешного ответа:
{
"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"}
Особенности реализации:
- Многоуровневая проверка прав:
- Существование опроса
- Существование пользователя
- Принадлежность пользователя к списку respondents опроса
- Поддержка мультиязычности через динамическое формирование SQL-запроса
- Сохранение порядка вопросов согласно question_list
- Комплексный ответ, включающий все необходимые данные для отображения опроса