ВозможностиОрганизации
Документация
    Ring Platform

    Децентрализованное самостроящееся будущее

    Войти
    Организации
    Возможности
    Магазин
    Документация
    Концепции платформы
    RING ЭкономикаSonoratek LLCГлобальное влияниеAI встречает Web3
    Начать
    Быстрый стартКалькуляторДорожная карта
    Конфиденциальность|Контакты
    v1.104.26|Sonoratek LLC

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    WalletConductor
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    AI Matcher
    Real-Time Messaging
    Peer Games
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    Базовая настройка
    White Label
    Custom Branding
    Интеграция Web3
    Реальные Проекты
    Advanced Features
    Кастомизация
    Быстрый старт — ваш первый клон Ring
    Руководство по кастомизации
    Vertical Presets (SSOT)
    Руководство по Ringization
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Интеграция платёжного шлюза
    Референсные деплои Ring
    Конфигурация проекта
    Публичные переменные окружения
    Секреты Order Lab
    Project ID WalletConnect (Reown Cloud)
    Поддерживаемые сервисы
    Вики NODUS (знания проекта)
    Плейбук конфигурации
    Web3
    Token launch jurisdictions
    Кошелёк
    Советы по безопасности кошелька
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Развёртывание на собственном сервере
    Vercel
    Docker
    Конфигурация Окружения
    Мониторинг и аналитика
    Оптимизация производительности
    Резервное копирование и восстановление
    Архитектура
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    Архитектура PaymentConductor
    Wallet Conductor
    Архитектура News Kingdom
    Бекенд Сервисы
    Интеграция Firebase
    Разработка
    Ring MCP Server
    OSS и enterprise

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Архитектура News Kingdom

    Используйте вкладки Основатель / Разработчик на боковой панели документации, чтобы отфильтровать эту страницу. Основатели видят бизнес-процесс и настройки для оператора. Разработчики видят сервисы, маршруты, переменные окружения и локальный тестовый прогон.

    News Kingdom является слоем продвижения поверх модуля новостей Ring. Участники с ролью member или выше пишут статьи, которые размещаются в их личном пространстве по адресу /{username}/{slug}. После этого автор может попросить место в главной ленте /news. Ring оценивает статью, предлагает автору оплатить цену, которая зависит от оценки, и отправляет статью администраторам платформы в Telegram для окончательного решения «да» или «нет».

    Каждая заявка на продвижение проходит через одно поле статьи, mainPageStatus:

    ЭтапЧто происходитmainPageStatus
    ПодачаАвтор просит разместить статью на главной страницеsubmitted
    ОценкаAI или эвристика оценивает этичность, спам, дубликаты и ценностьai_scored
    Жёсткая блокировкаЭтичность слишком низкая, риск спама или дубликата слишком высокийpublished_blog_only
    ОплатаЦена назначена, открывается checkout PaymentConductorpayment_pending
    ОплаченоWebhook подтверждает оплату, администраторы получают карточку в Telegramawaiting_admin_approval
    ОдобреноСтатья появляется в главной ленте для всего сайтаpublished_main
    ОтклоненоАдминистратор отказывает. Статья остаётся в блоге автораrejected

    Почему это важно для вашего клона

    • Участники приносят контент и платят за охват. Вы ведёте издание без найма редакции. Авторы, которые хотят попасть на первую полосу, платят за это, а последнее редакционное слово остаётся за вами.
    • Плохое отсеивается первым. Спам, дубликаты и посты с низкой этичностью останавливает оценка ещё до оплаты и до того, как администратор потратит на них время.
    • Вы одобряете с телефона. Каждая оплаченная заявка приходит вашим администраторам сообщением в Telegram с кнопками Approve, Reject, View и Counter.
    • Хорошие материалы окупаются. Когда администратор одобряет статью участника, Ring ставит в очередь начисление награды автору и запускает переводы на другие языки вашего клона.

    Блоги участников

    Где статья живёт до продвижения: личный URL автора.

    Модуль новостей

    Главная лента, категории, лайки и редактор, которым пользуются авторы.

    PaymentConductor

    Карта модулей (проверено в ring/web)

    АспектПуть
    Машина состояний, аудит, одобрение и отклонениеfeatures/news/services/news-promotion-workflow.ts
    Оценка через OpenRouter и ценаfeatures/news/services/news-scoring-service.ts
    Эвристика дубликатовfeatures/news/services/news-duplicate-check.ts
    Фасад checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Обработчики webhook оплатыlib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Карточка и клавиатура администратора в Telegramfeatures/news/services/news-telegram-approval.ts
    Обработка callback в Telegram (подключено из )

    Известные пробелы

    Связанная документация

    Related documentation

    Member Blogs

    Тот же процесс: где статья живёт до и после запроса на продвижение.

    News Module

    Предпосылка: модуль новостей, редактор и главная лента, куда News Kingdom продвигает статьи.

    PaymentConductor architecture

    Зависимость: как маршрутизируются checkout news_promotion и его webhooks.

    Manage via Telegram

    См. также: бот администратора с кнопками Approve, Reject и Counter.

    1. Документация
    2. /Архитектура
    3. /Архитектура News Kingdom

    Обновлено 1 окт. 2026 г.6 мин прослушивания

    Архитектура News Kingdom

    Используйте вкладки Основатель / Разработчик на боковой панели документации, чтобы отфильтровать эту страницу. Основатели видят бизнес-процесс и настройки для оператора. Разработчики видят сервисы, маршруты, переменные окружения и локальный тестовый прогон.

    News Kingdom является слоем продвижения поверх модуля новостей Ring. Участники с ролью member или выше пишут статьи, которые размещаются в их личном пространстве по адресу /{username}/{slug}. После этого автор может попросить место в главной ленте /news. Ring оценивает статью, предлагает автору оплатить цену, которая зависит от оценки, и отправляет статью администраторам платформы в Telegram для окончательного решения «да» или «нет».

    Каждая заявка на продвижение проходит через одно поле статьи, mainPageStatus:

    ЭтапЧто происходитmainPageStatus
    ПодачаАвтор просит разместить статью на главной страницеsubmitted
    ОценкаAI или эвристика оценивает этичность, спам, дубликаты и ценностьai_scored
    Жёсткая блокировкаЭтичность слишком низкая, риск спама или дубликата слишком высокийpublished_blog_only
    ОплатаЦена назначена, открывается checkout PaymentConductorpayment_pending
    ОплаченоWebhook подтверждает оплату, администраторы получают карточку в Telegramawaiting_admin_approval
    ОдобреноСтатья появляется в главной ленте для всего сайтаpublished_main
    ОтклоненоАдминистратор отказывает. Статья остаётся в блоге автораrejected

    Почему это важно для вашего клона

    • Участники приносят контент и платят за охват. Вы ведёте издание без найма редакции. Авторы, которые хотят попасть на первую полосу, платят за это, а последнее редакционное слово остаётся за вами.
    • Плохое отсеивается первым. Спам, дубликаты и посты с низкой этичностью останавливает оценка ещё до оплаты и до того, как администратор потратит на них время.
    • Вы одобряете с телефона. Каждая оплаченная заявка приходит вашим администраторам сообщением в Telegram с кнопками Approve, Reject, View и Counter.
    • Хорошие материалы окупаются. Когда администратор одобряет статью участника, Ring ставит в очередь начисление награды автору и запускает переводы на другие языки вашего клона.

    Блоги участников

    Где статья живёт до продвижения: личный URL автора.

    Модуль новостей

    Главная лента, категории, лайки и редактор, которым пользуются авторы.

    PaymentConductor

    Карта модулей (проверено в ring/web)

    АспектПуть
    Машина состояний, аудит, одобрение и отклонениеfeatures/news/services/news-promotion-workflow.ts
    Оценка через OpenRouter и ценаfeatures/news/services/news-scoring-service.ts
    Эвристика дубликатовfeatures/news/services/news-duplicate-check.ts
    Фасад checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Обработчики webhook оплатыlib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Карточка и клавиатура администратора в Telegramfeatures/news/services/news-telegram-approval.ts
    Обработка callback в Telegram (подключено из )

    Известные пробелы

    Связанная документация

    Related documentation

    Member Blogs

    Тот же процесс: где статья живёт до и после запроса на продвижение.

    News Module

    Предпосылка: модуль новостей, редактор и главная лента, куда News Kingdom продвигает статьи.

    PaymentConductor architecture

    Зависимость: как маршрутизируются checkout news_promotion и его webhooks.

    Manage via Telegram

    См. также: бот администратора с кнопками Approve, Reject и Counter.

    1. Документация
    2. /Архитектура
    3. /Архитектура News Kingdom

    Обновлено 1 окт. 2026 г.6 мин прослушивания

    Архитектура News Kingdom

    Используйте вкладки Основатель / Разработчик на боковой панели документации, чтобы отфильтровать эту страницу. Основатели видят бизнес-процесс и настройки для оператора. Разработчики видят сервисы, маршруты, переменные окружения и локальный тестовый прогон.

    News Kingdom является слоем продвижения поверх модуля новостей Ring. Участники с ролью member или выше пишут статьи, которые размещаются в их личном пространстве по адресу /{username}/{slug}. После этого автор может попросить место в главной ленте /news. Ring оценивает статью, предлагает автору оплатить цену, которая зависит от оценки, и отправляет статью администраторам платформы в Telegram для окончательного решения «да» или «нет».

    Каждая заявка на продвижение проходит через одно поле статьи, mainPageStatus:

    ЭтапЧто происходитmainPageStatus
    ПодачаАвтор просит разместить статью на главной страницеsubmitted
    ОценкаAI или эвристика оценивает этичность, спам, дубликаты и ценностьai_scored
    Жёсткая блокировкаЭтичность слишком низкая, риск спама или дубликата слишком высокийpublished_blog_only
    ОплатаЦена назначена, открывается checkout PaymentConductorpayment_pending
    ОплаченоWebhook подтверждает оплату, администраторы получают карточку в Telegramawaiting_admin_approval
    ОдобреноСтатья появляется в главной ленте для всего сайтаpublished_main
    ОтклоненоАдминистратор отказывает. Статья остаётся в блоге автораrejected

    Почему это важно для вашего клона

    • Участники приносят контент и платят за охват. Вы ведёте издание без найма редакции. Авторы, которые хотят попасть на первую полосу, платят за это, а последнее редакционное слово остаётся за вами.
    • Плохое отсеивается первым. Спам, дубликаты и посты с низкой этичностью останавливает оценка ещё до оплаты и до того, как администратор потратит на них время.
    • Вы одобряете с телефона. Каждая оплаченная заявка приходит вашим администраторам сообщением в Telegram с кнопками Approve, Reject, View и Counter.
    • Хорошие материалы окупаются. Когда администратор одобряет статью участника, Ring ставит в очередь начисление награды автору и запускает переводы на другие языки вашего клона.

    Блоги участников

    Где статья живёт до продвижения: личный URL автора.

    Модуль новостей

    Главная лента, категории, лайки и редактор, которым пользуются авторы.

    PaymentConductor

    Карта модулей (проверено в ring/web)

    АспектПуть
    Машина состояний, аудит, одобрение и отклонениеfeatures/news/services/news-promotion-workflow.ts
    Оценка через OpenRouter и ценаfeatures/news/services/news-scoring-service.ts
    Эвристика дубликатовfeatures/news/services/news-duplicate-check.ts
    Фасад checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Обработчики webhook оплатыlib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Карточка и клавиатура администратора в Telegramfeatures/news/services/news-telegram-approval.ts
    Обработка callback в Telegram (подключено из )

    Известные пробелы

    Связанная документация

    Related documentation

    Member Blogs

    Тот же процесс: где статья живёт до и после запроса на продвижение.

    News Module

    Предпосылка: модуль новостей, редактор и главная лента, куда News Kingdom продвигает статьи.

    PaymentConductor architecture

    Зависимость: как маршрутизируются checkout news_promotion и его webhooks.

    Manage via Telegram

    См. также: бот администратора с кнопками Approve, Reject и Counter.

    1. Документация
    2. /Архитектура
    3. /Архитектура News Kingdom

    Обновлено 1 окт. 2026 г.6 мин прослушивания

    Checkout, который взимает плату за продвижение через настроенный вами платёжный процессор.

    Управление через Telegram

    Бот администратора с кнопками одобрения.

    От блога участника до главной страницы

    Типичные сценарии

    1. Городская газета. Городской клон позволяет местным участникам публиковаться в своих блогах и берёт небольшую плату за материалы на первой полосе. Администраторы одобряют лучшие из них в Telegram.
    2. Экспертная сеть. Профессиональный клон держит высокую планку ценности: сильные статьи получают низкую цену, а слабые становятся слишком дорогими.
    3. Модерируемый центр кампаний. Клон общественного движения опирается на правила жёсткой блокировки, поэтому спам никогда не попадает в очередь администратора.

    Настройки для оператора

    Вы задаёте цены в гривнах через переменные окружения сервера. Если они не заданы, действуют такие значения по умолчанию:

    ПараметрПо умолчаниюЭффект
    Базовая цена50 UAHМинимальная цена для статьи с высокой ценностью
    Масштаб2000 UAHНасколько растёт цена при снижении ценности
    Максимум5000 UAHВерхний предел цены
    Порог низкой ценностиценность ниже 0.25Цена поднимается минимум до 4999 UAH
    Встречное предложение администратора+25%Кнопка Counter в Telegram задаёт новую сумму, которую должен оплатить автор
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Интерфейс продвижения для участникаfeatures/news/components/news-promotion-panel.tsx на /my-news
    Типы статусов и полейfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Маппер строк JSONBlib/news/map-news-document.ts
    Бренд и абсолютные URLlib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Маршруты

    Метод и путьАутентификацияНазначение
    POST /api/news/promotion/submitСессия, только автор статьиОтмечает promoteToMainPage, оценивает, открывает checkout
    PATCH /api/news/promotion/submitЗаголовок x-news-promotion-secretDev или тест: отметить как оплаченное и уведомить администраторов
    POST /api/payments/{wayforpay,stripe,paypal}/webhookПодпись процессораКаноническое подтверждение оплаты
    POST /api/news/promotion/wayforpay-webhookPayload процессораУстаревший делегат к каноническому webhook WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Сервисный токен (withMcpGuard)Операции агентов и MCP над тем же процессом

    Правила оценки

    scoreNewsForMainPage() вызывает OpenRouter, когда задан OPENROUTER_API_KEY. Без ключа сохраняются эвристические значения по умолчанию (ethics 0.7, spam 0.2, merit 0.5) и записывается model: 'heuristic'.

    • Риск дубликата: 0.95, если у другой статьи такой же slug или siteWideSlug. 0.9, если у опубликованной статьи (среди первых 200) такой же заголовок.
    • Жёсткая блокировка: ethics < NEWS_ETHICS_MIN или spamRisk > NEWS_SPAM_MAX или duplicateRisk > NEWS_DUPLICATE_MAX. Результат: published_blog_only и никакого checkout.
    • Цена: clamp(base, max, base + (1 - merit) * scale). Ценность ниже NEWS_MERIT_SOFT_REJECT поднимает цену минимум до 4999. Низкая ценность не меняет статус.

    Переменные окружения

    Ни одного из ключей NEWS_* нет в env.local.template. Код читает их с такими значениями по умолчанию.

    ПеременнаяПо умолчаниюГде читается
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25оценка и процесс продвижения
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKне заданоnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORзапасной вариант PAYMENT_DEFAULT_PROCESSOR, затем wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETне заданоPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENне заданоОтветы на callback в Telegram

    Данные

    Все четыре таблицы используют документную модель JSONB (id, data jsonb, временные метки) в data/schema.sql (сплющенная v4.1.0): news, news_categories, news_likes, news_submission_audit. Каждый переход дописывает запись в data.mainPageStatusHistory и создаёт одну строку news_submission_audit. Файлы data/migrations/002_news_content_schema.sql и 003_news_kingdom_upgrade.sql носят исторический характер. Новые установки применяют только schema.sql.

    Побочные эффекты одобрения

    approveMainPagePublication() устанавливает status: 'published' и visibility: 'site-wide'. Для материалов, написанных пользователями, затем в очередь ставится enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) и запускается generateArticleTranslations(). Получатели в Telegram: пользователи с ролью администратора платформы и заполненным communication.telegramId.

    Локальный тестовый прогон

    1. 1

      Примените схему и создайте статью участника

      Примените data/schema.sql и войдите как пользователь с ролью member или выше. Создайте статью на /news/create. Она получает blogUsername и после публикации появляется по адресу /{username}/{slug}.

    2. 2

      Подайте статью на продвижение

      Ответ содержит status, aiScore и либо перенаправление, либо платёжные поля для checkout.

    3. 3

      Сымитируйте оплату в dev

    4. 4

      Одобрите

      Нажмите Approve на карточке в Telegram или вызовите POST /api/mcp/v1/news/<id>/approve с сервисным токеном. Проверьте, что mainPageStatus имеет значение published_main и что существует строка news_submission_audit.

    Checkout, который взимает плату за продвижение через настроенный вами платёжный процессор.

    Управление через Telegram

    Бот администратора с кнопками одобрения.

    От блога участника до главной страницы

    Типичные сценарии

    1. Городская газета. Городской клон позволяет местным участникам публиковаться в своих блогах и берёт небольшую плату за материалы на первой полосе. Администраторы одобряют лучшие из них в Telegram.
    2. Экспертная сеть. Профессиональный клон держит высокую планку ценности: сильные статьи получают низкую цену, а слабые становятся слишком дорогими.
    3. Модерируемый центр кампаний. Клон общественного движения опирается на правила жёсткой блокировки, поэтому спам никогда не попадает в очередь администратора.

    Настройки для оператора

    Вы задаёте цены в гривнах через переменные окружения сервера. Если они не заданы, действуют такие значения по умолчанию:

    ПараметрПо умолчаниюЭффект
    Базовая цена50 UAHМинимальная цена для статьи с высокой ценностью
    Масштаб2000 UAHНасколько растёт цена при снижении ценности
    Максимум5000 UAHВерхний предел цены
    Порог низкой ценностиценность ниже 0.25Цена поднимается минимум до 4999 UAH
    Встречное предложение администратора+25%Кнопка Counter в Telegram задаёт новую сумму, которую должен оплатить автор
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Интерфейс продвижения для участникаfeatures/news/components/news-promotion-panel.tsx на /my-news
    Типы статусов и полейfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Маппер строк JSONBlib/news/map-news-document.ts
    Бренд и абсолютные URLlib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Маршруты

    Метод и путьАутентификацияНазначение
    POST /api/news/promotion/submitСессия, только автор статьиОтмечает promoteToMainPage, оценивает, открывает checkout
    PATCH /api/news/promotion/submitЗаголовок x-news-promotion-secretDev или тест: отметить как оплаченное и уведомить администраторов
    POST /api/payments/{wayforpay,stripe,paypal}/webhookПодпись процессораКаноническое подтверждение оплаты
    POST /api/news/promotion/wayforpay-webhookPayload процессораУстаревший делегат к каноническому webhook WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Сервисный токен (withMcpGuard)Операции агентов и MCP над тем же процессом

    Правила оценки

    scoreNewsForMainPage() вызывает OpenRouter, когда задан OPENROUTER_API_KEY. Без ключа сохраняются эвристические значения по умолчанию (ethics 0.7, spam 0.2, merit 0.5) и записывается model: 'heuristic'.

    • Риск дубликата: 0.95, если у другой статьи такой же slug или siteWideSlug. 0.9, если у опубликованной статьи (среди первых 200) такой же заголовок.
    • Жёсткая блокировка: ethics < NEWS_ETHICS_MIN или spamRisk > NEWS_SPAM_MAX или duplicateRisk > NEWS_DUPLICATE_MAX. Результат: published_blog_only и никакого checkout.
    • Цена: clamp(base, max, base + (1 - merit) * scale). Ценность ниже NEWS_MERIT_SOFT_REJECT поднимает цену минимум до 4999. Низкая ценность не меняет статус.

    Переменные окружения

    Ни одного из ключей NEWS_* нет в env.local.template. Код читает их с такими значениями по умолчанию.

    ПеременнаяПо умолчаниюГде читается
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25оценка и процесс продвижения
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKне заданоnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORзапасной вариант PAYMENT_DEFAULT_PROCESSOR, затем wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETне заданоPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENне заданоОтветы на callback в Telegram

    Данные

    Все четыре таблицы используют документную модель JSONB (id, data jsonb, временные метки) в data/schema.sql (сплющенная v4.1.0): news, news_categories, news_likes, news_submission_audit. Каждый переход дописывает запись в data.mainPageStatusHistory и создаёт одну строку news_submission_audit. Файлы data/migrations/002_news_content_schema.sql и 003_news_kingdom_upgrade.sql носят исторический характер. Новые установки применяют только schema.sql.

    Побочные эффекты одобрения

    approveMainPagePublication() устанавливает status: 'published' и visibility: 'site-wide'. Для материалов, написанных пользователями, затем в очередь ставится enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) и запускается generateArticleTranslations(). Получатели в Telegram: пользователи с ролью администратора платформы и заполненным communication.telegramId.

    Локальный тестовый прогон

    1. 1

      Примените схему и создайте статью участника

      Примените data/schema.sql и войдите как пользователь с ролью member или выше. Создайте статью на /news/create. Она получает blogUsername и после публикации появляется по адресу /{username}/{slug}.

    2. 2

      Подайте статью на продвижение

      Ответ содержит status, aiScore и либо перенаправление, либо платёжные поля для checkout.

    3. 3

      Сымитируйте оплату в dev

    4. 4

      Одобрите

      Нажмите Approve на карточке в Telegram или вызовите POST /api/mcp/v1/news/<id>/approve с сервисным токеном. Проверьте, что mainPageStatus имеет значение published_main и что существует строка news_submission_audit.

    Checkout, который взимает плату за продвижение через настроенный вами платёжный процессор.

    Управление через Telegram

    Бот администратора с кнопками одобрения.

    От блога участника до главной страницы

    Типичные сценарии

    1. Городская газета. Городской клон позволяет местным участникам публиковаться в своих блогах и берёт небольшую плату за материалы на первой полосе. Администраторы одобряют лучшие из них в Telegram.
    2. Экспертная сеть. Профессиональный клон держит высокую планку ценности: сильные статьи получают низкую цену, а слабые становятся слишком дорогими.
    3. Модерируемый центр кампаний. Клон общественного движения опирается на правила жёсткой блокировки, поэтому спам никогда не попадает в очередь администратора.

    Настройки для оператора

    Вы задаёте цены в гривнах через переменные окружения сервера. Если они не заданы, действуют такие значения по умолчанию:

    ПараметрПо умолчаниюЭффект
    Базовая цена50 UAHМинимальная цена для статьи с высокой ценностью
    Масштаб2000 UAHНасколько растёт цена при снижении ценности
    Максимум5000 UAHВерхний предел цены
    Порог низкой ценностиценность ниже 0.25Цена поднимается минимум до 4999 UAH
    Встречное предложение администратора+25%Кнопка Counter в Telegram задаёт новую сумму, которую должен оплатить автор
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Интерфейс продвижения для участникаfeatures/news/components/news-promotion-panel.tsx на /my-news
    Типы статусов и полейfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Маппер строк JSONBlib/news/map-news-document.ts
    Бренд и абсолютные URLlib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Маршруты

    Метод и путьАутентификацияНазначение
    POST /api/news/promotion/submitСессия, только автор статьиОтмечает promoteToMainPage, оценивает, открывает checkout
    PATCH /api/news/promotion/submitЗаголовок x-news-promotion-secretDev или тест: отметить как оплаченное и уведомить администраторов
    POST /api/payments/{wayforpay,stripe,paypal}/webhookПодпись процессораКаноническое подтверждение оплаты
    POST /api/news/promotion/wayforpay-webhookPayload процессораУстаревший делегат к каноническому webhook WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Сервисный токен (withMcpGuard)Операции агентов и MCP над тем же процессом

    Правила оценки

    scoreNewsForMainPage() вызывает OpenRouter, когда задан OPENROUTER_API_KEY. Без ключа сохраняются эвристические значения по умолчанию (ethics 0.7, spam 0.2, merit 0.5) и записывается model: 'heuristic'.

    • Риск дубликата: 0.95, если у другой статьи такой же slug или siteWideSlug. 0.9, если у опубликованной статьи (среди первых 200) такой же заголовок.
    • Жёсткая блокировка: ethics < NEWS_ETHICS_MIN или spamRisk > NEWS_SPAM_MAX или duplicateRisk > NEWS_DUPLICATE_MAX. Результат: published_blog_only и никакого checkout.
    • Цена: clamp(base, max, base + (1 - merit) * scale). Ценность ниже NEWS_MERIT_SOFT_REJECT поднимает цену минимум до 4999. Низкая ценность не меняет статус.

    Переменные окружения

    Ни одного из ключей NEWS_* нет в env.local.template. Код читает их с такими значениями по умолчанию.

    ПеременнаяПо умолчаниюГде читается
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25оценка и процесс продвижения
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKне заданоnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORзапасной вариант PAYMENT_DEFAULT_PROCESSOR, затем wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETне заданоPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENне заданоОтветы на callback в Telegram

    Данные

    Все четыре таблицы используют документную модель JSONB (id, data jsonb, временные метки) в data/schema.sql (сплющенная v4.1.0): news, news_categories, news_likes, news_submission_audit. Каждый переход дописывает запись в data.mainPageStatusHistory и создаёт одну строку news_submission_audit. Файлы data/migrations/002_news_content_schema.sql и 003_news_kingdom_upgrade.sql носят исторический характер. Новые установки применяют только schema.sql.

    Побочные эффекты одобрения

    approveMainPagePublication() устанавливает status: 'published' и visibility: 'site-wide'. Для материалов, написанных пользователями, затем в очередь ставится enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) и запускается generateArticleTranslations(). Получатели в Telegram: пользователи с ролью администратора платформы и заполненным communication.telegramId.

    Локальный тестовый прогон

    1. 1

      Примените схему и создайте статью участника

      Примените data/schema.sql и войдите как пользователь с ролью member или выше. Создайте статью на /news/create. Она получает blogUsername и после публикации появляется по адресу /{username}/{slug}.

    2. 2

      Подайте статью на продвижение

      Ответ содержит status, aiScore и либо перенаправление, либо платёжные поля для checkout.

    3. 3

      Сымитируйте оплату в dev

    4. 4

      Одобрите

      Нажмите Approve на карточке в Telegram или вызовите POST /api/mcp/v1/news/<id>/approve с сервисным токеном. Проверьте, что mainPageStatus имеет значение published_main и что существует строка news_submission_audit.