Обработчики событий сущностей
Часто хочется иметь middleware функцию проверки доступа к конкретному объекту на карточке объекта для того, чтобы не делать проверку доступа на каждой странице сущности.
Для одной entity может быть несколько страниц с Ролью "Обработчики событий сущностей", но мета никак не проверяет, что на них есть только один скрипт с нужным вам state (например check_access)
Чтобы сделать обработчик вам нужно:
-
Сделать страницы с ролью "Обработчики событий сущности"
-
Сделать скрипт cо state и id равному типу обработчика.
Например:
<script type="..." id="check_access" state="check_access">
SELECT
(CASE WHEN author_user_id = :env.userId THEN 200 ELSE 403 END) as status_code
FROM pubic.myobject
WHERE id = :env.objectId::text
LIMIT 1
</script>
Обратите внимание, что на один state вы можете сделать несколько скриптов, которые выполнятся последовательно согласно их положению на странице. Это может быть удобно, когда вам надо что-то сделать в разных бд или sql + javascript. В этом случае скрипт с id равному типу обработчика должен стоять последним.
Например:
<script type="..." id="get_anything" state="check_access">
SELECT myvar
FROM ...
LIMIT 1
</script>
<script type="..." id="check_access" state="check_access">
SELECT ...
FROM ...
WHERE id IN ( :pvm.data.get_anything.rows[0].myvar )
</script>
Обработчик: check_access
Используется для проверки доступа к конкретному объекту сущности. Например в вашем приложении есть список клиентов, но не каждому пользователю доступен каждый клиент. В этом случае удобно будет сделать проверку на карточке один раз и не проверять на каждой странице.
{{% notice info %}} Проверка на карточке объекта не отменяет отдельные проверки на списке объектов. Пока что в Мете нет способа быстро и просто проверять доступность данных на списках через встроенные механизмы. Мы рекомендуем делать хранимые процедуры базы данных для быстрой проверки доступа. {{% /notice %}}
Метод может вернуть всего одну строку с параметром "status_code" (тип int) или вернуть ноль строк. Для простоты коды соответсвуют HTTP кодам состояния (opens in a new tab)
На текущий момент реализована обработка этих кодов:
- 200 - доступ есть
- 403 - доступ запрещен
- 404 или если метод не вернет ни одной строки это будет - отсутствие обхекта
Если будет возвращен иной код состояния это будет воспринято как ошибка страницы и дальнейшая загрузка объекта будет преравана.
<script type="meta/sql" db="adplatform" id="check_access" states="check_access, default">
SELECT
(CASE WHEN client.id IN (SELECT client_id FROM get_user_clients(:env.userId)) THEN 200 ELSE 403 END) as status_code
from client
where client.id = :env.objectId::bigint
limit 1
</script>
Обработчик: breadcrumbs
Используется для вывода более прокаченных хлебных крошек в навигации.
Ссылка на страницу родитеслького объекта
Например у вас есть структура. Клиенты -> Клиент -> Список алгоритмов клиента -> Алгоритм. До появления этого функционала не было никакой возможности построить ссылку на список алгоритмов клиента в навигационном разделе, будучи на карточке алгоритма.
<script type="meta/sql" db="adplatform" id="breadcrumbs" states="breadcrumbs, default">
SELECT json_build_object('id', client.id, 'name', client.name, 'entityId', '190', 'pageId', '5282') as entity_link_field_parent_object
from algorithm
left join client ON client.id = algorithm.client_id
where algorithm.id=:env.objectId::bigint
</script>
Ссылка на страницу приложений (не карточку)
Работает приоритетнее, чем object_list_base_page_id, хотя делает тоже самое, но может использоваться для динамического рассчета page_id. Так же иногда удобнее, чем object_list_base_page_id так как не является глобальной настройкой над всем приложениями.
<script type="meta/sql" db="adplatform" id="breadcrumbs" state="breadcrumbs, default">
SELECT json_build_object('pageId', 'app_clients') as parent_page
from client
WHERE client.id = :env.objectId::bigint
</script>