Три секции Access
В Entity settings откройте вкладку Access. В ней три секции: Entity CRUD access — доступ к операциям, External READ access — условия чтения записей, Generated routes — адреса будущих маршрутов. Дополнительные пояснения открываются через значки вопроса.
Entity CRUD access
Для каждой операции выберите доступ через Admin и external API. У persistent настраиваются List, Get, Create, Update и Delete. У virtual доступны только включённые операции чтения.
| Настройка | Кому доступна операция |
|---|---|
| Admin включен | Роли admin в административном API |
| Admin выключен | Не предоставляет эту операцию роли admin; superadmin сохраняет особые права |
| External: Off | External-маршрут не генерируется |
| Authenticated user | Аутентифицированному user и superadmin; одной роли admin недостаточно |
| Anonymous | Любому клиенту, который может обратиться к API |
При выборе Anonymous нужно подтвердить открытие операции любому клиенту API. Какие данные она вернёт, зависит от модели и правил чтения ниже. Для публикации статей на сайте достаточно чтения; включать Create/Update/Delete ради этого не нужно.
External READ access
Здесь задаются условия, которые сервер обязательно применяет к external List/Get. Убрать их параметрами клиентского запроса нельзя. Они не распространяются на административное чтение и не управляют записью. Если запись не проходит правило Get, клиент получает 404, а не её содержимое.
Нажмите + Add в нужной секции, выберите поле, оператор и значение. Доступные операторы зависят от типа поля. Для нескольких условий используйте иконку перед корзиной: она оборачивает условие в группу. AND требует выполнения всех условий группы, OR — хотя бы одного. Корзина удаляет выбранное условие или группу целиком.
Пример: страница, блоки и элементы
Представим страницу сайта. Виртуальная сущность основана на PageBlock и включает page (belongsTo → Page) и items (hasMany → BlockItem). Нужно отдавать видимые блоки опубликованных страниц, а внутри каждого блока — только видимые элементы с заполненным заголовком. Настройте три секции:
| Секция | Условия | Что ограничивается |
|---|---|---|
| PageBlock | isVisible equal true |
Корневые блоки |
| Page | status equal published |
Корневые блоки по связанной странице |
| BlockItem / items | AND: isVisible equal true и title does not equal "" |
Элементы внутри каждого блока |
Правила PageBlock и Page проверяются одновременно для каждого корневого блока. Между сущностями не нужно выбирать OR: обе проверки должны пройти. AND/OR объединяет только условия внутри конкретной секции.
В примере "" обозначает пустую строку. В UI выберите Use empty string, если такой вариант показан, или очистите Constant value после ввода. Две кавычки в качестве текста вводить не нужно. Пустая строка отличается от NULL. Если nullable-поле также не должно содержать NULL, добавьте отдельную проверку NULL из доступных операторов. Строка из пробелов тоже не равна пустой — такая проверка пробелы не удаляет.
Что важно для коллекций
Правило items отбирает элементы коллекции до подсчёта total и разделения на страницы. Когда подходящих элементов нет, API всё равно возвращает родительский блок с пустой коллекцией. Это не условие «вернуть блок, только если в нём есть элементы».
Для virtual условия и возможности списков задаются явно: настройки исходных persistent-сущностей автоматически не наследуются. В секции коллекции выбирайте её собственные скалярные поля. Произвольные обратные связи, например items.block, сами в список не добавляются.
Generated routes и применение
В Generated routes можно заранее посмотреть адреса и доступ по текущему черновику. Для применения нажмите Finish, затем Generate → Preview changes и изучите Access and route impact. Само сохранение правил не меняет работающий API: выполните Generate и запустите backend с обновлённым кодом.
Дополнительно: параметры доступа и правила чтения.
Кэш публичных ответов
Если сайт часто запрашивает одинаковые опубликованные данные, откройте Content → настройки сущности → Access → External READ access. Включите Cache public responses и задайте TTL (seconds). По умолчанию кэш выключен; начальное TTL — 30 секунд, допустимо 1–3600. Сохраните сущность, выполните Generate и выпустите новый код вместе с конфигурацией Nginx.
Кэш доступен только при разрешенном анонимном external List или Get, в том числе у virtual. Он работает через сгенерированный Nginx в production/prod-local. Прямой запрос к Go backend в обычном dev не проходит через этот кэш. Запросы с Authorization или Cookie, административные операции и ошибки не кэшируются.
TTL — сколько ответ может оставаться прежним. Изменение записи не сбрасывает кэш автоматически: после правки контента посетитель может видеть старую версию до истечения TTL. Связанные записи и вложенные коллекции также входят в сохраненный ответ. Для данных, где нужно сразу видеть каждое изменение, оставьте кэш выключенным или уменьшите TTL. Правила доступа задайте отдельно для каждой сущности: настройка persistent не включит кэш ее virtual автоматически.
Подробнее — скорость API и публичный кэш.