Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Вітаємо — місія та аудиторії

    Ласкаво просимо до Ring Platform - Врата між Людством та Квантовим Світом

    Хаб бібліотеки

    Overview

    Початок роботи

    Індекс
    Передумови
    Встановлення
    Міграції бази даних
    Валідація першого успіху
    Усунення несправностей
    Next Steps

    Архітектура

    Index
    Режими бекенду та бази даних
    Data Model
    Архітектура Аутентифікації
    Архітектура Email AI-CRM
    Архітектура PaymentConductor
    Архітектура News Kingdom
    Proxy та інтернаціоналізація
    Real Time
    Security

    Функції

    Індекс
    Authentication
    Email AI-CRM
    Сутності
    Можливості
    Повідомлення
    Notifications
    Push-сповіщення через FCM (Ring)
    Web3 Гаманець
    Магазин
    Інтеграція платежів
    PaymentConductor
    Інтеграція WayForPay

    API-інтерфейс

    Індекс
    Аутентифікація
    Email AI-CRM API
    Entities
    Можливості
    API повідомлень
    API повідомлень
    Гаманець
    API магазину

    CLI

    Ring CLI (лише enterprise)

    Кастомізація

    Індекс
    Брендування
    Функції
    Локалізація
    Теми
    Компоненти

    Розгортання

    Index
    Self-hosted розгортання
    Vercel
    Docker
    Environment
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення

    Розробка

    Розробка
    Локальне налаштування
    Структура коду
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Найкращі практики
    Workflow

    Приклади

    Приклади
    Швидкий старт
    Автентифікація
    Email AI-CRM — туторіал
    Інтеграція API
    Інтеграція Web3
    Білий лейбл
    Реальні приклади

    Інтеграції

    Ethereum гаманці (Wagmi v3)

    Швидкий вхід (CTO · аудитори · агенти)

    Хаб бібліотеки
    Вітаємо — місія та аудиторії
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безпека та відповідність
    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Вітаємо — місія та аудиторії

    Ласкаво просимо до Ring Platform - Врата між Людством та Квантовим Світом

    Хаб бібліотеки

    Overview

    Початок роботи

    Індекс
    Передумови
    Встановлення
    Міграції бази даних
    Валідація першого успіху
    Усунення несправностей
    Next Steps

    Архітектура

    Index
    Режими бекенду та бази даних
    Data Model
    Архітектура Аутентифікації
    Архітектура Email AI-CRM
    Архітектура PaymentConductor
    Архітектура News Kingdom
    Proxy та інтернаціоналізація

    Функції

    Індекс
    Authentication
    Email AI-CRM
    Сутності
    Можливості
    Повідомлення
    Notifications
    Push-сповіщення через FCM (Ring)

    API-інтерфейс

    Індекс
    Аутентифікація
    Email AI-CRM API
    Entities
    Можливості
    API повідомлень
    API повідомлень
    Гаманець
    API магазину

    CLI

    Ring CLI (лише enterprise)

    Кастомізація

    Індекс
    Брендування
    Функції
    Локалізація
    Теми
    Компоненти

    Розгортання

    Index
    Self-hosted розгортання
    Vercel
    Docker
    Environment
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення

    Розробка

    Розробка
    Локальне налаштування
    Структура коду
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Найкращі практики
    Workflow

    Приклади

    Приклади
    Швидкий старт
    Автентифікація
    Email AI-CRM — туторіал
    Інтеграція API
    Інтеграція Web3
    Білий лейбл
    Реальні приклади

    Інтеграції

    Ethereum гаманці (Wagmi v3)

    Швидкий вхід (CTO · аудитори · агенти)

    Хаб бібліотеки
    Вітаємо — місія та аудиторії
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безпека та відповідність
    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Documentation

    Вітаємо — місія та аудиторії

    Ласкаво просимо до Ring Platform - Врата між Людством та Квантовим Світом

    Хаб бібліотеки

    Overview

    Початок роботи

    Індекс
    Передумови
    Встановлення
    Міграції бази даних
    Валідація першого успіху
    Усунення несправностей
    Next Steps

    Архітектура

    Index
    Режими бекенду та бази даних
    Data Model
    Архітектура Аутентифікації
    Архітектура Email AI-CRM
    Архітектура PaymentConductor
    Архітектура News Kingdom
    Proxy та інтернаціоналізація

    Функції

    Індекс
    Authentication
    Email AI-CRM
    Сутності
    Можливості
    Повідомлення
    Notifications
    Push-сповіщення через FCM (Ring)

    API-інтерфейс

    Індекс
    Аутентифікація
    Email AI-CRM API
    Entities
    Можливості
    API повідомлень
    API повідомлень
    Гаманець
    API магазину

    CLI

    Ring CLI (лише enterprise)

    Кастомізація

    Індекс
    Брендування
    Функції
    Локалізація
    Теми
    Компоненти

    Розгортання

    Index
    Self-hosted розгортання
    Vercel
    Docker
    Environment
    Моніторинг та аналітика
    Оптимізація продуктивності
    Резервне копіювання та відновлення

    Розробка

    Розробка
    Локальне налаштування
    Структура коду
    Community tooling
    Ring MCP Server
    OSS vs enterprise
    Найкращі практики
    Workflow

    Приклади

    Приклади
    Швидкий старт
    Автентифікація
    Email AI-CRM — туторіал
    Інтеграція API
    Інтеграція Web3
    Білий лейбл
    Реальні приклади

    Інтеграції

    Ethereum гаманці (Wagmi v3)

    Швидкий вхід (CTO · аудитори · агенти)

    Хаб бібліотеки
    Вітаємо — місія та аудиторії
    Початок роботи
    Архітектура та Auth.js
    Режими бекенду та БД (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP
    Деплой (Docker · k8s)
    Безпека та відповідність
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Науковий редактор
    Система локалей
    Безпека та відповідність
    NFT Маркетплейс
    Система Стейкінга Токенів
    Паттерни Оптимізації Продуктивності
    Мобільний Досвід
    API адміністратора
    Code Style
    Performance
    Тестування
    Розгортання
    Налагодження
    Співпраця
    Приклади API
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Real Time
    Security
    Web3 Гаманець
    Магазин
    Інтеграція платежів
    PaymentConductor
    Інтеграція WayForPay
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Науковий редактор
    Система локалей
    Безпека та відповідність
    NFT Маркетплейс
    Система Стейкінга Токенів
    Паттерни Оптимізації Продуктивності
    Мобільний Досвід
    API адміністратора
    Code Style
    Performance
    Тестування
    Розгортання
    Налагодження
    Співпраця
    Приклади API
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)
    Real Time
    Security
    Web3 Гаманець
    Магазин
    Інтеграція платежів
    PaymentConductor
    Інтеграція WayForPay
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Науковий редактор
    Система локалей
    Безпека та відповідність
    NFT Маркетплейс
    Система Стейкінга Токенів
    Паттерни Оптимізації Продуктивності
    Мобільний Досвід
    API адміністратора
    Code Style
    Performance
    Тестування
    Розгортання
    Налагодження
    Співпраця
    Приклади API
    ringdom.org — база LegioX
    Код — ліцензія MIT (GitHub)

    Push-сповіщення через FCM (Ring)

    Ring Platform зберігає FCM-токени в основній базі даних (PostgreSQL або Firestore залежно від режиму бекенду) — по одному запису на користувача та пристрій. React-додатки реєструють токени через Server Action; інші клієнти використовують API з обмеженням частоти. Обидва шляхи викликають один і той самий серверний шар БД, тому поводження та безпека скрізь однакові.

    Огляд: логіка FCM у Ring

    «Ring-powered» FCM — це єдина, незалежна від бекенду схема:

    • Сховище токенів як джерело істини — Таблиця (або колекція) fcm_tokens зберігає всі токени реєстрації. Корисне навантаження зберігається в колонці JSONB data де застосовно (PostgreSQL). Окремого кешу немає; реєстром слугує БД.
    • Один рядок на пристрій і користувача — Складне унікальне обмеження по (user_id, device_fingerprint) дає один запис на пристрій. Значення токена не унікальне, тому при ротації FCM-токена оновлюється той самий рядок, а не створюється дублікат.
    • React-додаток → Server Action — Основний шлях для браузера та React Native web — Server Action upsertFcmToken. Ідентифікатор користувача сервер бере лише з auth(); клієнт його не передає.
    • Інші клієнти → API — Мобільні додатки або зовнішні сервіси викликають POST /api/notifications/fcm/register з тим самим тілом запиту. Цей endpoint обмежений по частоті на користувача (наприклад, 10 запитів на хвилину).
    • Життєвий цикл у даних — У кожному рядку зберігаються status (active | stale | invalid) та invalidatedAt. Реактивне очищення спрацьовує при помилках FCM по токену; за розкладом позначаються застарілі токени та за потреби виконується жорстке видалення.
    • Режим бекенду — Сховище токенів не прив’язане до конкретного бекенду. BackendSelector направляє запити по DB_BACKEND_MODE у PostgreSQL (наприклад k8s-postgres-fcm, supabase-fcm) або Firestore (firebase-full). Один код; розгалужень у Server Action чи API немає.
    Реєстрація та доставка FCM у Ring

    Push-сповіщення через FCM (Ring)

    Ring Platform зберігає FCM-токени в основній базі даних (PostgreSQL або Firestore залежно від режиму бекенду) — по одному запису на користувача та пристрій. React-додатки реєструють токени через Server Action; інші клієнти використовують API з обмеженням частоти. Обидва шляхи викликають один і той самий серверний шар БД, тому поводження та безпека скрізь однакові.

    Огляд: логіка FCM у Ring

    «Ring-powered» FCM — це єдина, незалежна від бекенду схема:

    • Сховище токенів як джерело істини — Таблиця (або колекція) fcm_tokens зберігає всі токени реєстрації. Корисне навантаження зберігається в колонці JSONB data де застосовно (PostgreSQL). Окремого кешу немає; реєстром слугує БД.
    • Один рядок на пристрій і користувача — Складне унікальне обмеження по (user_id, device_fingerprint) дає один запис на пристрій. Значення токена не унікальне, тому при ротації FCM-токена оновлюється той самий рядок, а не створюється дублікат.
    • React-додаток → Server Action — Основний шлях для браузера та React Native web — Server Action upsertFcmToken. Ідентифікатор користувача сервер бере лише з auth(); клієнт його не передає.
    • Інші клієнти → API — Мобільні додатки або зовнішні сервіси викликають POST /api/notifications/fcm/register з тим самим тілом запиту. Цей endpoint обмежений по частоті на користувача (наприклад, 10 запитів на хвилину).
    • Життєвий цикл у даних — У кожному рядку зберігаються status (active | stale | invalid) та invalidatedAt. Реактивне очищення спрацьовує при помилках FCM по токену; за розкладом позначаються застарілі токени та за потреби виконується жорстке видалення.
    • Режим бекенду — Сховище токенів не прив’язане до конкретного бекенду. BackendSelector направляє запити по DB_BACKEND_MODE у PostgreSQL (наприклад k8s-postgres-fcm, supabase-fcm) або Firestore (firebase-full). Один код; розгалужень у Server Action чи API немає.
    Реєстрація та доставка FCM у Ring

    Push-сповіщення через FCM (Ring)

    Ring Platform зберігає FCM-токени в основній базі даних (PostgreSQL або Firestore залежно від режиму бекенду) — по одному запису на користувача та пристрій. React-додатки реєструють токени через Server Action; інші клієнти використовують API з обмеженням частоти. Обидва шляхи викликають один і той самий серверний шар БД, тому поводження та безпека скрізь однакові.

    Огляд: логіка FCM у Ring

    «Ring-powered» FCM — це єдина, незалежна від бекенду схема:

    • Сховище токенів як джерело істини — Таблиця (або колекція) fcm_tokens зберігає всі токени реєстрації. Корисне навантаження зберігається в колонці JSONB data де застосовно (PostgreSQL). Окремого кешу немає; реєстром слугує БД.
    • Один рядок на пристрій і користувача — Складне унікальне обмеження по (user_id, device_fingerprint) дає один запис на пристрій. Значення токена не унікальне, тому при ротації FCM-токена оновлюється той самий рядок, а не створюється дублікат.
    • React-додаток → Server Action — Основний шлях для браузера та React Native web — Server Action upsertFcmToken. Ідентифікатор користувача сервер бере лише з auth(); клієнт його не передає.
    • Інші клієнти → API — Мобільні додатки або зовнішні сервіси викликають POST /api/notifications/fcm/register з тим самим тілом запиту. Цей endpoint обмежений по частоті на користувача (наприклад, 10 запитів на хвилину).
    • Життєвий цикл у даних — У кожному рядку зберігаються status (active | stale | invalid) та invalidatedAt. Реактивне очищення спрацьовує при помилках FCM по токену; за розкладом позначаються застарілі токени та за потреби виконується жорстке видалення.
    • Режим бекенду — Сховище токенів не прив’язане до конкретного бекенду. BackendSelector направляє запити по DB_BACKEND_MODE у PostgreSQL (наприклад k8s-postgres-fcm, supabase-fcm) або Firestore (firebase-full). Один код; розгалужень у Server Action чи API немає.
    Реєстрація та доставка FCM у Ring

    Передумови

    • Аутентифікація — Виконано вхід (сесія Auth.js). Реєстрація токена завжди прив’язана до аутентифікованого користувача; сервер не довіряє ідентифікатору користувача від клієнта.
    • Web Push (браузер) — HTTPS (або localhost під час розробки), підтримка Web Push у браузері, зареєстрований service worker та Firebase client SDK. Файл service worker зазвичай доступний за /firebase-messaging-sw.js.
    • API-клієнти — Діюча сесія (cookie або Bearer) та той самий контракт тіла запиту (token, deviceFingerprint, deviceInfo).

    React-додаток: шлях через Server Action

    Використовуйте Server Action як основний спосіб реєстрації та оновлення FCM-токенів з будь-якого React- або Next.js-клієнта. Цей шлях не обмежений по частоті, на відміну від API, і ідентифікатор користувача лишається лише на сервері.

    Основний шлях

    React-додаткам слід використовувати Server Action як основний шлях. API призначено для інших клієнтів і обмежений по частоті.

    Передумови

    • Аутентифікація — Виконано вхід (сесія Auth.js). Реєстрація токена завжди прив’язана до аутентифікованого користувача; сервер не довіряє ідентифікатору користувача від клієнта.
    • Web Push (браузер) — HTTPS (або localhost під час розробки), підтримка Web Push у браузері, зареєстрований service worker та Firebase client SDK. Файл service worker зазвичай доступний за /firebase-messaging-sw.js.
    • API-клієнти — Діюча сесія (cookie або Bearer) та той самий контракт тіла запиту (token, deviceFingerprint, deviceInfo).

    React-додаток: шлях через Server Action

    Використовуйте Server Action як основний спосіб реєстрації та оновлення FCM-токенів з будь-якого React- або Next.js-клієнта. Цей шлях не обмежений по частоті, на відміну від API, і ідентифікатор користувача лишається лише на сервері.

    Основний шлях

    React-додаткам слід використовувати Server Action як основний шлях. API призначено для інших клієнтів і обмежений по частоті.

    Передумови

    • Аутентифікація — Виконано вхід (сесія Auth.js). Реєстрація токена завжди прив’язана до аутентифікованого користувача; сервер не довіряє ідентифікатору користувача від клієнта.
    • Web Push (браузер) — HTTPS (або localhost під час розробки), підтримка Web Push у браузері, зареєстрований service worker та Firebase client SDK. Файл service worker зазвичай доступний за /firebase-messaging-sw.js.
    • API-клієнти — Діюча сесія (cookie або Bearer) та той самий контракт тіла запиту (token, deviceFingerprint, deviceInfo).

    React-додаток: шлях через Server Action

    Використовуйте Server Action як основний спосіб реєстрації та оновлення FCM-токенів з будь-якого React- або Next.js-клієнта. Цей шлях не обмежений по частоті, на відміну від API, і ідентифікатор користувача лишається лише на сервері.

    Основний шлях

    React-додаткам слід використовувати Server Action як основний шлях. API призначено для інших клієнтів і обмежений по частоті.

    1

    Отримайте стабільний device fingerprint

    Згенеруйте або завантажте стабільне значення (наприклад, crypto.randomUUID() з localStorage) і використовуйте його при кожному завантаженні та при оновленні токена. Сервер за парою (user_id, device_fingerprint) виконує upsert одного рядка на пристрій.

    2

    Запросіть дозвіл і отримайте FCM-токен

    У компоненті з 'use client' (наприклад усередині провайдера сповіщень) викличте Notification.requestPermission(). Після дозволу викличте getToken(messaging, { vapidKey }) з Firebase Messaging SDK. Не викликайте getToken() у Server Components — у них немає контексту браузера.

    3

    Викличте Server Action для реєстрації токена

    Викличте upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер бере його з auth().

    4

    Обробка оновлення токена

    Коли Firebase SDK видає новий токен (наприклад через onTokenRefresh), знову викличте той самий Server Action з новим токеном і тим самим deviceFingerprint. Спільний шар БД оновить існуючий рядок для цього користувача та пристрою.

    1

    Отримайте стабільний device fingerprint

    Згенеруйте або завантажте стабільне значення (наприклад, crypto.randomUUID() з localStorage) і використовуйте його при кожному завантаженні та при оновленні токена. Сервер за парою (user_id, device_fingerprint) виконує upsert одного рядка на пристрій.

    2

    Запросіть дозвіл і отримайте FCM-токен

    У компоненті з 'use client' (наприклад усередині провайдера сповіщень) викличте Notification.requestPermission(). Після дозволу викличте getToken(messaging, { vapidKey }) з Firebase Messaging SDK. Не викликайте getToken() у Server Components — у них немає контексту браузера.

    3

    Викличте Server Action для реєстрації токена

    Викличте upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер бере його з auth().

    4

    Обробка оновлення токена

    Коли Firebase SDK видає новий токен (наприклад через onTokenRefresh), знову викличте той самий Server Action з новим токеном і тим самим deviceFingerprint. Спільний шар БД оновить існуючий рядок для цього користувача та пристрою.

    1

    Отримайте стабільний device fingerprint

    Згенеруйте або завантажте стабільне значення (наприклад, crypto.randomUUID() з localStorage) і використовуйте його при кожному завантаженні та при оновленні токена. Сервер за парою (user_id, device_fingerprint) виконує upsert одного рядка на пристрій.

    2

    Запросіть дозвіл і отримайте FCM-токен

    У компоненті з 'use client' (наприклад усередині провайдера сповіщень) викличте Notification.requestPermission(). Після дозволу викличте getToken(messaging, { vapidKey }) з Firebase Messaging SDK. Не викликайте getToken() у Server Components — у них немає контексту браузера.

    3

    Викличте Server Action для реєстрації токена

    Викличте upsertFcmToken({ token, deviceFingerprint, deviceInfo, platform: 'web' }). Не передавайте userId; сервер бере його з auth().

    4

    Обробка оновлення токена

    Коли Firebase SDK видає новий токен (наприклад через onTokenRefresh), знову викличте той самий Server Action з новим токеном і тим самим deviceFingerprint. Спільний шар БД оновить існуючий рядок для цього користувача та пристрою.

    Приклад: реєстрація та оновлення токена в клієнтському компоненті.

    Приклад: реєстрація FCM-токена в клієнтському компоненті
    typescript

    Інші клієнти: API

    Мобільні додатки та інші клієнти без React реєструють токени через той самий контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тіло запиту:

    • token (string, обов’язково) — FCM registration token з клієнтського SDK.
    • deviceFingerprint (string, обов’язково) — Стабільний ідентифікатор пристрою (наприклад UUID у local storage). Не більше 128 символів; лише літери, цифри, дефіс та підкреслення.
    • deviceInfo (object, необов’язково) — Довільні метадані пристрою (наприклад platform, userAgent).

    Аутентифікація: Обов’язкова (session cookie або Bearer). Сервер використовує ідентифікатор аутентифікованого користувача; не передавайте userId у тілі.

    Відповіді:

    • 200 — { "success": true }
    • 400 — Помилка валідації (наприклад відсутній або невірний deviceFingerprint)
    • 401 — Не аутентифіковано
    • 429 — Перевищено ліміт запитів (заголовок Retry-After)
    • 500 — Помилка сервера

    Приклад: реєстрація та оновлення токена в клієнтському компоненті.

    Приклад: реєстрація FCM-токена в клієнтському компоненті
    typescript

    Інші клієнти: API

    Мобільні додатки та інші клієнти без React реєструють токени через той самий контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тіло запиту:

    • token (string, обов’язково) — FCM registration token з клієнтського SDK.
    • deviceFingerprint (string, обов’язково) — Стабільний ідентифікатор пристрою (наприклад UUID у local storage). Не більше 128 символів; лише літери, цифри, дефіс та підкреслення.
    • deviceInfo (object, необов’язково) — Довільні метадані пристрою (наприклад platform, userAgent).

    Аутентифікація: Обов’язкова (session cookie або Bearer). Сервер використовує ідентифікатор аутентифікованого користувача; не передавайте userId у тілі.

    Відповіді:

    • 200 — { "success": true }
    • 400 — Помилка валідації (наприклад відсутній або невірний deviceFingerprint)
    • 401 — Не аутентифіковано
    • 429 — Перевищено ліміт запитів (заголовок Retry-After)
    • 500 — Помилка сервера

    Приклад: реєстрація та оновлення токена в клієнтському компоненті.

    Приклад: реєстрація FCM-токена в клієнтському компоненті
    typescript

    Інші клієнти: API

    Мобільні додатки та інші клієнти без React реєструють токени через той самий контракт по HTTP.

    Endpoint: POST /api/notifications/fcm/register

    Тіло запиту:

    • token (string, обов’язково) — FCM registration token з клієнтського SDK.
    • deviceFingerprint (string, обов’язково) — Стабільний ідентифікатор пристрою (наприклад UUID у local storage). Не більше 128 символів; лише літери, цифри, дефіс та підкреслення.
    • deviceInfo (object, необов’язково) — Довільні метадані пристрою (наприклад platform, userAgent).

    Аутентифікація: Обов’язкова (session cookie або Bearer). Сервер використовує ідентифікатор аутентифікованого користувача; не передавайте userId у тілі.

    Відповіді:

    • 200 — { "success": true }
    • 400 — Помилка валідації (наприклад відсутній або невірний deviceFingerprint)
    • 401 — Не аутентифіковано
    • 429 — Перевищено ліміт запитів (заголовок Retry-After)
    • 500 — Помилка сервера
    Ліміт запитів

    Цей endpoint обмежений по частоті на користувача (наприклад 10 запитів на хвилину). Використовуйте Server Action з React-додатків, щоб не витрачати ліміт API.

    Приклад з cURL (підставте cookie сесії або Bearer згідно з вашою налаштуванням auth):

    Приклад: реєстрація токена через API
    bash

    Змінні середовища

    Налаштування розділені так, щоб на клієнт потрапляли лише публічні та безпечні значення.

    Безпека

    Приватний ключ VAPID та облікові дані Firebase service account не повинні потрапляти на клієнт. Зберігайте їх лише на сервері.

    Ліміт запитів

    Цей endpoint обмежений по частоті на користувача (наприклад 10 запитів на хвилину). Використовуйте Server Action з React-додатків, щоб не витрачати ліміт API.

    Приклад з cURL (підставте cookie сесії або Bearer згідно з вашою налаштуванням auth):

    Приклад: реєстрація токена через API
    bash

    Змінні середовища

    Налаштування розділені так, щоб на клієнт потрапляли лише публічні та безпечні значення.

    Безпека

    Приватний ключ VAPID та облікові дані Firebase service account не повинні потрапляти на клієнт. Зберігайте їх лише на сервері.

    Ліміт запитів

    Цей endpoint обмежений по частоті на користувача (наприклад 10 запитів на хвилину). Використовуйте Server Action з React-додатків, щоб не витрачати ліміт API.

    Приклад з cURL (підставте cookie сесії або Bearer згідно з вашою налаштуванням auth):

    Приклад: реєстрація токена через API
    bash

    Змінні середовища

    Налаштування розділені так, щоб на клієнт потрапляли лише публічні та безпечні значення.

    Безпека

    Приватний ключ VAPID та облікові дані Firebase service account не повинні потрапляти на клієнт. Зберігайте їх лише на сервері.

    ПризначенняЗмінніДе
    Клієнт (браузер / додаток)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезпечні для клієнта; використовуються Firebase client SDK та service worker
    Сервер (сховище токенів, відправка FCM)FIREBASE_SERVICE_ACCOUNT_* або шлях до JSON сервісного акаунта; DB_BACKEND_MODE (наприклад k8s-postgres-fcm, firebase-full, supabase-fcm)Лише сервер; використовуються BackendSelector та Firebase Admin SDK
    ПризначенняЗмінніДе
    Клієнт (браузер / додаток)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезпечні для клієнта; використовуються Firebase client SDK та service worker
    Сервер (сховище токенів, відправка FCM)FIREBASE_SERVICE_ACCOUNT_* або шлях до JSON сервісного акаунта; DB_BACKEND_MODE (наприклад k8s-postgres-fcm, firebase-full, supabase-fcm)Лише сервер; використовуються BackendSelector та Firebase Admin SDK
    ПризначенняЗмінніДе
    Клієнт (браузер / додаток)NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_VAPID_KEYБезпечні для клієнта; використовуються Firebase client SDK та service worker
    Сервер (сховище токенів, відправка FCM)FIREBASE_SERVICE_ACCOUNT_* або шлях до JSON сервісного акаунта; DB_BACKEND_MODE (наприклад k8s-postgres-fcm, firebase-full, supabase-fcm)Лише сервер; використовуються BackendSelector та Firebase Admin SDK

    Зняття реєстрації та вихід

    При виході або вимкненні push користувачем:

    • Браузер / React — Викличте deleteToken(messaging) з Firebase client SDK, потім зніміть реєстрацію на сервері: DELETE /api/notifications/fcm/register з тілом { "deviceFingerprint": "same-uuid-as-register" }. Ідемпотентно; можна викликати навіть якщо запис уже видалено або інвалідовано.
    • Інші клієнти — Той самий запит DELETE з тим самим deviceFingerprint, що й при реєстрації.

    Сервер позначає рядок як status: 'invalid' і встановлює invalidatedAt; доставка на цей токен припиняється.

    Усунення несправностей

    Зняття реєстрації та вихід

    При виході або вимкненні push користувачем:

    • Браузер / React — Викличте deleteToken(messaging) з Firebase client SDK, потім зніміть реєстрацію на сервері: DELETE /api/notifications/fcm/register з тілом { "deviceFingerprint": "same-uuid-as-register" }. Ідемпотентно; можна викликати навіть якщо запис уже видалено або інвалідовано.
    • Інші клієнти — Той самий запит DELETE з тим самим deviceFingerprint, що й при реєстрації.

    Сервер позначає рядок як status: 'invalid' і встановлює invalidatedAt; доставка на цей токен припиняється.

    Усунення несправностей

    Зняття реєстрації та вихід

    При виході або вимкненні push користувачем:

    • Браузер / React — Викличте deleteToken(messaging) з Firebase client SDK, потім зніміть реєстрацію на сервері: DELETE /api/notifications/fcm/register з тілом { "deviceFingerprint": "same-uuid-as-register" }. Ідемпотентно; можна викликати навіть якщо запис уже видалено або інвалідовано.
    • Інші клієнти — Той самий запит DELETE з тим самим deviceFingerprint, що й при реєстрації.

    Сервер позначає рядок як status: 'invalid' і встановлює invalidatedAt; доставка на цей токен припиняється.

    Усунення несправностей

    ПроблемаПричинаДія
    Permission denied або токен не отриманоКористувач відхилив сповіщення або дозвіл ще не запитувалиЗапросіть дозвіл перед викликом getToken(); обробляйте permission === 'denied' в інтерфейсі
    429 при реєстраціїПеревищено ліміт запитівВикористовуйте Server Action з React; для API-клієнтів дотримуйтесь Retry-After та зменшіть частоту реєстрації
    Невірний deviceFingerprintПомилка валідаціїРядок довжиною 1–128 символів: лише літери, цифри, дефіс та підкреслення
    401 при реєстраціїНе аутентифікованоПереконайтесь, що надсилається діюча сесія (cookie або Bearer); не передавайте userId у тілі
    ПроблемаПричинаДія
    Permission denied або токен не отриманоКористувач відхилив сповіщення або дозвіл ще не запитувалиЗапросіть дозвіл перед викликом getToken(); обробляйте permission === 'denied' в інтерфейсі
    429 при реєстраціїПеревищено ліміт запитівВикористовуйте Server Action з React; для API-клієнтів дотримуйтесь Retry-After та зменшіть частоту реєстрації
    Невірний deviceFingerprintПомилка валідаціїРядок довжиною 1–128 символів: лише літери, цифри, дефіс та підкреслення
    401 при реєстраціїНе аутентифікованоПереконайтесь, що надсилається діюча сесія (cookie або Bearer); не передавайте userId у тілі
    ПроблемаПричинаДія
    Permission denied або токен не отриманоКористувач відхилив сповіщення або дозвіл ще не запитувалиЗапросіть дозвіл перед викликом getToken(); обробляйте permission === 'denied' в інтерфейсі
    429 при реєстраціїПеревищено ліміт запитівВикористовуйте Server Action з React; для API-клієнтів дотримуйтесь Retry-After та зменшіть частоту реєстрації
    Невірний deviceFingerprintПомилка валідаціїРядок довжиною 1–128 символів: лише літери, цифри, дефіс та підкреслення
    401 при реєстраціїНе аутентифікованоПереконайтесь, що надсилається діюча сесія (cookie або Bearer); не передавайте userId у тілі

    Див. також

    • Сповіщення — Типи сповіщень, канали та налаштування
    • Схема та міграції для fcm_tokens (наприклад data/schema.sql, data/migrations/fcm_jsonb_schema.sql) у вашому клоні Ring
    • Truth lens FCM-фахівця (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — життєвий цикл токенів, реактивне очищення та шлях відправки

    Див. також

    • Сповіщення — Типи сповіщень, канали та налаштування
    • Схема та міграції для fcm_tokens (наприклад data/schema.sql, data/migrations/fcm_jsonb_schema.sql) у вашому клоні Ring
    • Truth lens FCM-фахівця (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — життєвий цикл токенів, реактивне очищення та шлях відправки

    Див. також

    • Сповіщення — Типи сповіщень, канали та налаштування
    • Схема та міграції для fcm_tokens (наприклад data/schema.sql, data/migrations/fcm_jsonb_schema.sql) у вашому клоні Ring
    • Truth lens FCM-фахівця (AI-LEGIOX/legiox-truth-lens/fcm-specialist.json) — життєвий цикл токенів, реактивне очищення та шлях відправки