> ## Documentation Index
> Fetch the complete documentation index at: https://omniflow-vpn.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Информационные страницы

> Публикация FAQ, условий, оферты и политики конфиденциальности по собственным адресам и почему тело страницы никогда не является HTML

`/admin/content` публикует документы по адресам вашей собственной установки:
`/pages/terms`, `/pages/privacy`, `/pages/offer`, `/pages/faq` и всё остальное,
что вам нужно.

До этого единственной контентной поверхностью были новости, а условия
существовали как `termsUrl` в разделе брендинга, указывающий куда-то ещё, — то
есть оператору приходилось хостить и переводить эти документы вне продукта.
Платёжные провайдеры и магазины приложений регулярно требуют оферту и политику
конфиденциальности по стабильному адресу до одобрения аккаунта.

## Почему это не новости

Различие не косметическое, и оно определяет всю форму.

| Новость | Информационная страница |
| - | - |
| Датирована и истекает | Постоянная; содержимое меняется на месте |
| Читается один раз, влияет на счётчик непрочитанного | Читается тогда, когда понадобится |
| Для вошедших клиентов | Для кого угодно, включая проверяющего у провайдера |
| Опознаётся сгенерированным идентификатором | Опознаётся своим **адресом** |

Последняя строка несущая. Платёжный провайдер согласовывает URL, поэтому slug —
это идентичность страницы в базе, а не поле рядом со сгенерированным
идентификатором: нет способа поменять адрес, сохранив страницу, потому что это
тихо сломало бы согласование.

## Публикация, снятие, удаление

Три состояния, и тянуться стоит к среднему.

* **Черновик** — момента публикации нет. Адрес отвечает 404, страница видна
  только в панели.
* **Опубликована** — читается кем угодно по `/pages/{slug}`.
* **Опубликована, но вне меню** — стабильный адрес без пункта меню: ровно то,
  что нужно документу, существующему ради проверки.

**Снятие с публикации обратимо** и убирает адрес из мира, не разрушая страницу.
**Удаление забирает сам адрес**, который согласовал провайдер, поэтому требует
ввести slug для подтверждения.

Странице нужен хотя бы один язык, а языку — и заголовок, и тело. Половина
перевода рисует заголовок над пустотой, что хуже отсутствующего языка, — поэтому
она отклоняется, а не сохраняется.

**Язык откатывается, а не отдаёт 404.** Страница, существующая только на
английском, всё равно отвечает по своему адресу русскоязычному читателю, потому
что адрес — это то, что кто-то положил в закладки и что согласовал провайдер.

## Тело страницы никогда не является HTML

Эту часть стоит прочитать до того, как писать страницу.

Эти документы пишет оператор, и отдаются они с того же источника, где живёт
сессионный cookie. Отрисовка операторского текста как HTML — с санитайзером или
без — оставляет всю страницу в одной ошибке санитайзера от хранимого межсайтового
скриптинга.

Поэтому текст **разбирается API в типизированные блоки и типизированные
строчные фрагменты**, а браузер рисует из этой структуры текстовые узлы и якоря.
HTML в этом пути нет вообще, а значит, санитайзеру нечего испортить. API
возвращает разобранный документ и никогда не возвращает читателю исходный текст.

Весь синтаксис целиком:

| Написано | Отрисуется как |
| - | - |
| `## Заголовок` | Заголовок |
| `- пункт` | Пункт списка |
| `1. пункт` | Нумерованный пункт |
| Пустая строка | Конец блока |
| `[текст](https://…)` | Ссылка, **только https** |

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

Ни жирного, ни курсива, ни картинок, ни сырого HTML — юридическому документу они
не нужны, а каждый из них был бы ещё одной конструкцией, которую можно сделать
неправильно.

> [!NOTE]
>
> **Нераспознанная конструкция становится обычным текстом.** Ссылка с целью
> `http://` или `javascript:` отрисуется буквально теми символами, которые вы
> набрали, вместе со скобками: видимо, очевидно неправильно и безвредно. Разбор
> никогда не отклоняет документ — оператор с опубликованной страницей, которую он
> не может увидеть, и без номера строки в худшем положении, чем оператор со
> странно читающимся абзацем.

## Сторона читателя

`/pages` перечисляет опубликованные и показанные в меню документы,
`/pages/{slug}` — один из них. Обе страницы **отрисовываются на сервере**, потому
что самые важные читатели — проверяющий у платёжного провайдера, проверяющий в
магазине приложений, поисковый робот — не обязаны исполнять JavaScript. Страница
условий, которой нужна гидрация, чтобы появиться, — это страница условий, которой
для требующей стороны не существует.

Кабинет клиента ссылается на список с экрана аккаунта, в той же группе, что
настройки уведомлений и персональные данные.

`GET /v1/pages` и `GET /v1/pages/{slug}` публичны и не требуют аутентификации.
Они несут только то, что оператор опубликовал для всех, и обе кэшируются на пять
минут.

## Права и журнал

Чтение в панели требует `marketing.read`; публикация, редактирование и удаление —
`marketing.write`, те же права, что и у новостей, потому что это та же
способность: публиковать слова клиентам. Оператору поддержки, который может
ответить на обращение, нечего делать в условиях использования.

Сохранения, публикации, снятия и удаления попадают в журнал как
`content.page.saved`, `content.page.published`, `content.page.withdrawn` и
`content.page.deleted` в категории `marketing`.

## Смежные страницы

> **[Кампании и новости](https://omniflow-vpn.mintlify.site/ru/commerce/campaigns.md)**
>
> Другая контентная поверхность и почему она другая.

> **[White-label оформление](https://omniflow-vpn.mintlify.site/ru/operations/branding.md)**
>
> Цвета и знак, под которыми отрисовываются эти страницы.

> **[Настройки установки](https://omniflow-vpn.mintlify.site/ru/operations/installation-settings.md)**
>
> Куда по-прежнему указывает `termsUrl` для оператора, предпочитающего внешний хостинг.

> **[Кабинет клиента](https://omniflow-vpn.mintlify.site/ru/customer/web-panel.md)**
>
> Где клиент находит ссылку.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.