Концепції, цінність і типові сценарії
Концепції, цінність і типові сценарії
Preparing Ring content
Preparing Ring content
Preparing Ring content
Зміна URL: статті учасників тепер розміщуються за адресою /{username}/{slug}, поруч із профілем учасника на /{username}. Старого шаблону /blog/{username}/{slug} більше немає, і маршруту /blog не існує. Використовуйте вкладки Засновник / Розробник на бічній панелі, щоб відфільтрувати цю сторінку.
Блоги учасників перетворюють модуль новин вашого клону на простір для публікацій кожного учасника. Статті зберігаються в тій самій таблиці news, що й офіційні новини, позначаються іменем автора і віддаються за власною URL-адресою автора. Якщо автор хоче потрапити в головну стрічку, він подає запит на просування, і стаття потрапляє в конвеєр News Kingdom.
| Раніше в документації | Поточна поведінка |
|---|---|
/blog/{username} і /blog/{username}/{slug} | /{username} (профіль) і /{username}/{slug} (стаття) |
| Платне членство відкриває блог | Для написання потрібна роль member або вища. Платне підвищення членства надає роль member |
| Профіль показує посилання на блог і значок Telegram | У поточній сторінці профілю цього немає. Автори діляться посиланням із /my-news |
| Без членства маршрут блогу повертає 404 | Стаття повертає 404, якщо вона не опублікована, ім'я або slug не збігаються чи мова відрізняється |
Ні. У ring/web немає ні маршруту /blog, ні переадресації. Оновіть поширені посилання на /{username}/{slug}.
Вибране працює через GET і POST /api/user/favorites з хуком useContentFavorite. Цей хук підключено до перегляду новинної статті (components/wrappers/news-article-wrapper.tsx), а не до сторінки /{username}/{slug}.
Наступний крок: що відбувається після того, як автор подає запит на просування на головну сторінку.
Передумова: модуль новин, який зберігає і відображає статті учасників.
Той самий процес: сторінка /{username}, яка використовує те саме ім'я учасника.
Залежність: як обираються і захищаються імена, від яких залежать URL блогів.
Зміна URL: статті учасників тепер розміщуються за адресою /{username}/{slug}, поруч із профілем учасника на /{username}. Старого шаблону /blog/{username}/{slug} більше немає, і маршруту /blog не існує. Використовуйте вкладки Засновник / Розробник на бічній панелі, щоб відфільтрувати цю сторінку.
Блоги учасників перетворюють модуль новин вашого клону на простір для публікацій кожного учасника. Статті зберігаються в тій самій таблиці news, що й офіційні новини, позначаються іменем автора і віддаються за власною URL-адресою автора. Якщо автор хоче потрапити в головну стрічку, він подає запит на просування, і стаття потрапляє в конвеєр News Kingdom.
| Раніше в документації | Поточна поведінка |
|---|---|
/blog/{username} і /blog/{username}/{slug} | /{username} (профіль) і /{username}/{slug} (стаття) |
| Платне членство відкриває блог | Для написання потрібна роль member або вища. Платне підвищення членства надає роль member |
| Профіль показує посилання на блог і значок Telegram | У поточній сторінці профілю цього немає. Автори діляться посиланням із /my-news |
| Без членства маршрут блогу повертає 404 | Стаття повертає 404, якщо вона не опублікована, ім'я або slug не збігаються чи мова відрізняється |
Ні. У ring/web немає ні маршруту /blog, ні переадресації. Оновіть поширені посилання на /{username}/{slug}.
Вибране працює через GET і POST /api/user/favorites з хуком useContentFavorite. Цей хук підключено до перегляду новинної статті (components/wrappers/news-article-wrapper.tsx), а не до сторінки /{username}/{slug}.
Наступний крок: що відбувається після того, як автор подає запит на просування на головну сторінку.
Передумова: модуль новин, який зберігає і відображає статті учасників.
Той самий процес: сторінка /{username}, яка використовує те саме ім'я учасника.
Залежність: як обираються і захищаються імена, від яких залежать URL блогів.
Зміна URL: статті учасників тепер розміщуються за адресою /{username}/{slug}, поруч із профілем учасника на /{username}. Старого шаблону /blog/{username}/{slug} більше немає, і маршруту /blog не існує. Використовуйте вкладки Засновник / Розробник на бічній панелі, щоб відфільтрувати цю сторінку.
Блоги учасників перетворюють модуль новин вашого клону на простір для публікацій кожного учасника. Статті зберігаються в тій самій таблиці news, що й офіційні новини, позначаються іменем автора і віддаються за власною URL-адресою автора. Якщо автор хоче потрапити в головну стрічку, він подає запит на просування, і стаття потрапляє в конвеєр News Kingdom.
| Раніше в документації | Поточна поведінка |
|---|---|
/blog/{username} і /blog/{username}/{slug} | /{username} (профіль) і /{username}/{slug} (стаття) |
| Платне членство відкриває блог | Для написання потрібна роль member або вища. Платне підвищення членства надає роль member |
| Профіль показує посилання на блог і значок Telegram | У поточній сторінці профілю цього немає. Автори діляться посиланням із /my-news |
| Без членства маршрут блогу повертає 404 | Стаття повертає 404, якщо вона не опублікована, ім'я або slug не збігаються чи мова відрізняється |
Ні. У ring/web немає ні маршруту /blog, ні переадресації. Оновіть поширені посилання на /{username}/{slug}.
Вибране працює через GET і POST /api/user/favorites з хуком useContentFavorite. Цей хук підключено до перегляду новинної статті (components/wrappers/news-article-wrapper.tsx), а не до сторінки /{username}/{slug}.
Наступний крок: що відбувається після того, як автор подає запит на просування на головну сторінку.
Передумова: модуль новин, який зберігає і відображає статті учасників.
Той самий процес: сторінка /{username}, яка використовує те саме ім'я учасника.
Залежність: як обираються і захищаються імена, від яких залежать URL блогів.
Імена визначають URL блогів, тому зарезервовані імена мають значення.
| Розділ | Шлях |
|---|---|
| Написати нову статтю | /news/create |
| Керувати, ділитися і просувати | /my-news |
| Публічна стаття | /{username}/{slug} |
| Усі статті одного автора | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Абсолютний URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Дія збереження | app/_actions/news.ts |
| Дозволи | features/news/lib/news-permissions.ts |
Сторінка статті шукає в news один рядок, що відповідає всім чотирьом фільтрам: blogUsername == normalizeBlogHandle(username), slug, locale і status == 'published'. Якщо жоден рядок не підходить, вона викликає notFound(), а метадані переходять на noindex. Імена зберігаються з початковим @, тому /en/alice/hello шукає blogUsername: '@alice'.
blogUsername проставляється лише під час створення і лише тоді, коли користувач сесії має ім'я користувача. Статті, написані до того, як автор обрав ім'я, ніколи не отримують його, тому вони не відкриватимуться за адресою /{username}/{slug}. Для такого випадку панель /my-news показує підказку встановити ім'я користувача.
Статичні маршрути, як-от /store, /news або /about, мають пріоритет над динамічним сегментом [username]. Ім'я користувача, що збігається зі статичним маршрутом, не може мати URL профілю.
| Дія | Правило |
|---|---|
| Створення | canCreateNewsArticle: роль member або вища, адміністратор платформи або confidential |
| Редагування чи видалення | Адміністратор платформи або автор статті |
Видимість site-wide | Лише адміністратори платформи. Учасники отримують її через схвалення просування |
Видимість confidential | Лише користувачі з конфіденційним доступом |
featured | Під час збереження примусово false для не-адміністраторів |
| Запропонувати редакцію | Користувач, який увійшов і не є автором, з canProposeRevision, для опублікованих статей |
Створення
Учасник відкриває /news/create. Під час збереження app/_actions/news.ts записує статтю через createNewsArticle() з blogUsername і фіксує перший коміт версії (lib/versioning).
Публікація та поширення
Встановіть status: 'published'. Панель /my-news формує публічне посилання з ROUTES.PUBLIC_PROFILE(handle) і пропонує кнопку копіювання посилання.
Просування (необов'язково)
features/news/components/news-promotion-panel.tsx викликає POST /api/news/promotion/submit з { articleId }. Подавати може лише автор. Оцінювання, оплату і схвалення описано в News Kingdom.
Кожен перегляд статті рахує recordArticlePageView() всередині after(), тому підрахунок ніколи не блокує рендеринг.
Імена визначають URL блогів, тому зарезервовані імена мають значення.
| Розділ | Шлях |
|---|---|
| Написати нову статтю | /news/create |
| Керувати, ділитися і просувати | /my-news |
| Публічна стаття | /{username}/{slug} |
| Усі статті одного автора | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Абсолютний URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Дія збереження | app/_actions/news.ts |
| Дозволи | features/news/lib/news-permissions.ts |
Сторінка статті шукає в news один рядок, що відповідає всім чотирьом фільтрам: blogUsername == normalizeBlogHandle(username), slug, locale і status == 'published'. Якщо жоден рядок не підходить, вона викликає notFound(), а метадані переходять на noindex. Імена зберігаються з початковим @, тому /en/alice/hello шукає blogUsername: '@alice'.
blogUsername проставляється лише під час створення і лише тоді, коли користувач сесії має ім'я користувача. Статті, написані до того, як автор обрав ім'я, ніколи не отримують його, тому вони не відкриватимуться за адресою /{username}/{slug}. Для такого випадку панель /my-news показує підказку встановити ім'я користувача.
Статичні маршрути, як-от /store, /news або /about, мають пріоритет над динамічним сегментом [username]. Ім'я користувача, що збігається зі статичним маршрутом, не може мати URL профілю.
| Дія | Правило |
|---|---|
| Створення | canCreateNewsArticle: роль member або вища, адміністратор платформи або confidential |
| Редагування чи видалення | Адміністратор платформи або автор статті |
Видимість site-wide | Лише адміністратори платформи. Учасники отримують її через схвалення просування |
Видимість confidential | Лише користувачі з конфіденційним доступом |
featured | Під час збереження примусово false для не-адміністраторів |
| Запропонувати редакцію | Користувач, який увійшов і не є автором, з canProposeRevision, для опублікованих статей |
Створення
Учасник відкриває /news/create. Під час збереження app/_actions/news.ts записує статтю через createNewsArticle() з blogUsername і фіксує перший коміт версії (lib/versioning).
Публікація та поширення
Встановіть status: 'published'. Панель /my-news формує публічне посилання з ROUTES.PUBLIC_PROFILE(handle) і пропонує кнопку копіювання посилання.
Просування (необов'язково)
features/news/components/news-promotion-panel.tsx викликає POST /api/news/promotion/submit з { articleId }. Подавати може лише автор. Оцінювання, оплату і схвалення описано в News Kingdom.
Кожен перегляд статті рахує recordArticlePageView() всередині after(), тому підрахунок ніколи не блокує рендеринг.
Імена визначають URL блогів, тому зарезервовані імена мають значення.
| Розділ | Шлях |
|---|---|
| Написати нову статтю | /news/create |
| Керувати, ділитися і просувати | /my-news |
| Публічна стаття | /{username}/{slug} |
| Усі статті одного автора | /news/author/{username} |
lib/blog/blog-path.tsnormalizeBlogHandleprofileArticlePathnameprofileArticleHref| Абсолютний URL | lib/site-branding.ts localeBlogArticleUrl(locale, username, slug) |
| Дія збереження | app/_actions/news.ts |
| Дозволи | features/news/lib/news-permissions.ts |
Сторінка статті шукає в news один рядок, що відповідає всім чотирьом фільтрам: blogUsername == normalizeBlogHandle(username), slug, locale і status == 'published'. Якщо жоден рядок не підходить, вона викликає notFound(), а метадані переходять на noindex. Імена зберігаються з початковим @, тому /en/alice/hello шукає blogUsername: '@alice'.
blogUsername проставляється лише під час створення і лише тоді, коли користувач сесії має ім'я користувача. Статті, написані до того, як автор обрав ім'я, ніколи не отримують його, тому вони не відкриватимуться за адресою /{username}/{slug}. Для такого випадку панель /my-news показує підказку встановити ім'я користувача.
Статичні маршрути, як-от /store, /news або /about, мають пріоритет над динамічним сегментом [username]. Ім'я користувача, що збігається зі статичним маршрутом, не може мати URL профілю.
| Дія | Правило |
|---|---|
| Створення | canCreateNewsArticle: роль member або вища, адміністратор платформи або confidential |
| Редагування чи видалення | Адміністратор платформи або автор статті |
Видимість site-wide | Лише адміністратори платформи. Учасники отримують її через схвалення просування |
Видимість confidential | Лише користувачі з конфіденційним доступом |
featured | Під час збереження примусово false для не-адміністраторів |
| Запропонувати редакцію | Користувач, який увійшов і не є автором, з canProposeRevision, для опублікованих статей |
Створення
Учасник відкриває /news/create. Під час збереження app/_actions/news.ts записує статтю через createNewsArticle() з blogUsername і фіксує перший коміт версії (lib/versioning).
Публікація та поширення
Встановіть status: 'published'. Панель /my-news формує публічне посилання з ROUTES.PUBLIC_PROFILE(handle) і пропонує кнопку копіювання посилання.
Просування (необов'язково)
features/news/components/news-promotion-panel.tsx викликає POST /api/news/promotion/submit з { articleId }. Подавати може лише автор. Оцінювання, оплату і схвалення описано в News Kingdom.
Кожен перегляд статті рахує recordArticlePageView() всередині after(), тому підрахунок ніколи не блокує рендеринг.