API Admin Workflow
1. Обзор workflow
CRUD API для управления компаниями и менеджерами с авторизацией по токену и админскими правами.
| Название | api-admin |
|---|---|
| База данных | PostgreSQL (companies, managers, tokens) |
| Методы | 9 webhook-узлов для разных операций |
| Особенности | Хеширование паролей, отправка email, проверка прав администратора |
2. POST /company/get
Получение списка компаний с информацией о менеджерах.
Цепочка выполнения:
-
Webhook (company/get)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.id- ID компании или "all" для всех
-
find fields from request
Извлекает параметры из запроса:
token = $json.headers.authorization companyId = $json.body.id -
check token
Проверяет, что токен принадлежит администратору:
SELECT "managerId" FROM managers WHERE "token" = $1 AND "admin" = true; -
Merge1
Объединяет данные из предыдущих узлов.
-
get companies
Получает данные о компаниях:
SELECT "companyId", "name", "accountType", "website", "expirationDate", "token", "createdAt" FROM companiesОсобенности:
- Возвращает все компании (без фильтрации по companyId)
- Включает токен компании и дату истечения
-
get managers
Получает данные о менеджерах, сгруппированные по компаниям:
SELECT "companyId", JSONB_AGG( JSONB_BUILD_OBJECT( 'managerId', "managerId", 'email', "email", 'firstName', "firstName", 'middleName', "middleName", 'lastName', "lastName", 'phone', "phone", 'photoUrl', "photoUrl", 'admin', "admin" ) ) AS managers FROM managers GROUP BY "companyId";Особенности:
- Использует JSONB_AGG для создания массива менеджеров
- Группирует по companyId
-
Merge
Объединяет данные компаний и менеджеров по companyId.
-
Respond to company/get
Возвращает объединенные данные в формате JSON.
Пример ответа:
[
{
"companyId": 1,
"name": "HRoom",
"accountType": "paid",
"website": "www.hroom.ai",
"expirationDate": "2025-10-27T23:58:15.837Z",
"token": "0bf00e15-302a-49d9-afba-008534388a89",
"createdAt": "2024-11-08T02:51:23.031Z",
"managers": [
{
"managerId": 65,
"email": "dstan1111@gmail.com",
"firstName": "Анатолий",
"middleName": "Александровичу",
"lastName": "Бурцев",
"phone": "+351 914 997 708",
"photoUrl": "https://s3.timeweb.cloud/91b8f4fa-91827ce1-dcc1-4e74-87bf-8264ca7c7368/avatar/avatar_1741030626184.jpg",
"admin": true
}
]
}
]
3. POST /company/add
Добавление новой компании.
Цепочка выполнения:
-
Webhook (company/add)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.name- название компанииbody.accountType- тип аккаунта (free/paid)body.website- вебсайт компанииbody.expirationDate- дата истечения (опционально)
-
find fields from request1
Извлекает параметры:
token = $json.headers.authorization name = $json.body.name accountType = $json.body.accountType website = $json.body.website expirationDate = $json.body.expirationDate -
check token1
Проверяет права администратора:
SELECT "managerId" FROM managers WHERE "token" = $1 AND "admin" = true; -
Merge4
Объединяет данные из запроса и проверки токена.
-
Code1
Генерирует динамический SQL-запрос для вставки:
Логика работы:
- Проверяет наличие обязательных полей (name, accountType)
- Строит INSERT только для переданных полей
- Игнорирует пустые значения
Пример сгенерированного SQL:
INSERT INTO companies ("name", "accountType", "website") VALUES ('тестовый', 'free', 'https://test.com'); -
company add
Выполняет сгенерированный запрос:
{{$node["Code1"].json["generated_sql"]}} -
Respond to company/add
Возвращает результат выполнения.
4. POST /company/update
Обновление данных компании.
Цепочка выполнения:
-
Webhook (company/update)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.companyId- ID компанииbody.name- новое название (опционально)body.accountType- новый тип (опционально)body.website- новый сайт (опционально)body.expirationDate- новая дата (опционально)
-
find fields from request2
Извлекает параметры:
token = $json.headers.authorization companyId = $json.body.companyId name = $json.body.name accountType = $json.body.accountType website = $json.body.website expirationDate = $json.body.expirationDate -
check token2
Проверяет права администратора.
-
Merge5
Объединяет данные.
-
Code
Генерирует динамический UPDATE-запрос:
Логика работы:
- Проверяет наличие companyId
- Добавляет в UPDATE только переданные непустые поля
- Игнорирует пустые expirationDate
Пример сгенерированного SQL:
UPDATE companies SET "name" = 'Dostyk Media', "accountType" = 'free', "website" = 'https://dostykmedia.kz' WHERE "companyId" = 58; -
company update
Выполняет сгенерированный запрос.
-
Respond to company/update
Возвращает результат выполнения.
5. POST /company/delete
Удаление компании по ID.
Цепочка выполнения:
-
Webhook (company/delete)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.id- ID компании
-
find fields from request3
Извлекает параметры:
token = $json.headers.authorization companyId = $json.body.id -
check token3
Проверяет права администратора.
-
Merge6
Объединяет данные.
-
company delete
Выполняет удаление:
DELETE FROM companies WHERE "companyId" = $1; -
Respond to company/delete
Возвращает результат выполнения.
6. POST /managers/get
Получение списка менеджеров с информацией о компаниях.
Цепочка выполнения:
-
Webhook (managers/get)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.id- "all" для всех менеджеров
-
find fields from request4
Извлекает токен:
token = $json.headers.authorization -
check token4
Проверяет права администратора.
-
Merge9
Объединяет данные.
-
managers get
Получает данные менеджеров:
SELECT "managerId", "email", "firstName", "middleName", "lastName", "phone", "photoUrl", "companyId", "admin", "token" AS "manager_token" FROM managers -
get companies1
Получает данные компаний:
SELECT "companyId", "name", "accountType", "website", "expirationDate", "token" AS "company_token", "createdAt" FROM companies -
Merge2
Объединяет менеджеров и компании по companyId.
-
Respond to manager/get
Возвращает объединенные данные.
7. POST /managers/add
Добавление нового менеджера с отправкой email для активации.
Цепочка выполнения:
-
Webhook (managers/add)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.firstName- имяbody.lastName- фамилияbody.email- emailbody.phone- телефонbody.password- парольbody.companyId- ID компании
-
Edit Fields5
Извлекает параметры:
query.email = $json.body.email query.password = $json.body.password query.firstName = $json.body.firstName query.lastName = $json.body.lastName query.phone = $json.body.phone query.companyId = $json.body.companyId -
get manager id
Проверяет, существует ли уже менеджер с таким email:
SELECT "managerId" FROM managers WHERE email = $1; -
If4
Проверяет условия:
Условия: 1. $json.managerId пустой (email не занят) 2. $json.query.companyId не равен 0 -
Ветка 1 (условия выполнены):
-
bcrypt pass hash
Хеширует пароль с помощью bcrypt:
Логика работы:
Использует библиотеку bcrypt для безопасного хеширования пароля.
Добавляет хеш в
query.hashedPassword. -
add manager
Добавляет менеджера в БД:
INSERT INTO managers ( "companyId", "email", "firstName", "lastName", "password", "phone" ) VALUES ( {{$json.query.companyId}}, {{$json.query.email}}, {{$json.query.firstName}}, {{$json.query.lastName}}, {{$json.query.hashedPassword}}, {{$json.query.phone}} ) -
add email activation token
Создает токен активации:
INSERT INTO "tokens" ("userId", "expires_at") VALUES ($1, NOW() + INTERVAL '72 hours') RETURNING "token" AS "auth_token";Токен действителен 72 часа.
-
EMAIL
Отправляет email с ссылкой активации:
POST https://api.beta.rusender.ru/api/v1/external-mails/send-by-template Заголовки: - Content-Type: application/json - X-Api-Key: [ключ API] Тело: { "mail": { "to": { "email": "{{ $json.email }}", "name": "{{ $json.firstName }} {{ $json.lastName }}" }, "from": { "email": "dev@hroom.ai", "name": "Команда HRoom.ai" }, "subject": "Активация аккаунта", "previewTitle": "Активация аккаунта", "idTemplateMailUser": 51256, "params": { "user-name": "{{ $json.firstName }}", "user-surname": "{{ $json.lastName }}", "user-token": "{{ $json.auth_token }}" } } } -
Respond success
Возвращает успешный ответ.
-
bcrypt pass hash
-
Ветка 2 (email занят):
-
email already exists
Возвращает ошибку "email already exists".
-
email already exists
-
Ветка 3 (не выбрана компания):
-
Select the company
Возвращает ошибку "Select the company".
-
Select the company
8. POST /managers/update
Обновление данных менеджера.
Цепочка выполнения:
-
Webhook (managers/update)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.managerId- ID менеджераbody.email- новый email (опционально)body.firstName- новое имя (опционально)body.lastName- новая фамилия (опционально)body.phone- новый телефон (опционально)body.companyId- новая компания (опционально)
-
find fields from request6
Извлекает параметры:
token = $json.headers.authorization managerId = $json.body.managerId email = $json.body.email firstName = $json.body.firstName lastName = $json.body.lastName phone = $json.body.phone companyId = $json.body.companyId middleName = $json.body.middleName -
check token6
Проверяет права администратора.
-
Merge11
Объединяет данные.
-
Code2
Генерирует динамический UPDATE-запрос:
Логика работы:
- Проверяет наличие managerId
- Для пустых firstName/lastName/middleName устанавливает NULL
- Обновляет только переданные поля
Пример сгенерированного SQL:
UPDATE managers SET "email" = 'dstan1111@gmail.com', "firstName" = 'Анатолий', "middleName" = 'Александровичу', "lastName" = 'Бурцев', "phone" = '+351 914 997 708', "companyId" = 1 WHERE "managerId" = 65; -
managers update
Выполняет сгенерированный запрос.
-
Respond to manager/update
Возвращает результат выполнения.
9. POST /managers/delete
Удаление менеджера по ID.
Цепочка выполнения:
-
Webhook (managers/delete)
Принимает POST-запрос с параметрами:
headers.authorization- токен администратораbody.delete_managerId- ID менеджера
-
find fields from request5
Извлекает параметры:
token = $json.headers.authorization delete_managerId = $json.body.delete_managerId -
check token5
Проверяет права администратора.
-
Merge10
Объединяет данные.
-
manager delete
Удаляет менеджера:
DELETE FROM managers WHERE "managerId" = $1; -
Respond to manager/delete
Возвращает результат выполнения.
10. Общие компоненты
Авторизация
Все запросы требуют валидного токена администратора в заголовке Authorization.
Проверка токена выполняется запросом:
SELECT "managerId" FROM managers WHERE "token" = $1 AND "admin" = true;
Структура БД
Таблица companies
- companyId - первичный ключ
- name - название компании
- accountType - тип аккаунта (free/paid)
- website - вебсайт
- expirationDate - дата истечения
- token - токен компании
Таблица managers
- managerId - первичный ключ
- email, firstName, lastName - данные менеджера
- password - хеш пароля
- companyId - ссылка на компанию
- admin - флаг администратора
- token - токен для авторизации
Таблица tokens
- userId - ID пользователя
- token - токен активации
- expires_at - срок действия
Обработка ошибок
Общие сценарии ошибок:
- Неверный токен - 401 Unauthorized
- Отсутствуют обязательные поля - 400 Bad Request
- Попытка добавить существующий email - 409 Conflict
- Не выбрана компания при добавлении менеджера - 400 Bad Request