Skip to main content
/admin/content публикует документы по адресам вашей собственной установки: /pages/terms, /pages/privacy, /pages/offer, /pages/faq и всё остальное, что вам нужно. До этого единственной контентной поверхностью были новости, а условия существовали как termsUrl в разделе брендинга, указывающий куда-то ещё, — то есть оператору приходилось хостить и переводить эти документы вне продукта. Платёжные провайдеры и магазины приложений регулярно требуют оферту и политику конфиденциальности по стабильному адресу до одобрения аккаунта.

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

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

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

Три состояния, и тянуться стоит к среднему.
  • Черновик — момента публикации нет. Адрес отвечает 404, страница видна только в панели.
  • Опубликована — читается кем угодно по /pages/{slug}.
  • Опубликована, но вне меню — стабильный адрес без пункта меню: ровно то, что нужно документу, существующему ради проверки.
Снятие с публикации обратимо и убирает адрес из мира, не разрушая страницу. Удаление забирает сам адрес, который согласовал провайдер, поэтому требует ввести slug для подтверждения. Странице нужен хотя бы один язык, а языку — и заголовок, и тело. Половина перевода рисует заголовок над пустотой, что хуже отсутствующего языка, — поэтому она отклоняется, а не сохраняется. Язык откатывается, а не отдаёт 404. Страница, существующая только на английском, всё равно отвечает по своему адресу русскоязычному читателю, потому что адрес — это то, что кто-то положил в закладки и что согласовал провайдер.

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

Эту часть стоит прочитать до того, как писать страницу. Эти документы пишет оператор, и отдаются они с того же источника, где живёт сессионный cookie. Отрисовка операторского текста как HTML — с санитайзером или без — оставляет всю страницу в одной ошибке санитайзера от хранимого межсайтового скриптинга. Поэтому текст разбирается API в типизированные блоки и типизированные строчные фрагменты, а браузер рисует из этой структуры текстовые узлы и якоря. HTML в этом пути нет вообще, а значит, санитайзеру нечего испортить. API возвращает разобранный документ и никогда не возвращает читателю исходный текст. Весь синтаксис целиком: Всё остальное — абзац, а идущие подряд строки склеиваются в один: документ, свёрстанный жёсткими переносами, не превращается в строку на строку исходника. Ни жирного, ни курсива, ни картинок, ни сырого HTML — юридическому документу они не нужны, а каждый из них был бы ещё одной конструкцией, которую можно сделать неправильно.
Нераспознанная конструкция становится обычным текстом. Ссылка с целью 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.

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

Кампании и новости

Другая контентная поверхность и почему она другая.

White-label оформление

Цвета и знак, под которыми отрисовываются эти страницы.

Настройки установки

Куда по-прежнему указывает termsUrl для оператора, предпочитающего внешний хостинг.

Кабинет клиента

Где клиент находит ссылку.