API Departments Workflow
1. Обзор workflow
CRUD API для управления отделами компании с авторизацией по токену.
| Название | api-departments |
|---|---|
| База данных | PostgreSQL (departments, companies, employees) |
| Методы | 4 webhook-узла для разных операций |
2. GET /departments/get
Получение списка отделов с опциональной информацией о руководителях.
Цепочка выполнения:
-
Webhook (departments/get)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.heads- флаг включения информации о руководителях (boolean)
-
Edit Fields1
Извлекает параметры из запроса:
token = $json.headers.authorization heads = $json.body.heads -
Postgres8
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1;Возвращает companyId для дальнейших запросов.
-
Merge3
Объединяет данные из Edit Fields1 и Postgres8.
-
If
Определяет, нужно ли включать информацию о руководителях:
Условие: $json.heads == true -
Ветка 1 (heads == true):
-
Postgres4
Выполняет запрос с JOIN к таблице employees:
SELECT d."departmentId", d."name", d."headId", COALESCE(e."lastName" || ' ' || e."firstName", '') AS "head_name" FROM departments d LEFT JOIN employees e ON d."headId" = e."userId" WHERE d."companyId" = $1;Особенности:
- COALESCE возвращает пустую строку, если руководитель не назначен
- LEFT JOIN гарантирует включение всех отделов, даже без руководителя
-
Respond to departments/get4
Возвращает полные данные об отделах с именами руководителей.
-
Postgres4
-
Ветка 2 (heads == false):
-
Postgres
Выполняет базовый запрос:
SELECT "departmentId", "name", "headId" FROM departments WHERE "companyId" = $1; -
Respond to departments/get
Возвращает упрощенные данные об отделах.
-
Postgres
Пример ответа (heads=true):
[
{
"departmentId": 8,
"name": "Бэкофис",
"headId": null,
"head_name": ""
},
{
"departmentId": 16,
"name": "Разработка",
"headId": 101,
"head_name": "Иванов Иван"
}
]
3. POST /departments/create
Создание нового отдела с возможностью назначения руководителя.
Цепочка выполнения:
-
Webhook (departments/create)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.name- название отдела (обязательное)body.headId- ID руководителя (опциональное)
-
Edit Fields2
Извлекает параметры:
token = $json.headers.authorization name = $json.body.name headId = $json.body.headId -
Postgres5
Проверяет валидность токена и получает companyId:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge
Объединяет данные из Edit Fields2 и Postgres5.
-
Code
Генерирует динамический SQL-запрос:
Логика работы:
- Проверяет наличие обязательных полей (name, companyId)
- Строит INSERT-запрос с учетом наличия headId
- Формирует список параметров для безопасного выполнения запроса
Пример сгенерированного SQL:
INSERT INTO departments ("name", "companyId", "headId") VALUES ($1, $2, $3);Пример параметров:
["команда 1", "5jCpeRvNOGIN8DKBbmCF", null] -
Postgres1
Выполняет сгенерированный запрос:
{{$node["Code"].json["generated_sql"]}}С параметрами:
{{$node["Code"].json["params"]}} -
Respond to departments/get1
Возвращает статус успешного выполнения:
{"status": "success"}
Особенности:
- headId может быть null (отдел без руководителя)
- Автоматическая привязка к компании по токену
- Защита от SQL-инъекций через параметризованные запросы
4. POST /departments/update
Обновление данных отдела (название и/или руководитель).
Цепочка выполнения:
-
Webhook (departments/update)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.departmentId- ID обновляемого отдела (обязательное)body.name- новое название (опциональное)body.headId- новый ID руководителя (опциональное)
-
Edit Fields5
Извлекает параметры:
token = $json.headers.authorization departmentId = $json.body.departmentId name = $json.body.name headId = $json.body.headId -
Postgres7
Проверяет валидность токена и получает companyId:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge2
Объединяет данные из Edit Fields5 и Postgres7.
-
Code1
Генерирует динамический UPDATE-запрос:
Логика работы:
- Проверяет наличие departmentId
- Валидирует тип headId (должен быть number или null)
- Строит UPDATE только для переданных полей
- Формирует список параметров с правильным порядком
Пример сгенерированного SQL:
UPDATE departments SET "name" = $1, "headId" = $2 WHERE "departmentId" = $3;Пример параметров:
["Бэкофис", null, 8] -
Postgres3
Выполняет сгенерированный запрос:
{{$node["Code1"].json["generated_sql"]}}С параметрами:
{{$node["Code1"].json["params"]}} -
Respond to departments/get3
Возвращает статус успешного выполнения:
{"status": "success"}
Особенности:
- Можно обновлять как оба поля, так и только одно
- Поддержка снятия руководителя (headId = null)
- Автоматическая проверка прав компании на отдел
5. POST /departments/delete
Удаление отдела по ID с проверкой принадлежности к компании.
Цепочка выполнения:
-
Webhook (departments/delete)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.departmentId- ID удаляемого отдела
-
Edit Fields3
Извлекает параметры:
token = $json.headers.authorization body.departmentId = $json.body.departmentId -
Postgres6
Проверяет валидность токена и получает companyId:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge1
Объединяет данные из Edit Fields3 и Postgres6.
-
Postgres2
Выполняет удаление с проверкой companyId:
DELETE FROM departments WHERE "departmentId" = $1 AND "companyId" = $2;Параметры:
- $1 - departmentId из запроса
- $2 - companyId из проверки токена
-
Respond to departments/get2
Возвращает статус успешного выполнения:
{"status": "success"}
Особенности безопасности:
- Двойная проверка: по токену и явное условие в SQL
- Невозможно удалить отдел другой компании
- Каскадное удаление зависит от настроек БД (внешние ключи)
6. Общие компоненты
Авторизация
Все запросы требуют валидного токена компании в заголовке Authorization.
Проверка токена выполняется запросом:
SELECT "companyId" FROM companies WHERE "token" = $1;
Структура БД
Таблица departments
- departmentId - первичный ключ
- name - название отдела
- companyId - ссылка на компанию
- headId - ссылка на сотрудника (руководителя)
Таблица companies
- companyId - первичный ключ
- token - токен для авторизации
Таблица employees
- userId - первичный ключ
- firstName, lastName - имя и фамилия
Обработка ошибок
Общие сценарии ошибок:
- Неверный токен - 401 Unauthorized
- Отсутствуют обязательные поля - 400 Bad Request
- Попытка обновить/удалить несуществующий отдел - 404 Not Found
- Нарушение ограничений БД - 409 Conflict