API Questions Workflow
1. Обзор workflow
API для получения данных опросов с различными фильтрами и агрегацией результатов.
| Название | api-questions |
|---|---|
| База данных | PostgreSQL (questions, raw_survey_data, translations) |
| Основной метод | 1 webhook с разветвленной логикой обработки |
2. POST /questions/get
Получение данных опросов с возможностью фильтрации по departmentId, paramNameMetric и типу запроса.
Цепочка выполнения:
-
Webhook (questions/get)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.departmentId- ID отдела для фильтрации (опционально)body.paramNameMetric- название метрики для фильтрации (опционально)body.type- тип запроса (например, "comments")
-
Edit Fields1
Извлекает параметры из запроса:
query.token = $json.headers.authorization query.departmentId = $json.body.departmentId query.paramNameMetric = $json.body.paramNameMetric query.type = $json.body.type -
Postgres4
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1;Возвращает companyId для дальнейших запросов.
-
Merge1
Объединяет данные из Edit Fields1 и Postgres4.
-
Code
Определяет тип запроса и устанавливает значение switch:
Логика работы:
- Обрабатывает departmentId и paramNameMetric:
- Преобразует "null", "all", "", "1" в None
- Пытается преобразовать departmentId в integer
- Определяет тип запроса (type = 'comments')
- Устанавливает switch в зависимости от условий:
- 1 - если указаны и departmentId и paramNameMetric
- 2 - если указан только departmentId
- 3 - если указан только paramNameMetric или type = 'comments'
- 4 - если не указаны оба параметра
- Обрабатывает departmentId и paramNameMetric:
-
Switch
Направляет выполнение по одной из 4 веток в зависимости от значения switch.
-
Ветка 1 (switch == 1): departmentId и paramNameMetric указаны
-
Postgres get metrics
Выполняет запрос с фильтрацией по обоим параметрам:
SELECT "departmentId", "paramNameMetric", "value", "userId", "questionId", "paramNameSubmetric" FROM "raw_survey_data" WHERE "companyId" = $1 AND "questionId" <> 123;Особенности:
- Исключает questionId = 123 (специальный идентификатор)
- Фильтрация по companyId из проверки токена
-
Code1
Агрегирует данные:
Логика работы:
- Группирует данные по questionId
- Усредняет значения по userId
- Распределяет ответы по категориям:
- 0-3.3: Отрицательно
- 3.31-6.6: Нейтрально
- 6.61-10: Положительно
- NULL: Без ответа
- Рассчитывает процентное соотношение
- Сортирует по среднему значению
-
Postgres find names
Получает русские названия вопросов:
SELECT "questionId", "questionRussian", "paramNameMetric", "paramNameSubmetric" FROM questions WHERE "questionId" <> 123; -
Merge
Объединяет данные по questionId.
-
Postgres find names1
Получает переводы для метрик и субметрик:
SELECT "key", "ru", "type" FROM translations WHERE "type" IN ('metric', 'submetric'); -
Code2
Преобразует структуру переводов:
# Для type = 'metric' переименовывает 'ru' в 'paramNameMetricRu' # Для type = 'submetric' переименовывает 'ru' в 'paramNameSubmetricRu' -
Merge2
Объединяет данные по paramNameMetric.
-
Merge4
Объединяет данные по paramNameSubmetric.
-
Respond to questions/get
Возвращает агрегированные данные с переводами.
-
Postgres get metrics
-
Ветка 2 (switch == 2): только departmentId указан
-
Postgres get metrics
Выполняет аналогичный запрос с фильтрацией только по departmentId.
-
Code1
Агрегирует данные аналогично ветке 1.
-
Postgres find names
Получает русские названия вопросов.
-
Merge
Объединяет данные по questionId.
-
Respond to questions/get
Возвращает агрегированные данные.
-
Postgres get metrics
-
Ветка 3 (switch == 3): только paramNameMetric указан или type = 'comments'
-
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'; -
Postgres find names2
Получает русские названия вопросов:
SELECT "questionId", "questionRussian" FROM questions; -
Merge3
Объединяет данные по questionId.
-
Respond to questions/get
Возвращает комментарии с названиями вопросов.
-
Postgres get metrics 1
-
Ветка 4 (switch == 4): параметры не указаны
-
Respond to questions/get
Возвращает пустой или базовый ответ.
-
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": "Командное взаимодействие"
}
]