Konzepte, Nutzen und typische Clone-Szenarien — weniger Code.
Konzepte, Nutzen und typische Clone-Szenarien — weniger Code.
Preparing Ring content
Preparing Ring content
Preparing Ring content
Nutze die Tabs Gründer / Entwickler in der Seitenleiste der Dokumentation, um diese Seite zu filtern. Gründer sehen den Geschäftsablauf und die Stellschrauben für Betreiber. Entwickler sehen die Services, Routen, Umgebungsvariablen und einen lokalen Testlauf.
News Kingdom ist die Promotion-Schicht über dem News-Modul von Ring. Mitglieder mit der Rolle member oder höher schreiben Artikel, die in ihrem persönlichen Bereich unter /{username}/{slug} liegen. Danach kann ein Autor einen Platz im Haupt-Feed /news beantragen. Ring bewertet den Artikel, verlangt vom Autor einen Preis, der sich nach dieser Bewertung richtet, und schickt ihn an die Plattform-Admins in Telegram, die endgültig Ja oder Nein sagen.
Jede Promotion-Anfrage durchläuft ein einziges Feld des Artikels, mainPageStatus:
| Phase | Was passiert | mainPageStatus |
|---|---|---|
| Einreichen | Der Autor beantragt einen Platz auf der Startseite | submitted |
| Bewerten | KI oder Heuristik bewertet Ethik, Spam, Duplikate und Qualität | ai_scored |
| Harte Sperre | Ethik zu niedrig, Spam- oder Duplikatrisiko zu hoch | published_blog_only |
| Checkout | Der Preis steht fest und ein PaymentConductor-Checkout öffnet sich | payment_pending |
| Bezahlt | Der Webhook bestätigt die Zahlung, die Admins erhalten eine Telegram-Karte | awaiting_admin_approval |
| Freigegeben | Der Artikel erscheint seitenweit im Haupt-Feed | published_main |
| Abgelehnt | Ein Admin lehnt ab. Der Artikel bleibt im Blog des Autors | rejected |
Gleicher Ablauf: wo der Artikel vor und nach einer Promotion-Anfrage liegt.
Voraussetzung: das News-Modul, der Editor und der Haupt-Feed, in den News Kingdom befördert.
Abhängigkeit: wie der news_promotion-Checkout und seine Webhooks geroutet werden.
Siehe auch: der Admin-Bot mit den Buttons Approve, Reject und Counter.
Nutze die Tabs Gründer / Entwickler in der Seitenleiste der Dokumentation, um diese Seite zu filtern. Gründer sehen den Geschäftsablauf und die Stellschrauben für Betreiber. Entwickler sehen die Services, Routen, Umgebungsvariablen und einen lokalen Testlauf.
News Kingdom ist die Promotion-Schicht über dem News-Modul von Ring. Mitglieder mit der Rolle member oder höher schreiben Artikel, die in ihrem persönlichen Bereich unter /{username}/{slug} liegen. Danach kann ein Autor einen Platz im Haupt-Feed /news beantragen. Ring bewertet den Artikel, verlangt vom Autor einen Preis, der sich nach dieser Bewertung richtet, und schickt ihn an die Plattform-Admins in Telegram, die endgültig Ja oder Nein sagen.
Jede Promotion-Anfrage durchläuft ein einziges Feld des Artikels, mainPageStatus:
| Phase | Was passiert | mainPageStatus |
|---|---|---|
| Einreichen | Der Autor beantragt einen Platz auf der Startseite | submitted |
| Bewerten | KI oder Heuristik bewertet Ethik, Spam, Duplikate und Qualität | ai_scored |
| Harte Sperre | Ethik zu niedrig, Spam- oder Duplikatrisiko zu hoch | published_blog_only |
| Checkout | Der Preis steht fest und ein PaymentConductor-Checkout öffnet sich | payment_pending |
| Bezahlt | Der Webhook bestätigt die Zahlung, die Admins erhalten eine Telegram-Karte | awaiting_admin_approval |
| Freigegeben | Der Artikel erscheint seitenweit im Haupt-Feed | published_main |
| Abgelehnt | Ein Admin lehnt ab. Der Artikel bleibt im Blog des Autors | rejected |
Gleicher Ablauf: wo der Artikel vor und nach einer Promotion-Anfrage liegt.
Voraussetzung: das News-Modul, der Editor und der Haupt-Feed, in den News Kingdom befördert.
Abhängigkeit: wie der news_promotion-Checkout und seine Webhooks geroutet werden.
Siehe auch: der Admin-Bot mit den Buttons Approve, Reject und Counter.
Nutze die Tabs Gründer / Entwickler in der Seitenleiste der Dokumentation, um diese Seite zu filtern. Gründer sehen den Geschäftsablauf und die Stellschrauben für Betreiber. Entwickler sehen die Services, Routen, Umgebungsvariablen und einen lokalen Testlauf.
News Kingdom ist die Promotion-Schicht über dem News-Modul von Ring. Mitglieder mit der Rolle member oder höher schreiben Artikel, die in ihrem persönlichen Bereich unter /{username}/{slug} liegen. Danach kann ein Autor einen Platz im Haupt-Feed /news beantragen. Ring bewertet den Artikel, verlangt vom Autor einen Preis, der sich nach dieser Bewertung richtet, und schickt ihn an die Plattform-Admins in Telegram, die endgültig Ja oder Nein sagen.
Jede Promotion-Anfrage durchläuft ein einziges Feld des Artikels, mainPageStatus:
| Phase | Was passiert | mainPageStatus |
|---|---|---|
| Einreichen | Der Autor beantragt einen Platz auf der Startseite | submitted |
| Bewerten | KI oder Heuristik bewertet Ethik, Spam, Duplikate und Qualität | ai_scored |
| Harte Sperre | Ethik zu niedrig, Spam- oder Duplikatrisiko zu hoch | published_blog_only |
| Checkout | Der Preis steht fest und ein PaymentConductor-Checkout öffnet sich | payment_pending |
| Bezahlt | Der Webhook bestätigt die Zahlung, die Admins erhalten eine Telegram-Karte | awaiting_admin_approval |
| Freigegeben | Der Artikel erscheint seitenweit im Haupt-Feed | published_main |
| Abgelehnt | Ein Admin lehnt ab. Der Artikel bleibt im Blog des Autors | rejected |
Gleicher Ablauf: wo der Artikel vor und nach einer Promotion-Anfrage liegt.
Voraussetzung: das News-Modul, der Editor und der Haupt-Feed, in den News Kingdom befördert.
Abhängigkeit: wie der news_promotion-Checkout und seine Webhooks geroutet werden.
Siehe auch: der Admin-Bot mit den Buttons Approve, Reject und Counter.
Der Checkout, der die Promotion-Gebühr über deinen konfigurierten Zahlungsanbieter abrechnet.
Du legst die Preise in UAH über Server-Umgebungsvariablen fest. Wenn du sie nicht setzt, gelten diese Standardwerte:
| Einstellung | Standard | Wirkung |
|---|---|---|
| Grundpreis | 50 UAH | Mindestpreis für einen Artikel mit hoher Qualität |
| Skala | 2000 UAH | Wie stark der Preis steigt, wenn die Qualität sinkt |
| Maximum | 5000 UAH | Preisobergrenze |
| Untergrenze für niedrige Qualität | Qualität unter 0.25 | Der Preis wird auf mindestens 4999 UAH angehoben |
| Gegenangebot des Admins | +25% | Der Telegram-Button Counter legt einen neuen Betrag fest, den der Autor zahlen muss |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Promotion-UI für Mitglieder | features/news/components/news-promotion-panel.tsx auf /my-news |
| Status- und Feldtypen | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| JSONB-Zeilen-Mapper | lib/news/map-news-document.ts |
| Branding und absolute URLs | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Methode und Pfad | Authentifizierung | Zweck |
|---|---|---|
POST /api/news/promotion/submit | Session, nur der Autor des Artikels | Setzt promoteToMainPage, bewertet, öffnet den Checkout |
PATCH /api/news/promotion/submit | Header x-news-promotion-secret | Dev oder Test: als bezahlt markieren und Admins benachrichtigen |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Signatur des Zahlungsanbieters | Kanonische Zahlungsbestätigung |
POST /api/news/promotion/wayforpay-webhook | Payload des Zahlungsanbieters | Veraltete Weiterleitung an den kanonischen WayForPay-Webhook |
POST /api/mcp/v1/news/[id]/{score,approve,reject,publish} | Service-Token (withMcpGuard) | Agenten- und MCP-Operationen auf demselben Workflow |
scoreNewsForMainPage() ruft OpenRouter auf, wenn OPENROUTER_API_KEY gesetzt ist. Ohne Schlüssel bleiben die heuristischen Standardwerte (ethics 0.7, spam 0.2, merit 0.5) bestehen und es wird model: 'heuristic' gespeichert.
slug oder siteWideSlug hat. 0.9, wenn ein veröffentlichter Artikel (unter den ersten 200) denselben Titel hat.ethics < NEWS_ETHICS_MIN oder spamRisk > NEWS_SPAM_MAX oder duplicateRisk > NEWS_DUPLICATE_MAX. Ergebnis: published_blog_only und kein Checkout.clamp(base, max, base + (1 - merit) * scale). Eine Qualität unter NEWS_MERIT_SOFT_REJECT hebt den Preis auf mindestens 4999 an. Niedrige Qualität ändert den Status nicht.Keiner der NEWS_*-Schlüssel steht in env.local.template. Der Code liest sie mit diesen Standardwerten.
| Variable | Standard | Gelesen in |
|---|---|---|
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 | Bewertung und Workflow |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | nicht gesetzt | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | fällt auf PAYMENT_DEFAULT_PROCESSOR zurück, dann auf wayforpay | lib/payments/payment.config.ts |
NEWS_PROMOTION_WEBHOOK_SECRET | nicht gesetzt | PATCH /api/news/promotion/submit |
ADMIN_BOT_TOKEN | nicht gesetzt | Antworten auf Telegram-Callbacks |
Alle vier Tabellen nutzen das JSONB-Dokumentmodell (id, data jsonb, Zeitstempel) in data/schema.sql (abgeflacht, v4.1.0): news, news_categories, news_likes, news_submission_audit. Jeder Übergang hängt einen Eintrag an data.mainPageStatusHistory an und schreibt eine Zeile in news_submission_audit. data/migrations/002_news_content_schema.sql und 003_news_kingdom_upgrade.sql sind historisch. Neuinstallationen wenden nur schema.sql an.
approveMainPagePublication() setzt status: 'published' und visibility: 'site-wide'. Bei von Nutzern verfassten Storys stellt es anschließend enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) in die Warteschlange und startet generateArticleTranslations(). Empfänger in Telegram sind Nutzer mit einer Plattform-Admin-Rolle und einer communication.telegramId.
Schema anwenden und einen Mitgliederartikel anlegen
Wende data/schema.sql an und melde dich als Nutzer mit der Rolle member oder höher an. Lege unter /news/create einen Artikel an. Er erhält blogUsername und erscheint nach der Veröffentlichung unter /{username}/{slug}.
Zur Promotion einreichen
Die Antwort enthält status, aiScore und entweder eine Weiterleitung oder Zahlungsfelder für den Checkout.
Zahlung in Dev simulieren
Freigeben
Drücke Approve auf der Telegram-Karte oder rufe POST /api/mcp/v1/news/<id>/approve mit einem Service-Token auf. Prüfe, dass mainPageStatus den Wert published_main hat und eine Zeile in news_submission_audit existiert.
Der Checkout, der die Promotion-Gebühr über deinen konfigurierten Zahlungsanbieter abrechnet.
Du legst die Preise in UAH über Server-Umgebungsvariablen fest. Wenn du sie nicht setzt, gelten diese Standardwerte:
| Einstellung | Standard | Wirkung |
|---|---|---|
| Grundpreis | 50 UAH | Mindestpreis für einen Artikel mit hoher Qualität |
| Skala | 2000 UAH | Wie stark der Preis steigt, wenn die Qualität sinkt |
| Maximum | 5000 UAH | Preisobergrenze |
| Untergrenze für niedrige Qualität | Qualität unter 0.25 | Der Preis wird auf mindestens 4999 UAH angehoben |
| Gegenangebot des Admins | +25% | Der Telegram-Button Counter legt einen neuen Betrag fest, den der Autor zahlen muss |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Promotion-UI für Mitglieder | features/news/components/news-promotion-panel.tsx auf /my-news |
| Status- und Feldtypen | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| JSONB-Zeilen-Mapper | lib/news/map-news-document.ts |
| Branding und absolute URLs | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Methode und Pfad | Authentifizierung | Zweck |
|---|---|---|
POST /api/news/promotion/submit | Session, nur der Autor des Artikels | Setzt promoteToMainPage, bewertet, öffnet den Checkout |
PATCH /api/news/promotion/submit | Header x-news-promotion-secret | Dev oder Test: als bezahlt markieren und Admins benachrichtigen |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Signatur des Zahlungsanbieters | Kanonische Zahlungsbestätigung |
POST /api/news/promotion/wayforpay-webhook | Payload des Zahlungsanbieters | Veraltete Weiterleitung an den kanonischen WayForPay-Webhook |
POST /api/mcp/v1/news/[id]/{score,approve,reject,publish} | Service-Token (withMcpGuard) | Agenten- und MCP-Operationen auf demselben Workflow |
scoreNewsForMainPage() ruft OpenRouter auf, wenn OPENROUTER_API_KEY gesetzt ist. Ohne Schlüssel bleiben die heuristischen Standardwerte (ethics 0.7, spam 0.2, merit 0.5) bestehen und es wird model: 'heuristic' gespeichert.
slug oder siteWideSlug hat. 0.9, wenn ein veröffentlichter Artikel (unter den ersten 200) denselben Titel hat.ethics < NEWS_ETHICS_MIN oder spamRisk > NEWS_SPAM_MAX oder duplicateRisk > NEWS_DUPLICATE_MAX. Ergebnis: published_blog_only und kein Checkout.clamp(base, max, base + (1 - merit) * scale). Eine Qualität unter NEWS_MERIT_SOFT_REJECT hebt den Preis auf mindestens 4999 an. Niedrige Qualität ändert den Status nicht.Keiner der NEWS_*-Schlüssel steht in env.local.template. Der Code liest sie mit diesen Standardwerten.
| Variable | Standard | Gelesen in |
|---|---|---|
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 | Bewertung und Workflow |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | nicht gesetzt | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | fällt auf PAYMENT_DEFAULT_PROCESSOR zurück, dann auf wayforpay | lib/payments/payment.config.ts |
NEWS_PROMOTION_WEBHOOK_SECRET | nicht gesetzt | PATCH /api/news/promotion/submit |
ADMIN_BOT_TOKEN | nicht gesetzt | Antworten auf Telegram-Callbacks |
Alle vier Tabellen nutzen das JSONB-Dokumentmodell (id, data jsonb, Zeitstempel) in data/schema.sql (abgeflacht, v4.1.0): news, news_categories, news_likes, news_submission_audit. Jeder Übergang hängt einen Eintrag an data.mainPageStatusHistory an und schreibt eine Zeile in news_submission_audit. data/migrations/002_news_content_schema.sql und 003_news_kingdom_upgrade.sql sind historisch. Neuinstallationen wenden nur schema.sql an.
approveMainPagePublication() setzt status: 'published' und visibility: 'site-wide'. Bei von Nutzern verfassten Storys stellt es anschließend enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) in die Warteschlange und startet generateArticleTranslations(). Empfänger in Telegram sind Nutzer mit einer Plattform-Admin-Rolle und einer communication.telegramId.
Schema anwenden und einen Mitgliederartikel anlegen
Wende data/schema.sql an und melde dich als Nutzer mit der Rolle member oder höher an. Lege unter /news/create einen Artikel an. Er erhält blogUsername und erscheint nach der Veröffentlichung unter /{username}/{slug}.
Zur Promotion einreichen
Die Antwort enthält status, aiScore und entweder eine Weiterleitung oder Zahlungsfelder für den Checkout.
Zahlung in Dev simulieren
Freigeben
Drücke Approve auf der Telegram-Karte oder rufe POST /api/mcp/v1/news/<id>/approve mit einem Service-Token auf. Prüfe, dass mainPageStatus den Wert published_main hat und eine Zeile in news_submission_audit existiert.
Der Checkout, der die Promotion-Gebühr über deinen konfigurierten Zahlungsanbieter abrechnet.
Du legst die Preise in UAH über Server-Umgebungsvariablen fest. Wenn du sie nicht setzt, gelten diese Standardwerte:
| Einstellung | Standard | Wirkung |
|---|---|---|
| Grundpreis | 50 UAH | Mindestpreis für einen Artikel mit hoher Qualität |
| Skala | 2000 UAH | Wie stark der Preis steigt, wenn die Qualität sinkt |
| Maximum | 5000 UAH | Preisobergrenze |
| Untergrenze für niedrige Qualität | Qualität unter 0.25 | Der Preis wird auf mindestens 4999 UAH angehoben |
| Gegenangebot des Admins | +25% | Der Telegram-Button Counter legt einen neuen Betrag fest, den der Autor zahlen muss |
lib/telegram/admin-bot/news-callback-handler.tsapp/api/telegram/admin-bot/webhook/route.ts| Promotion-UI für Mitglieder | features/news/components/news-promotion-panel.tsx auf /my-news |
| Status- und Feldtypen | features/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility) |
| JSONB-Zeilen-Mapper | lib/news/map-news-document.ts |
| Branding und absolute URLs | lib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl) |
| Methode und Pfad | Authentifizierung | Zweck |
|---|---|---|
POST /api/news/promotion/submit | Session, nur der Autor des Artikels | Setzt promoteToMainPage, bewertet, öffnet den Checkout |
PATCH /api/news/promotion/submit | Header x-news-promotion-secret | Dev oder Test: als bezahlt markieren und Admins benachrichtigen |
POST /api/payments/{wayforpay,stripe,paypal}/webhook | Signatur des Zahlungsanbieters | Kanonische Zahlungsbestätigung |
POST /api/news/promotion/wayforpay-webhook | Payload des Zahlungsanbieters | Veraltete Weiterleitung an den kanonischen WayForPay-Webhook |
POST /api/mcp/v1/news/[id]/{score,approve,reject,publish} | Service-Token (withMcpGuard) | Agenten- und MCP-Operationen auf demselben Workflow |
scoreNewsForMainPage() ruft OpenRouter auf, wenn OPENROUTER_API_KEY gesetzt ist. Ohne Schlüssel bleiben die heuristischen Standardwerte (ethics 0.7, spam 0.2, merit 0.5) bestehen und es wird model: 'heuristic' gespeichert.
slug oder siteWideSlug hat. 0.9, wenn ein veröffentlichter Artikel (unter den ersten 200) denselben Titel hat.ethics < NEWS_ETHICS_MIN oder spamRisk > NEWS_SPAM_MAX oder duplicateRisk > NEWS_DUPLICATE_MAX. Ergebnis: published_blog_only und kein Checkout.clamp(base, max, base + (1 - merit) * scale). Eine Qualität unter NEWS_MERIT_SOFT_REJECT hebt den Preis auf mindestens 4999 an. Niedrige Qualität ändert den Status nicht.Keiner der NEWS_*-Schlüssel steht in env.local.template. Der Code liest sie mit diesen Standardwerten.
| Variable | Standard | Gelesen in |
|---|---|---|
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 | Bewertung und Workflow |
OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACK | nicht gesetzt | news-scoring-service.ts |
PAYMENT_NEWS_PROCESSOR | fällt auf PAYMENT_DEFAULT_PROCESSOR zurück, dann auf wayforpay | lib/payments/payment.config.ts |
NEWS_PROMOTION_WEBHOOK_SECRET | nicht gesetzt | PATCH /api/news/promotion/submit |
ADMIN_BOT_TOKEN | nicht gesetzt | Antworten auf Telegram-Callbacks |
Alle vier Tabellen nutzen das JSONB-Dokumentmodell (id, data jsonb, Zeitstempel) in data/schema.sql (abgeflacht, v4.1.0): news, news_categories, news_likes, news_submission_audit. Jeder Übergang hängt einen Eintrag an data.mainPageStatusHistory an und schreibt eine Zeile in news_submission_audit. data/migrations/002_news_content_schema.sql und 003_news_kingdom_upgrade.sql sind historisch. Neuinstallationen wenden nur schema.sql an.
approveMainPagePublication() setzt status: 'published' und visibility: 'site-wide'. Bei von Nutzern verfassten Storys stellt es anschließend enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) in die Warteschlange und startet generateArticleTranslations(). Empfänger in Telegram sind Nutzer mit einer Plattform-Admin-Rolle und einer communication.telegramId.
Schema anwenden und einen Mitgliederartikel anlegen
Wende data/schema.sql an und melde dich als Nutzer mit der Rolle member oder höher an. Lege unter /news/create einen Artikel an. Er erhält blogUsername und erscheint nach der Veröffentlichung unter /{username}/{slug}.
Zur Promotion einreichen
Die Antwort enthält status, aiScore und entweder eine Weiterleitung oder Zahlungsfelder für den Checkout.
Zahlung in Dev simulieren
Freigeben
Drücke Approve auf der Telegram-Karte oder rufe POST /api/mcp/v1/news/<id>/approve mit einem Service-Token auf. Prüfe, dass mainPageStatus den Wert published_main hat und eine Zeile in news_submission_audit existiert.