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
URL-Änderung: Artikel von Mitgliedern liegen jetzt unter /{username}/{slug}, direkt neben dem Profil des Mitglieds unter /{username}. Das ältere Muster /blog/{username}/{slug} gibt es nicht mehr, und eine Route /blog existiert nicht. Nutze die Tabs Gründer / Entwickler in der Seitenleiste, um diese Seite zu filtern.
Mitglieder-Blogs machen das News-Modul deines Klons zu einem Publikationsbereich für jedes Mitglied. Artikel werden in derselben Tabelle news gespeichert wie offizielle News, mit dem Handle des Autors versehen und unter der eigenen URL des Autors ausgeliefert. Wenn ein Autor in den Haupt-Feed will, beantragt er eine Promotion, und der Artikel gelangt in die Pipeline von News Kingdom.
| Frühere Dokumentation sagte | Aktuelles Verhalten |
|---|---|
/blog/{username} und /blog/{username}/{slug} | /{username} (Profil) und /{username}/{slug} (Artikel) |
| Eine bezahlte Mitgliedschaft schaltet den Blog frei | Schreiben erfordert die Rolle member oder höher. Ein bezahltes Mitgliedschafts-Upgrade verleiht member |
| Das Profil zeigt einen Blog-Link und ein Telegram-Badge | Nicht auf der aktuellen Profilseite. Autoren teilen ihren Link aus /my-news |
| Ohne Mitgliedschaft liefert die Blog-Route 404 | Ein Artikel liefert 404, wenn er nicht veröffentlicht ist, Handle oder Slug nicht passen oder die Sprache abweicht |
Nein. In ring/web gibt es weder eine Route /blog noch eine Weiterleitung. Aktualisiere geteilte Links auf /{username}/{slug}.
Favoriten laufen über GET und POST /api/user/favorites mit dem Hook useContentFavorite. Dieser Hook ist in der News-Artikelansicht (components/wrappers/news-article-wrapper.tsx) eingebunden, nicht auf der Seite /{username}/{slug}.
Nächster Schritt: was passiert, nachdem ein Autor eine Promotion auf die Startseite beantragt hat.
Voraussetzung: das News-Modul, das Mitgliederartikel speichert und darstellt.
Gleicher Ablauf: die Seite /{username}, die das Handle des Mitglieds teilt.
Abhängigkeit: wie Handles gewählt und geschützt werden, die über die Blog-URLs entscheiden.
URL-Änderung: Artikel von Mitgliedern liegen jetzt unter /{username}/{slug}, direkt neben dem Profil des Mitglieds unter /{username}. Das ältere Muster /blog/{username}/{slug} gibt es nicht mehr, und eine Route /blog existiert nicht. Nutze die Tabs Gründer / Entwickler in der Seitenleiste, um diese Seite zu filtern.
Mitglieder-Blogs machen das News-Modul deines Klons zu einem Publikationsbereich für jedes Mitglied. Artikel werden in derselben Tabelle news gespeichert wie offizielle News, mit dem Handle des Autors versehen und unter der eigenen URL des Autors ausgeliefert. Wenn ein Autor in den Haupt-Feed will, beantragt er eine Promotion, und der Artikel gelangt in die Pipeline von News Kingdom.
| Frühere Dokumentation sagte | Aktuelles Verhalten |
|---|---|
/blog/{username} und /blog/{username}/{slug} | /{username} (Profil) und /{username}/{slug} (Artikel) |
| Eine bezahlte Mitgliedschaft schaltet den Blog frei | Schreiben erfordert die Rolle member oder höher. Ein bezahltes Mitgliedschafts-Upgrade verleiht member |
| Das Profil zeigt einen Blog-Link und ein Telegram-Badge | Nicht auf der aktuellen Profilseite. Autoren teilen ihren Link aus /my-news |
| Ohne Mitgliedschaft liefert die Blog-Route 404 | Ein Artikel liefert 404, wenn er nicht veröffentlicht ist, Handle oder Slug nicht passen oder die Sprache abweicht |
Nein. In ring/web gibt es weder eine Route /blog noch eine Weiterleitung. Aktualisiere geteilte Links auf /{username}/{slug}.
Favoriten laufen über GET und POST /api/user/favorites mit dem Hook useContentFavorite. Dieser Hook ist in der News-Artikelansicht (components/wrappers/news-article-wrapper.tsx) eingebunden, nicht auf der Seite /{username}/{slug}.
Nächster Schritt: was passiert, nachdem ein Autor eine Promotion auf die Startseite beantragt hat.
Voraussetzung: das News-Modul, das Mitgliederartikel speichert und darstellt.
Gleicher Ablauf: die Seite /{username}, die das Handle des Mitglieds teilt.
Abhängigkeit: wie Handles gewählt und geschützt werden, die über die Blog-URLs entscheiden.
URL-Änderung: Artikel von Mitgliedern liegen jetzt unter /{username}/{slug}, direkt neben dem Profil des Mitglieds unter /{username}. Das ältere Muster /blog/{username}/{slug} gibt es nicht mehr, und eine Route /blog existiert nicht. Nutze die Tabs Gründer / Entwickler in der Seitenleiste, um diese Seite zu filtern.
Mitglieder-Blogs machen das News-Modul deines Klons zu einem Publikationsbereich für jedes Mitglied. Artikel werden in derselben Tabelle news gespeichert wie offizielle News, mit dem Handle des Autors versehen und unter der eigenen URL des Autors ausgeliefert. Wenn ein Autor in den Haupt-Feed will, beantragt er eine Promotion, und der Artikel gelangt in die Pipeline von News Kingdom.
| Frühere Dokumentation sagte | Aktuelles Verhalten |
|---|---|
/blog/{username} und /blog/{username}/{slug} | /{username} (Profil) und /{username}/{slug} (Artikel) |
| Eine bezahlte Mitgliedschaft schaltet den Blog frei | Schreiben erfordert die Rolle member oder höher. Ein bezahltes Mitgliedschafts-Upgrade verleiht member |
| Das Profil zeigt einen Blog-Link und ein Telegram-Badge | Nicht auf der aktuellen Profilseite. Autoren teilen ihren Link aus /my-news |
| Ohne Mitgliedschaft liefert die Blog-Route 404 | Ein Artikel liefert 404, wenn er nicht veröffentlicht ist, Handle oder Slug nicht passen oder die Sprache abweicht |
Nein. In ring/web gibt es weder eine Route /blog noch eine Weiterleitung. Aktualisiere geteilte Links auf /{username}/{slug}.
Favoriten laufen über GET und POST /api/user/favorites mit dem Hook useContentFavorite. Dieser Hook ist in der News-Artikelansicht (components/wrappers/news-article-wrapper.tsx) eingebunden, nicht auf der Seite /{username}/{slug}.
Nächster Schritt: was passiert, nachdem ein Autor eine Promotion auf die Startseite beantragt hat.
Voraussetzung: das News-Modul, das Mitgliederartikel speichert und darstellt.
Gleicher Ablauf: die Seite /{username}, die das Handle des Mitglieds teilt.
Abhängigkeit: wie Handles gewählt und geschützt werden, die über die Blog-URLs entscheiden.
Handles bestimmen die Blog-URLs, deshalb sind reservierte Namen wichtig.
| Bereich | Pfad |
|---|---|
| Einen neuen Artikel schreiben | /news/create |
| Verwalten, teilen und befördern | /my-news |
| Öffentlicher Artikel | /{username}/{slug} |
| Alle Artikel eines Autors | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Absolute URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Speicher-Action | app/_actions/news.ts |
| Berechtigungen | features/news/lib/news-permissions.ts |
Die Artikelseite sucht in news eine Zeile, die alle vier Filter erfüllt: blogUsername == normalizeBlogHandle(username), slug, locale und status == 'published'. Passt keine Zeile, ruft sie notFound() auf und die Metadaten fallen auf noindex zurück. Handles werden mit führendem @ gespeichert, daher sucht /en/alice/hello nach blogUsername: '@alice'.
blogUsername wird nur beim Anlegen gesetzt und nur, wenn der Session-Nutzer einen Benutzernamen hat. Artikel, die geschrieben wurden, bevor der Autor einen Benutzernamen gewählt hat, bekommen nie ein Handle und lassen sich daher nicht unter /{username}/{slug} aufrufen. Für diesen Fall zeigt die Leiste in /my-news einen Hinweis zum Festlegen des Benutzernamens.
Statische Routen wie /store, /news oder /about haben Vorrang vor dem dynamischen Segment [username]. Ein Benutzername, der einer statischen Route entspricht, kann keine Profil-URL besitzen.
| Aktion | Regel |
|---|---|
| Anlegen | canCreateNewsArticle: Rolle member oder höher, Plattform-Admin oder confidential |
| Bearbeiten oder löschen | Plattform-Admin oder der Autor des Artikels |
Sichtbarkeit site-wide | Nur Plattform-Admins. Mitglieder erreichen sie über die Freigabe einer Promotion |
Sichtbarkeit confidential | Nur Nutzer mit vertraulichem Zugriff |
featured | Wird beim Speichern für Nicht-Admins auf false gesetzt |
| Eine Überarbeitung vorschlagen | Angemeldeter Nutzer, der nicht der Autor ist, mit canProposeRevision, bei veröffentlichten Artikeln |
Anlegen
Ein Mitglied öffnet /news/create. Beim Speichern schreibt app/_actions/news.ts den Artikel über createNewsArticle() mit blogUsername und erfasst den ersten Versions-Commit (lib/versioning).
Veröffentlichen und teilen
Setze status: 'published'. Die Leiste in /my-news erzeugt den öffentlichen Link aus ROUTES.PUBLIC_PROFILE(handle) und bietet einen Button zum Kopieren des Links.
Befördern (optional)
features/news/components/news-promotion-panel.tsx ruft POST /api/news/promotion/submit mit { articleId } auf. Nur der Autor darf einreichen. Bewertung, Zahlung und Freigabe beschreibt News Kingdom.
Jeder Artikelaufruf wird von recordArticlePageView() innerhalb von after() gezählt, sodass die Zählung das Rendern nie blockiert.
Handles bestimmen die Blog-URLs, deshalb sind reservierte Namen wichtig.
| Bereich | Pfad |
|---|---|
| Einen neuen Artikel schreiben | /news/create |
| Verwalten, teilen und befördern | /my-news |
| Öffentlicher Artikel | /{username}/{slug} |
| Alle Artikel eines Autors | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Absolute URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Speicher-Action | app/_actions/news.ts |
| Berechtigungen | features/news/lib/news-permissions.ts |
Die Artikelseite sucht in news eine Zeile, die alle vier Filter erfüllt: blogUsername == normalizeBlogHandle(username), slug, locale und status == 'published'. Passt keine Zeile, ruft sie notFound() auf und die Metadaten fallen auf noindex zurück. Handles werden mit führendem @ gespeichert, daher sucht /en/alice/hello nach blogUsername: '@alice'.
blogUsername wird nur beim Anlegen gesetzt und nur, wenn der Session-Nutzer einen Benutzernamen hat. Artikel, die geschrieben wurden, bevor der Autor einen Benutzernamen gewählt hat, bekommen nie ein Handle und lassen sich daher nicht unter /{username}/{slug} aufrufen. Für diesen Fall zeigt die Leiste in /my-news einen Hinweis zum Festlegen des Benutzernamens.
Statische Routen wie /store, /news oder /about haben Vorrang vor dem dynamischen Segment [username]. Ein Benutzername, der einer statischen Route entspricht, kann keine Profil-URL besitzen.
| Aktion | Regel |
|---|---|
| Anlegen | canCreateNewsArticle: Rolle member oder höher, Plattform-Admin oder confidential |
| Bearbeiten oder löschen | Plattform-Admin oder der Autor des Artikels |
Sichtbarkeit site-wide | Nur Plattform-Admins. Mitglieder erreichen sie über die Freigabe einer Promotion |
Sichtbarkeit confidential | Nur Nutzer mit vertraulichem Zugriff |
featured | Wird beim Speichern für Nicht-Admins auf false gesetzt |
| Eine Überarbeitung vorschlagen | Angemeldeter Nutzer, der nicht der Autor ist, mit canProposeRevision, bei veröffentlichten Artikeln |
Anlegen
Ein Mitglied öffnet /news/create. Beim Speichern schreibt app/_actions/news.ts den Artikel über createNewsArticle() mit blogUsername und erfasst den ersten Versions-Commit (lib/versioning).
Veröffentlichen und teilen
Setze status: 'published'. Die Leiste in /my-news erzeugt den öffentlichen Link aus ROUTES.PUBLIC_PROFILE(handle) und bietet einen Button zum Kopieren des Links.
Befördern (optional)
features/news/components/news-promotion-panel.tsx ruft POST /api/news/promotion/submit mit { articleId } auf. Nur der Autor darf einreichen. Bewertung, Zahlung und Freigabe beschreibt News Kingdom.
Jeder Artikelaufruf wird von recordArticlePageView() innerhalb von after() gezählt, sodass die Zählung das Rendern nie blockiert.
Handles bestimmen die Blog-URLs, deshalb sind reservierte Namen wichtig.
| Bereich | Pfad |
|---|---|
| Einen neuen Artikel schreiben | /news/create |
| Verwalten, teilen und befördern | /my-news |
| Öffentlicher Artikel | /{username}/{slug} |
| Alle Artikel eines Autors | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Absolute URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Speicher-Action | app/_actions/news.ts |
| Berechtigungen | features/news/lib/news-permissions.ts |
Die Artikelseite sucht in news eine Zeile, die alle vier Filter erfüllt: blogUsername == normalizeBlogHandle(username), slug, locale und status == 'published'. Passt keine Zeile, ruft sie notFound() auf und die Metadaten fallen auf noindex zurück. Handles werden mit führendem @ gespeichert, daher sucht /en/alice/hello nach blogUsername: '@alice'.
blogUsername wird nur beim Anlegen gesetzt und nur, wenn der Session-Nutzer einen Benutzernamen hat. Artikel, die geschrieben wurden, bevor der Autor einen Benutzernamen gewählt hat, bekommen nie ein Handle und lassen sich daher nicht unter /{username}/{slug} aufrufen. Für diesen Fall zeigt die Leiste in /my-news einen Hinweis zum Festlegen des Benutzernamens.
Statische Routen wie /store, /news oder /about haben Vorrang vor dem dynamischen Segment [username]. Ein Benutzername, der einer statischen Route entspricht, kann keine Profil-URL besitzen.
| Aktion | Regel |
|---|---|
| Anlegen | canCreateNewsArticle: Rolle member oder höher, Plattform-Admin oder confidential |
| Bearbeiten oder löschen | Plattform-Admin oder der Autor des Artikels |
Sichtbarkeit site-wide | Nur Plattform-Admins. Mitglieder erreichen sie über die Freigabe einer Promotion |
Sichtbarkeit confidential | Nur Nutzer mit vertraulichem Zugriff |
featured | Wird beim Speichern für Nicht-Admins auf false gesetzt |
| Eine Überarbeitung vorschlagen | Angemeldeter Nutzer, der nicht der Autor ist, mit canProposeRevision, bei veröffentlichten Artikeln |
Anlegen
Ein Mitglied öffnet /news/create. Beim Speichern schreibt app/_actions/news.ts den Artikel über createNewsArticle() mit blogUsername und erfasst den ersten Versions-Commit (lib/versioning).
Veröffentlichen und teilen
Setze status: 'published'. Die Leiste in /my-news erzeugt den öffentlichen Link aus ROUTES.PUBLIC_PROFILE(handle) und bietet einen Button zum Kopieren des Links.
Befördern (optional)
features/news/components/news-promotion-panel.tsx ruft POST /api/news/promotion/submit mit { articleId } auf. Nur der Autor darf einreichen. Bewertung, Zahlung und Freigabe beschreibt News Kingdom.
Jeder Artikelaufruf wird von recordArticlePageView() innerhalb von after() gezählt, sodass die Zählung das Rendern nie blockiert.