API Unsubscribe Workflow
1. Обзор workflow
API для управления подписками сотрудников и менеджеров с авторизацией по токену.
| Название | api/unsubscribe |
|---|---|
| База данных | PostgreSQL (employees, managers, tokens) |
| Методы | 1 webhook-узел с разветвленной логикой |
| Основная функция | Изменение статуса подписки (subscribe) на FALSE |
2. POST /unsubscribe
Отписка пользователя (сотрудника или менеджера) от рассылки.
Цепочка выполнения:
-
Webhook (api/unsubscribe)
Принимает POST-запрос с параметрами:
body.token- токен сотрудника (опциональный)body.manager_token- токен менеджера (опциональный)body.action- флаг действия (true/false)body.status- статус для установки (только для менеджеров)
Пример запроса:
{ "token": "a7d32e26-c39d-477d-a41c-16ac3f764e19", "action": true } -
Switch (manager or employee)
Определяет тип пользователя по наличию токена:
- Ветка 1: если существует
$json.body.token- сотрудник - Ветка 2: если существует
$json.body.manager_token- менеджер
- Ветка 1: если существует
-
Ветка сотрудника (employee):
-
If (get or change)
Проверяет параметр action:
Условие: $json.body.action == trueОпределяет, нужно ли получить статус или изменить его.
-
Подветка изменения статуса (action == true):
-
Edit Fields1
Извлекает токен сотрудника:
token = $json.body.token -
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' если запись была обновлена
-
Respond2 to api/unsubscribe
Возвращает статус выполнения:
{"status": "23"}
-
Edit Fields1
-
Подветка получения статуса (action != true):
-
Edit Fields
Извлекает токен сотрудника:
token = $json.body.token -
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'
-
Respond to api/unsubscribe
Возвращает данные о статусе:
{ "user": "employee", "status": "active" }
-
Edit Fields
-
If (get or change)
-
Ветка менеджера (manager):
-
If (get or change1)
Проверяет наличие параметра status:
Условие: $json.body.status существуетОпределяет, нужно ли получить статус или изменить его.
-
Подветка изменения статуса (status существует):
-
Edit Fields3
Извлекает параметры:
token = $json.body.manager_token status = $json.body.status -
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
- Обновляет статус подписки для всех найденных записей
- Возвращает обновленные данные
-
Respond2 to api/unsubscribe1
Возвращает результат обновления:
{ "status": false, "user": "manager" }
-
Edit Fields3
-
Подветка получения статуса (status не существует):
-
Edit Fields2
Извлекает токен менеджера:
token = $json.body.manager_token -
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)
-
If
Проверяет, найден ли пользователь:
Условие: $json.user существует -
Respond to api/unsubscribe1
Возвращает данные о статусе:
{ "status": true, "user": "manager" }
-
Edit Fields2
-
If (get or change1)
Структура БД
Таблица employees
- token - уникальный идентификатор сотрудника
- subscribe - статус подписки (boolean)
Таблица managers
- managerId - первичный ключ
- token - токен менеджера
- subscribe - статус подписки (boolean)
Таблица tokens
- token - уникальный идентификатор
- userId - ссылка на пользователя
Обработка ошибок
Возможные сценарии ошибок:
- Не передан ни один токен - 400 Bad Request
- Неверный токен - 404 Not Found
- Нет прав на выполнение операции - 403 Forbidden