Темный режим

API Admin Workflow

1. Обзор workflow

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

Названиеapi-admin
База данныхPostgreSQL (companies, managers, tokens)
Методы9 webhook-узлов для разных операций
ОсобенностиХеширование паролей, отправка email, проверка прав администратора

2. POST /company/get

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

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

  1. Webhook (company/get)

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

    • headers.authorization - токен администратора
    • body.id - ID компании или "all" для всех
  2. find fields from request

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

    token = $json.headers.authorization
    companyId = $json.body.id
  3. check token

    Проверяет, что токен принадлежит администратору:

    SELECT "managerId" FROM managers 
    WHERE "token" = $1 AND "admin" = true;
  4. Merge1

    Объединяет данные из предыдущих узлов.

  5. get companies

    Получает данные о компаниях:

    SELECT 
        "companyId", "name", "accountType", "website",
        "expirationDate", "token", "createdAt"
    FROM companies

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

    • Возвращает все компании (без фильтрации по companyId)
    • Включает токен компании и дату истечения

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

  7. Merge

    Объединяет данные компаний и менеджеров по companyId.

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

Добавление новой компании.

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

  1. Webhook (company/add)

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

    • headers.authorization - токен администратора
    • body.name - название компании
    • body.accountType - тип аккаунта (free/paid)
    • body.website - вебсайт компании
    • body.expirationDate - дата истечения (опционально)
  2. find fields from request1

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

    token = $json.headers.authorization
    name = $json.body.name
    accountType = $json.body.accountType
    website = $json.body.website
    expirationDate = $json.body.expirationDate
  3. check token1

    Проверяет права администратора:

    SELECT "managerId" FROM managers 
    WHERE "token" = $1 AND "admin" = true;
  4. Merge4

    Объединяет данные из запроса и проверки токена.

  5. Code1

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

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

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

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

    INSERT INTO companies ("name", "accountType", "website")
    VALUES ('тестовый', 'free', 'https://test.com');
  6. company add

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

    {{$node["Code1"].json["generated_sql"]}}
  7. Respond to company/add

    Возвращает результат выполнения.

4. POST /company/update

Обновление данных компании.

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

  1. Webhook (company/update)

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

    • headers.authorization - токен администратора
    • body.companyId - ID компании
    • body.name - новое название (опционально)
    • body.accountType - новый тип (опционально)
    • body.website - новый сайт (опционально)
    • body.expirationDate - новая дата (опционально)
  2. 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
  3. check token2

    Проверяет права администратора.

  4. Merge5

    Объединяет данные.

  5. Code

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

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

    1. Проверяет наличие companyId
    2. Добавляет в UPDATE только переданные непустые поля
    3. Игнорирует пустые expirationDate

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

    UPDATE companies 
    SET "name" = 'Dostyk Media', 
        "accountType" = 'free', 
        "website" = 'https://dostykmedia.kz'
    WHERE "companyId" = 58;
  6. company update

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

  7. Respond to company/update

    Возвращает результат выполнения.

5. POST /company/delete

Удаление компании по ID.

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

  1. Webhook (company/delete)

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

    • headers.authorization - токен администратора
    • body.id - ID компании
  2. find fields from request3

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

    token = $json.headers.authorization
    companyId = $json.body.id
  3. check token3

    Проверяет права администратора.

  4. Merge6

    Объединяет данные.

  5. company delete

    Выполняет удаление:

    DELETE FROM companies WHERE "companyId" = $1;
  6. Respond to company/delete

    Возвращает результат выполнения.

6. POST /managers/get

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

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

  1. Webhook (managers/get)

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

    • headers.authorization - токен администратора
    • body.id - "all" для всех менеджеров
  2. find fields from request4

    Извлекает токен:

    token = $json.headers.authorization
  3. check token4

    Проверяет права администратора.

  4. Merge9

    Объединяет данные.

  5. managers get

    Получает данные менеджеров:

    SELECT 
        "managerId", "email", "firstName", "middleName",
        "lastName", "phone", "photoUrl", "companyId", 
        "admin", "token" AS "manager_token"
    FROM managers
  6. get companies1

    Получает данные компаний:

    SELECT 
        "companyId", "name", "accountType", "website",
        "expirationDate", "token" AS "company_token",
        "createdAt"
    FROM companies
  7. Merge2

    Объединяет менеджеров и компании по companyId.

  8. Respond to manager/get

    Возвращает объединенные данные.

7. POST /managers/add

Добавление нового менеджера с отправкой email для активации.

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

  1. Webhook (managers/add)

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

    • headers.authorization - токен администратора
    • body.firstName - имя
    • body.lastName - фамилия
    • body.email - email
    • body.phone - телефон
    • body.password - пароль
    • body.companyId - ID компании
  2. 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
  3. get manager id

    Проверяет, существует ли уже менеджер с таким email:

    SELECT "managerId" FROM managers WHERE email = $1;
  4. If4

    Проверяет условия:

    Условия:
    1. $json.managerId пустой (email не занят)
    2. $json.query.companyId не равен 0
  5. Ветка 1 (условия выполнены):

    1. bcrypt pass hash

      Хеширует пароль с помощью bcrypt:

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

      Использует библиотеку bcrypt для безопасного хеширования пароля.

      Добавляет хеш в query.hashedPassword.

    2. 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}}
      )
    3. add email activation token

      Создает токен активации:

      INSERT INTO "tokens" ("userId", "expires_at")
      VALUES ($1, NOW() + INTERVAL '72 hours')
      RETURNING "token" AS "auth_token";

      Токен действителен 72 часа.

    4. 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 }}"
          }
        }
      }
    5. Respond success

      Возвращает успешный ответ.

  6. Ветка 2 (email занят):

    1. email already exists

      Возвращает ошибку "email already exists".

  7. Ветка 3 (не выбрана компания):

    1. Select the company

      Возвращает ошибку "Select the company".

8. POST /managers/update

Обновление данных менеджера.

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

  1. Webhook (managers/update)

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

    • headers.authorization - токен администратора
    • body.managerId - ID менеджера
    • body.email - новый email (опционально)
    • body.firstName - новое имя (опционально)
    • body.lastName - новая фамилия (опционально)
    • body.phone - новый телефон (опционально)
    • body.companyId - новая компания (опционально)
  2. 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
  3. check token6

    Проверяет права администратора.

  4. Merge11

    Объединяет данные.

  5. Code2

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

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

    1. Проверяет наличие managerId
    2. Для пустых firstName/lastName/middleName устанавливает NULL
    3. Обновляет только переданные поля

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

    UPDATE managers 
    SET "email" = 'dstan1111@gmail.com',
        "firstName" = 'Анатолий',
        "middleName" = 'Александровичу',
        "lastName" = 'Бурцев',
        "phone" = '+351 914 997 708',
        "companyId" = 1
    WHERE "managerId" = 65;
  6. managers update

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

  7. Respond to manager/update

    Возвращает результат выполнения.

9. POST /managers/delete

Удаление менеджера по ID.

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

  1. Webhook (managers/delete)

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

    • headers.authorization - токен администратора
    • body.delete_managerId - ID менеджера
  2. find fields from request5

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

    token = $json.headers.authorization
    delete_managerId = $json.body.delete_managerId
  3. check token5

    Проверяет права администратора.

  4. Merge10

    Объединяет данные.

  5. manager delete

    Удаляет менеджера:

    DELETE FROM managers WHERE "managerId" = $1;
  6. 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