Темный режим

API Departments Workflow

1. Обзор workflow

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

Названиеapi-departments
База данныхPostgreSQL (departments, companies, employees)
Методы4 webhook-узла для разных операций

2. GET /departments/get

Получение списка отделов с опциональной информацией о руководителях.

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

  1. Webhook (departments/get)

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

    • headers.authorization - токен компании
    • body.heads - флаг включения информации о руководителях (boolean)
  2. Edit Fields1

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

    token = $json.headers.authorization
    heads = $json.body.heads
  3. Postgres8

    Проверяет валидность токена:

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

    Возвращает companyId для дальнейших запросов.

  4. Merge3

    Объединяет данные из Edit Fields1 и Postgres8.

  5. If

    Определяет, нужно ли включать информацию о руководителях:

    Условие: $json.heads == true
  6. Ветка 1 (heads == true):

    1. 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 гарантирует включение всех отделов, даже без руководителя

    2. Respond to departments/get4

      Возвращает полные данные об отделах с именами руководителей.

  7. Ветка 2 (heads == false):

    1. Postgres

      Выполняет базовый запрос:

      SELECT "departmentId", "name", "headId"
      FROM departments
      WHERE "companyId" = $1;
    2. Respond to departments/get

      Возвращает упрощенные данные об отделах.

Пример ответа (heads=true):

[
  {
    "departmentId": 8,
    "name": "Бэкофис",
    "headId": null,
    "head_name": ""
  },
  {
    "departmentId": 16,
    "name": "Разработка",
    "headId": 101,
    "head_name": "Иванов Иван"
  }
]

3. POST /departments/create

Создание нового отдела с возможностью назначения руководителя.

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

  1. Webhook (departments/create)

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

    • headers.authorization - токен компании
    • body.name - название отдела (обязательное)
    • body.headId - ID руководителя (опциональное)
  2. Edit Fields2

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

    token = $json.headers.authorization
    name = $json.body.name
    headId = $json.body.headId
  3. Postgres5

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

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

    Объединяет данные из Edit Fields2 и Postgres5.

  5. Code

    Генерирует динамический SQL-запрос:

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

    1. Проверяет наличие обязательных полей (name, companyId)
    2. Строит INSERT-запрос с учетом наличия headId
    3. Формирует список параметров для безопасного выполнения запроса

    Пример сгенерированного SQL:

    INSERT INTO departments ("name", "companyId", "headId")
    VALUES ($1, $2, $3);

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

    ["команда 1", "5jCpeRvNOGIN8DKBbmCF", null]
  6. Postgres1

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

    {{$node["Code"].json["generated_sql"]}}

    С параметрами: {{$node["Code"].json["params"]}}

  7. Respond to departments/get1

    Возвращает статус успешного выполнения:

    {"status": "success"}

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

  • headId может быть null (отдел без руководителя)
  • Автоматическая привязка к компании по токену
  • Защита от SQL-инъекций через параметризованные запросы

4. POST /departments/update

Обновление данных отдела (название и/или руководитель).

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

  1. Webhook (departments/update)

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

    • headers.authorization - токен компании
    • body.departmentId - ID обновляемого отдела (обязательное)
    • body.name - новое название (опциональное)
    • body.headId - новый ID руководителя (опциональное)
  2. Edit Fields5

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

    token = $json.headers.authorization
    departmentId = $json.body.departmentId
    name = $json.body.name
    headId = $json.body.headId
  3. Postgres7

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

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

    Объединяет данные из Edit Fields5 и Postgres7.

  5. Code1

    Генерирует динамический UPDATE-запрос:

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

    1. Проверяет наличие departmentId
    2. Валидирует тип headId (должен быть number или null)
    3. Строит UPDATE только для переданных полей
    4. Формирует список параметров с правильным порядком

    Пример сгенерированного SQL:

    UPDATE departments 
    SET "name" = $1, "headId" = $2 
    WHERE "departmentId" = $3;

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

    ["Бэкофис", null, 8]
  6. Postgres3

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

    {{$node["Code1"].json["generated_sql"]}}

    С параметрами: {{$node["Code1"].json["params"]}}

  7. Respond to departments/get3

    Возвращает статус успешного выполнения:

    {"status": "success"}

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

  • Можно обновлять как оба поля, так и только одно
  • Поддержка снятия руководителя (headId = null)
  • Автоматическая проверка прав компании на отдел

5. POST /departments/delete

Удаление отдела по ID с проверкой принадлежности к компании.

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

  1. Webhook (departments/delete)

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

    • headers.authorization - токен компании
    • body.departmentId - ID удаляемого отдела
  2. Edit Fields3

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

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

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

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

    Объединяет данные из Edit Fields3 и Postgres6.

  5. Postgres2

    Выполняет удаление с проверкой companyId:

    DELETE FROM departments
    WHERE "departmentId" = $1 AND "companyId" = $2;

    Параметры:

    • $1 - departmentId из запроса
    • $2 - companyId из проверки токена

  6. 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