/admin/content публикует документы по адресам вашей собственной установки:
/pages/terms, /pages/privacy, /pages/offer, /pages/faq и всё остальное,
что вам нужно.
До этого единственной контентной поверхностью были новости, а условия
существовали как termsUrl в разделе брендинга, указывающий куда-то ещё, — то
есть оператору приходилось хостить и переводить эти документы вне продукта.
Платёжные провайдеры и магазины приложений регулярно требуют оферту и политику
конфиденциальности по стабильному адресу до одобрения аккаунта.
Почему это не новости
Различие не косметическое, и оно определяет всю форму.
Последняя строка несущая. Платёжный провайдер согласовывает URL, поэтому slug —
это идентичность страницы в базе, а не поле рядом со сгенерированным
идентификатором: нет способа поменять адрес, сохранив страницу, потому что это
тихо сломало бы согласование.
Публикация, снятие, удаление
Три состояния, и тянуться стоит к среднему.- Черновик — момента публикации нет. Адрес отвечает 404, страница видна только в панели.
- Опубликована — читается кем угодно по
/pages/{slug}. - Опубликована, но вне меню — стабильный адрес без пункта меню: ровно то, что нужно документу, существующему ради проверки.
Тело страницы никогда не является 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 для оператора, предпочитающего внешний хостинг.Кабинет клиента
Где клиент находит ссылку.