Концепції, цінність і типові сценарії
Концепції, цінність і типові сценарії
Preparing Ring content
Preparing Ring content
Preparing Ring content
Використовуйте вкладки Засновник / Розробник на бічній панелі документації, щоб відфільтрувати цю сторінку. Засновники бачать бізнес-процес і налаштування для оператора. Розробники бачать сервіси, маршрути, змінні середовища та локальний тестовий прогін.
News Kingdom є шаром просування поверх модуля новин Ring. Учасники з роллю member або вищою пишуть статті, які розміщуються в їхньому особистому просторі за адресою /{username}/{slug}. Після цього автор може попросити місце в головній стрічці /news. Ring оцінює статтю, пропонує автору сплатити ціну, яка залежить від оцінки, і надсилає статтю адміністраторам платформи в Telegram для остаточного рішення «так» чи «ні».
Кожен запит на просування проходить через одне поле статті, mainPageStatus:
| Етап | Що відбувається | mainPageStatus |
|---|---|---|
| Подання | Автор просить розмістити статтю на головній сторінці | submitted |
| Оцінювання | AI або евристика оцінює етичність, спам, дублікати та цінність | ai_scored |
| Жорстке блокування | Етичність надто низька, ризик спаму чи дубліката надто високий | published_blog_only |
| Оплата | Ціну встановлено, відкривається checkout PaymentConductor | payment_pending |
| Оплачено | Webhook підтверджує оплату, адміністратори отримують картку в Telegram | awaiting_admin_approval |
| Схвалено | Стаття з'являється в головній стрічці для всього сайту | published_main |
| Відхилено | Адміністратор відмовляє. Стаття залишається в блозі автора | rejected |
Той самий процес: де стаття живе до і після запиту на просування.
Передумова: модуль новин, редактор і головна стрічка, куди News Kingdom просуває статті.
Залежність: як маршрутизуються checkout news_promotion і його webhooks.
Див. також: бот адміністратора з кнопками Approve, Reject і Counter.
Використовуйте вкладки Засновник / Розробник на бічній панелі документації, щоб відфільтрувати цю сторінку. Засновники бачать бізнес-процес і налаштування для оператора. Розробники бачать сервіси, маршрути, змінні середовища та локальний тестовий прогін.
News Kingdom є шаром просування поверх модуля новин Ring. Учасники з роллю member або вищою пишуть статті, які розміщуються в їхньому особистому просторі за адресою /{username}/{slug}. Після цього автор може попросити місце в головній стрічці /news. Ring оцінює статтю, пропонує автору сплатити ціну, яка залежить від оцінки, і надсилає статтю адміністраторам платформи в Telegram для остаточного рішення «так» чи «ні».
Кожен запит на просування проходить через одне поле статті, mainPageStatus:
| Етап | Що відбувається | mainPageStatus |
|---|---|---|
| Подання | Автор просить розмістити статтю на головній сторінці | submitted |
| Оцінювання | AI або евристика оцінює етичність, спам, дублікати та цінність | ai_scored |
| Жорстке блокування | Етичність надто низька, ризик спаму чи дубліката надто високий | published_blog_only |
| Оплата | Ціну встановлено, відкривається checkout PaymentConductor | payment_pending |
| Оплачено | Webhook підтверджує оплату, адміністратори отримують картку в Telegram | awaiting_admin_approval |
| Схвалено | Стаття з'являється в головній стрічці для всього сайту | published_main |
| Відхилено | Адміністратор відмовляє. Стаття залишається в блозі автора | rejected |
Той самий процес: де стаття живе до і після запиту на просування.
Передумова: модуль новин, редактор і головна стрічка, куди News Kingdom просуває статті.
Залежність: як маршрутизуються checkout news_promotion і його webhooks.
Див. також: бот адміністратора з кнопками Approve, Reject і Counter.
Використовуйте вкладки Засновник / Розробник на бічній панелі документації, щоб відфільтрувати цю сторінку. Засновники бачать бізнес-процес і налаштування для оператора. Розробники бачать сервіси, маршрути, змінні середовища та локальний тестовий прогін.
News Kingdom є шаром просування поверх модуля новин Ring. Учасники з роллю member або вищою пишуть статті, які розміщуються в їхньому особистому просторі за адресою /{username}/{slug}. Після цього автор може попросити місце в головній стрічці /news. Ring оцінює статтю, пропонує автору сплатити ціну, яка залежить від оцінки, і надсилає статтю адміністраторам платформи в Telegram для остаточного рішення «так» чи «ні».
Кожен запит на просування проходить через одне поле статті, mainPageStatus:
| Етап | Що відбувається | mainPageStatus |
|---|---|---|
| Подання | Автор просить розмістити статтю на головній сторінці | submitted |
| Оцінювання | AI або евристика оцінює етичність, спам, дублікати та цінність | ai_scored |
| Жорстке блокування | Етичність надто низька, ризик спаму чи дубліката надто високий | published_blog_only |
| Оплата | Ціну встановлено, відкривається checkout PaymentConductor | payment_pending |
| Оплачено | Webhook підтверджує оплату, адміністратори отримують картку в Telegram | awaiting_admin_approval |
| Схвалено | Стаття з'являється в головній стрічці для всього сайту | published_main |
| Відхилено | Адміністратор відмовляє. Стаття залишається в блозі автора | rejected |
Той самий процес: де стаття живе до і після запиту на просування.
Передумова: модуль новин, редактор і головна стрічка, куди News Kingdom просуває статті.
Залежність: як маршрутизуються checkout news_promotion і його webhooks.
Див. також: бот адміністратора з кнопками Approve, Reject і Counter.
Checkout, який стягує плату за просування через налаштований вами платіжний процесор.
Ви встановлюєте ціни в гривнях через змінні середовища сервера. Якщо їх не задано, діють такі значення за замовчуванням:
| Параметр | За замовчуванням | Ефект |
|---|---|---|
| Базова ціна | 50 UAH | Мінімальна ціна для статті з високою цінністю |
| Масштаб | 2000 UAH | Наскільки зростає ціна, коли цінність знижується |
| Максимум | 5000 UAH | Верхня межа ціни |
| Поріг низької цінності | цінність нижче 0.25 | Ціна піднімається щонайменше до 4999 UAH |
| Зустрічна пропозиція адміністратора | +25% | Кнопка Counter у Telegram встановлює нову суму, яку має сплатити автор |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Інтерфейс просування для учасника | features/news/components/news-promotion-panel.tsx на /my-news |
| Типи статусів і полів | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| Мапер рядків JSONB | lib/news/map-news-document.ts |
| Бренд і абсолютні URL | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Метод і шлях | Автентифікація | Призначення |
|---|---|---|
POST /api/news/promotion/submit | Сесія, лише автор статті | Позначає promoteToMainPage, оцінює, відкриває checkout |
PATCH /api/news/promotion/submit | Заголовок x-news-promotion-secret | Dev або тест: позначити як оплачене і сповістити адміністраторів |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Підпис процесора | Канонічне підтвердження оплати |
POST /api/news/promotion/wayforpay-webhook | Payload процесора | Застарілий делегат до канонічного 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'.
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_UAH | 50 / 2000 / 5000 | news-scoring-service.ts |
NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX | 0.35 / 0.85 / 0.9 | news-scoring-service.ts |
NEWS_MERIT_SOFT_REJECT | 0.25 | оцінювання і процес просування |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | не задано | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | резервно PAYMENT_DEFAULT_PROCESSOR, потім wayforpay | lib/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.
Застосуйте схему і створіть статтю учасника
Застосуйте data/schema.sql і увійдіть як користувач із роллю member або вищою. Створіть статтю на /news/create. Вона отримує blogUsername і після публікації з'являється за адресою /{username}/{slug}.
Подайте статтю на просування
Відповідь містить status, aiScore і або переадресацію, або платіжні поля для checkout.
Імітуйте оплату в dev
Схваліть
Натисніть Approve на картці в Telegram або викличте POST /api/mcp/v1/news/<id>/approve із сервісним токеном. Перевірте, що mainPageStatus має значення published_main і що існує рядок news_submission_audit.
Checkout, який стягує плату за просування через налаштований вами платіжний процесор.
Ви встановлюєте ціни в гривнях через змінні середовища сервера. Якщо їх не задано, діють такі значення за замовчуванням:
| Параметр | За замовчуванням | Ефект |
|---|---|---|
| Базова ціна | 50 UAH | Мінімальна ціна для статті з високою цінністю |
| Масштаб | 2000 UAH | Наскільки зростає ціна, коли цінність знижується |
| Максимум | 5000 UAH | Верхня межа ціни |
| Поріг низької цінності | цінність нижче 0.25 | Ціна піднімається щонайменше до 4999 UAH |
| Зустрічна пропозиція адміністратора | +25% | Кнопка Counter у Telegram встановлює нову суму, яку має сплатити автор |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Інтерфейс просування для учасника | features/news/components/news-promotion-panel.tsx на /my-news |
| Типи статусів і полів | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| Мапер рядків JSONB | lib/news/map-news-document.ts |
| Бренд і абсолютні URL | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Метод і шлях | Автентифікація | Призначення |
|---|---|---|
POST /api/news/promotion/submit | Сесія, лише автор статті | Позначає promoteToMainPage, оцінює, відкриває checkout |
PATCH /api/news/promotion/submit | Заголовок x-news-promotion-secret | Dev або тест: позначити як оплачене і сповістити адміністраторів |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Підпис процесора | Канонічне підтвердження оплати |
POST /api/news/promotion/wayforpay-webhook | Payload процесора | Застарілий делегат до канонічного 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'.
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_UAH | 50 / 2000 / 5000 | news-scoring-service.ts |
NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX | 0.35 / 0.85 / 0.9 | news-scoring-service.ts |
NEWS_MERIT_SOFT_REJECT | 0.25 | оцінювання і процес просування |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | не задано | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | резервно PAYMENT_DEFAULT_PROCESSOR, потім wayforpay | lib/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.
Застосуйте схему і створіть статтю учасника
Застосуйте data/schema.sql і увійдіть як користувач із роллю member або вищою. Створіть статтю на /news/create. Вона отримує blogUsername і після публікації з'являється за адресою /{username}/{slug}.
Подайте статтю на просування
Відповідь містить status, aiScore і або переадресацію, або платіжні поля для checkout.
Імітуйте оплату в dev
Схваліть
Натисніть Approve на картці в Telegram або викличте POST /api/mcp/v1/news/<id>/approve із сервісним токеном. Перевірте, що mainPageStatus має значення published_main і що існує рядок news_submission_audit.
Checkout, який стягує плату за просування через налаштований вами платіжний процесор.
Ви встановлюєте ціни в гривнях через змінні середовища сервера. Якщо їх не задано, діють такі значення за замовчуванням:
| Параметр | За замовчуванням | Ефект |
|---|---|---|
| Базова ціна | 50 UAH | Мінімальна ціна для статті з високою цінністю |
| Масштаб | 2000 UAH | Наскільки зростає ціна, коли цінність знижується |
| Максимум | 5000 UAH | Верхня межа ціни |
| Поріг низької цінності | цінність нижче 0.25 | Ціна піднімається щонайменше до 4999 UAH |
| Зустрічна пропозиція адміністратора | +25% | Кнопка Counter у Telegram встановлює нову суму, яку має сплатити автор |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Інтерфейс просування для учасника | features/news/components/news-promotion-panel.tsx на /my-news |
| Типи статусів і полів | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| Мапер рядків JSONB | lib/news/map-news-document.ts |
| Бренд і абсолютні URL | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Метод і шлях | Автентифікація | Призначення |
|---|---|---|
POST /api/news/promotion/submit | Сесія, лише автор статті | Позначає promoteToMainPage, оцінює, відкриває checkout |
PATCH /api/news/promotion/submit | Заголовок x-news-promotion-secret | Dev або тест: позначити як оплачене і сповістити адміністраторів |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Підпис процесора | Канонічне підтвердження оплати |
POST /api/news/promotion/wayforpay-webhook | Payload процесора | Застарілий делегат до канонічного 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'.
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_UAH | 50 / 2000 / 5000 | news-scoring-service.ts |
NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX | 0.35 / 0.85 / 0.9 | news-scoring-service.ts |
NEWS_MERIT_SOFT_REJECT | 0.25 | оцінювання і процес просування |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | не задано | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | резервно PAYMENT_DEFAULT_PROCESSOR, потім wayforpay | lib/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.
Застосуйте схему і створіть статтю учасника
Застосуйте data/schema.sql і увійдіть як користувач із роллю member або вищою. Створіть статтю на /news/create. Вона отримує blogUsername і після публікації з'являється за адресою /{username}/{slug}.
Подайте статтю на просування
Відповідь містить status, aiScore і або переадресацію, або платіжні поля для checkout.
Імітуйте оплату в dev
Схваліть
Натисніть Approve на картці в Telegram або викличте POST /api/mcp/v1/news/<id>/approve із сервісним токеном. Перевірте, що mainPageStatus має значення published_main і що існує рядок news_submission_audit.