Темный режим

API Unsubscribe Workflow

1. Обзор workflow

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

Названиеapi/unsubscribe
База данныхPostgreSQL (employees, managers, tokens)
Методы1 webhook-узел с разветвленной логикой
Основная функцияИзменение статуса подписки (subscribe) на FALSE

2. POST /unsubscribe

Отписка пользователя (сотрудника или менеджера) от рассылки.

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

  1. Webhook (api/unsubscribe)

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

    • body.token - токен сотрудника (опциональный)
    • body.manager_token - токен менеджера (опциональный)
    • body.action - флаг действия (true/false)
    • body.status - статус для установки (только для менеджеров)

    Пример запроса:

    {
      "token": "a7d32e26-c39d-477d-a41c-16ac3f764e19",
      "action": true
    }
  2. Switch (manager or employee)

    Определяет тип пользователя по наличию токена:

    • Ветка 1: если существует $json.body.token - сотрудник
    • Ветка 2: если существует $json.body.manager_token - менеджер
  3. Ветка сотрудника (employee):

    1. If (get or change)

      Проверяет параметр action:

      Условие: $json.body.action == true

      Определяет, нужно ли получить статус или изменить его.

    2. Подветка изменения статуса (action == true):
      1. Edit Fields1

        Извлекает токен сотрудника:

        token = $json.body.token
      2. Postgres (change status)

        Обновляет статус подписки сотрудника:

        WITH updated AS (
            UPDATE employees
            SET subscribe = FALSE
            WHERE token = $1
            RETURNING *
        )
        SELECT 
            CASE 
                WHEN EXISTS (SELECT 1 FROM updated) THEN 'success'
                ELSE 'error'
            END AS status;

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

        • Использует CTE (Common Table Expression) для проверки успешности обновления
        • Возвращает 'success' если запись была обновлена

      3. Respond2 to api/unsubscribe

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

        {"status": "23"}
    3. Подветка получения статуса (action != true):
      1. Edit Fields

        Извлекает токен сотрудника:

        token = $json.body.token
      2. Postgres (get status)

        Получает текущий статус подписки:

        SELECT 
            'employee' AS user,
            CASE 
                WHEN subscribe = TRUE THEN 'active'
                ELSE 'inactive'
            END AS status
        FROM employees
        WHERE token = $1;

        Формат ответа:

        • user: тип пользователя ('employee')
        • status: 'active' или 'inactive'

      3. Respond to api/unsubscribe

        Возвращает данные о статусе:

        {
          "user": "employee",
          "status": "active"
        }
  4. Ветка менеджера (manager):

    1. If (get or change1)

      Проверяет наличие параметра status:

      Условие: $json.body.status существует

      Определяет, нужно ли получить статус или изменить его.

    2. Подветка изменения статуса (status существует):
      1. Edit Fields3

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

        token = $json.body.manager_token
        status = $json.body.status
      2. Postgres (change status1)

        Обновляет статус подписки менеджера:

        WITH token_data AS (
            SELECT "userId" FROM tokens WHERE token = $1
        ),
        manager_data AS (
            SELECT "managerId" FROM managers WHERE token = $1
            UNION ALL
            SELECT "managerId" FROM managers 
            WHERE "managerId" = (SELECT "userId" FROM token_data)
        )
        UPDATE managers
        SET subscribe = $2
        WHERE "managerId" IN (SELECT "managerId" FROM manager_data)
        RETURNING subscribe AS status, 'manager' AS "user";

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

        • Ищет менеджера по прямому токену или через связку tokens-managers
        • Обновляет статус подписки для всех найденных записей
        • Возвращает обновленные данные

      3. Respond2 to api/unsubscribe1

        Возвращает результат обновления:

        {
          "status": false,
          "user": "manager"
        }
    3. Подветка получения статуса (status не существует):
      1. Edit Fields2

        Извлекает токен менеджера:

        token = $json.body.manager_token
      2. Postgres (get status1)

        Получает текущий статус подписки менеджера:

        WITH token_data AS (
            SELECT "userId" FROM tokens WHERE token = $1
        ),
        manager_data AS (
            SELECT subscribe, 'manager' AS "user" FROM managers WHERE token = $1
            UNION ALL
            SELECT subscribe, 'manager' AS "user" FROM managers 
            WHERE "managerId" = (SELECT "userId" FROM token_data)
        )
        SELECT subscribe AS status, "user"
        FROM manager_data
        LIMIT 1;

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

        • Ищет менеджера по прямому токену или через связку tokens-managers
        • Возвращает первый найденный результат (LIMIT 1)

      3. If

        Проверяет, найден ли пользователь:

        Условие: $json.user существует
      4. Respond to api/unsubscribe1

        Возвращает данные о статусе:

        {
          "status": true,
          "user": "manager"
        }

Структура БД

Таблица employees

  • token - уникальный идентификатор сотрудника
  • subscribe - статус подписки (boolean)

Таблица managers

  • managerId - первичный ключ
  • token - токен менеджера
  • subscribe - статус подписки (boolean)

Таблица tokens

  • token - уникальный идентификатор
  • userId - ссылка на пользователя

Обработка ошибок

Возможные сценарии ошибок:

  • Не передан ни один токен - 400 Bad Request
  • Неверный токен - 404 Not Found
  • Нет прав на выполнение операции - 403 Forbidden