API Employees Workflow
1. Обзор workflow
CRUD API для управления сотрудниками компании с авторизацией по токену и расширенными возможностями фильтрации.
| Название | api-employees |
|---|---|
| База данных | PostgreSQL (employees, companies, departments) |
| Методы | 6 webhook-узлов для разных операций |
| Особенности | Динамическая генерация SQL, проверка email, импорт из файла |
2. POST /employees/get
Получение списка сотрудников с возможностью фильтрации по различным параметрам.
Цепочка выполнения:
-
Webhook (employees/get)
Принимает POST-запрос с параметрами:
headers.authorization- токен компании- Опциональные параметры фильтрации в теле запроса:
departmentId- ID отдела ("none" для сотрудников без отдела)status- статус сотрудникаhireDate- дата приема на работу (фильтр "после")searchTerm- поиск по ФИО и emailuserId- конкретный сотрудникcity- город
-
Edit Fields1
Извлекает параметры из запроса:
token = $json.headers.authorization departmentId = $json.body.departmentId status = $json.body.status hireDate = $json.body.hireDate searchTerm = $json.body.searchTerm userId = $json.body.userId -
Postgres4
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1;Возвращает companyId для дальнейших запросов.
-
Merge
Объединяет данные из Edit Fields1 и Postgres4.
-
Code
Генерирует динамический SQL-запрос на основе параметров:
Логика работы:
- Базовый запрос выбирает все поля сотрудника
- Добавляет условия WHERE только для переданных параметров
- Особые обработки:
departmentId="none"→"departmentId" IS NULLsearchTerm→ поиск по ФИО и email (ILIKE)- Проверка на пустые значения параметров
Пример сгенерированного SQL:
SELECT "departmentId", "userId", "firstName", "lastName", "middleName", "email", "phone", "telegram", "gender", "role", "birthDate", "hireDate", "city", "status" FROM employees WHERE "companyId" = 68 AND "status" = 'active' AND "departmentId" IS NULL AND ("firstName" ILIKE '%иван%' OR "lastName" ILIKE '%иван%') -
Postgres
Выполняет сгенерированный запрос.
-
Postgres11
Получает названия отделов для объединения:
SELECT "departmentId", "name" as department_name FROM departments WHERE "companyId" = $1; -
Merge6
Объединяет данные сотрудников с названиями отделов.
-
Respond to departments/get
Возвращает полные данные о сотрудниках.
Пример ответа:
[
{
"departmentId": null,
"userId": 101,
"firstName": "Иван",
"lastName": "Иванов",
"email": "ivan@example.com",
"status": "active",
"department_name": null
},
{
"departmentId": 16,
"userId": 102,
"firstName": "Петр",
"lastName": "Петров",
"email": "petr@example.com",
"status": "active",
"department_name": "Разработка"
}
]
3. POST /employees/count
Получение количества сотрудников по отделам для компании.
Цепочка выполнения:
-
Webhook (employees/count)
Принимает POST-запрос с заголовком:
headers.authorization- токен компании
-
Edit Fields2
Извлекает токен:
headers.authorization = $json.headers.authorization -
Postgres5
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Edit Fields3
Добавляет companyId в данные.
-
Postgres1
Выполняет запрос подсчета сотрудников:
SELECT "departmentId", COUNT(*)::integer AS employee_count FROM employees WHERE "companyId" = $1 GROUP BY "departmentId"; -
Respond to departments/get1
Возвращает статистику по отделам:
[ { "departmentId": 8, "employee_count": 5 }, { "departmentId": null, "employee_count": 3 } ]
4. POST /employees/create
Создание нового сотрудника с проверкой уникальности email и лимитами для бесплатных аккаунтов.
Цепочка выполнения:
-
Webhook (employees/create)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.email- email сотрудника (обязательное)- Другие опциональные данные сотрудника
-
Edit Fields
Извлекает параметры из запроса:
token = $json.headers.authorization firstName = $json.body.firstName lastName = $json.body.lastName ... (все поля сотрудника) -
Postgres6
Проверяет валидность токена и получает companyId и тип аккаунта:
SELECT "companyId", "accountType" FROM companies WHERE "token" = $1; -
Merge1
Объединяет данные из Edit Fields и Postgres6.
-
check email1
Проверяет уникальность email в компании:
SELECT EXISTS ( SELECT 1 FROM employees WHERE email = $1 AND "companyId" = $2 ) AS check; -
Merge4
Объединяет результаты проверки.
-
If1
Определяет тип аккаунта (paid/free):
Условие: $json.accountType == "paid" -
Ветка 1 (paid аккаунт):
-
Switch
Проверяет результат проверки email:
- Если email существует → возвращает ошибку
- Иначе → продолжает создание
-
Code1
Генерирует INSERT-запрос:
Логика работы:
- Проверяет обязательные поля (companyId, email)
- Обрабатывает departmentId="none" как NULL
- Формирует параметризованный запрос только для переданных полей
- Устанавливает статус "active" по умолчанию
Пример сгенерированного SQL:
INSERT INTO employees ( "companyId", "email", "firstName", "lastName", "departmentId", "status" ) VALUES ($1, $2, $3, $4, $5, $6); -
Postgres2
Выполняет запрос создания.
-
Respond to departments/get2
Возвращает результат создания.
-
Switch
-
Ветка 2 (free аккаунт):
-
check email2
Проверяет лимит сотрудников (не более 10):
SELECT CASE WHEN COUNT(*) >= 10 THEN false ELSE true END AS limit FROM employees WHERE "companyId" = $2; -
Merge7
Объединяет результаты проверок.
-
If2
Проверяет лимит:
Условие: $json.limit == true- Если лимит исчерпан → возвращает ошибку 413
- Иначе → проверяет email и создает сотрудника
-
check email2
Пример ошибки:
{
"response": "email already exists"
}
5. POST /employees/update
Обновление данных сотрудника с проверкой уникальности email.
Цепочка выполнения:
-
Webhook (employees/update)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.userId- ID обновляемого сотрудника (обязательное)- Другие обновляемые поля
-
Edit Fields5
Извлекает параметры из запроса:
token = $json.headers.authorization userId = $json.body.userId ... (все обновляемые поля) -
Postgres8
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge3
Объединяет данные из Edit Fields5 и Postgres8.
-
check email
Проверяет уникальность email (исключая текущего сотрудника):
SELECT EXISTS ( SELECT 1 FROM employees WHERE email = $1 AND "companyId" = $2 AND "userId" <> $3 ) AS check; -
Merge5
Объединяет результаты проверки.
-
Switch1
Проверяет результат проверки email:
- Если email существует → возвращает ошибку
- Иначе → продолжает обновление
-
Code2
Генерирует динамический UPDATE-запрос:
Логика работы:
- Проверяет наличие userId
- Добавляет в запрос только переданные поля
- Особые обработки:
departmentId="none"→NULL- Пустые даты →
NULL
Пример сгенерированного SQL:
UPDATE employees SET "lastName" = $1, "firstName" = $2, "departmentId" = NULL WHERE "userId" = $3; -
Postgres9
Выполняет запрос обновления.
-
Respond to departments/get4
Возвращает результат обновления.
6. POST /employees/delete
Удаление сотрудника по ID с проверкой принадлежности к компании.
Цепочка выполнения:
-
Webhook (employees/delete)
Принимает POST-запрос с параметрами:
headers.authorization- токен компанииbody.userId- ID удаляемого сотрудника
-
Edit Fields4
Извлекает параметры:
token = $json.headers.authorization userId = $json.body.userId -
Postgres7
Проверяет валидность токена:
SELECT "companyId" FROM companies WHERE "token" = $1; -
Merge2
Объединяет данные из Edit Fields4 и Postgres7.
-
Postgres3
Выполняет удаление с проверкой companyId:
DELETE FROM employees WHERE "userId" = $1 AND "companyId" = $2; -
Respond to departments/get3
Возвращает статус успешного выполнения:
{"status": "success"}
7. POST /employees/import
Импорт сотрудников из файла (CSV/Excel).
Цепочка выполнения:
-
Webhook (employees/import)
Принимает POST-запрос с файлом:
headers.authorization- токен компании- Файл с данными сотрудников
-
get companyId
Проверяет валидность токена:
SELECT "companyId", "token" FROM companies WHERE "token" = $1; -
Read File
Читает данные из файла (поддерживает CSV/Excel).
-
Merge9
Объединяет companyId с данными из файла.
-
Execute Workflow
Запускает подпроцесс для каждого сотрудника (аналогично employees/create).
-
Edit Fields8
Формирует итоговый ответ.
-
Respond to Webhook
Возвращает статус импорта:
{"result": "success"}
8. Общие компоненты
Авторизация
Все запросы требуют валидного токена компании в заголовке Authorization.
Проверка токена выполняется запросом:
SELECT "companyId" FROM companies WHERE "token" = $1;
Структура БД
Таблица employees
- userId - первичный ключ
- companyId - ссылка на компанию
- departmentId - ссылка на отдел (может быть NULL)
- firstName, lastName, middleName - ФИО
- email - уникальный в рамках компании
- status - статус сотрудника (active/inactive)
- Другие персональные данные
Таблица companies
- companyId - первичный ключ
- token - токен для авторизации
- accountType - тип аккаунта (paid/free)
Обработка ошибок
Общие сценарии ошибок:
- Неверный токен - 401 Unauthorized
- Дубликат email - 409 Conflict
- Превышение лимита сотрудников (free) - 413 Payload Too Large
- Отсутствуют обязательные поля - 400 Bad Request