META

Обработчики событий сущностей

Мотивация

Часто хочется иметь 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

Используется для проверки доступа к конкретному объекту сущности. Например в вашем приложении есть список клиентов, но не каждому пользователю доступен каждый клиент. В этом случае удобно будет сделать проверку на карточке один раз и не проверять на каждой странице.

Метод может вернуть всего одну строку с параметром “status_code” (тип int) или вернуть ноль строк. Для простоты коды соответсвуют HTTP кодам состояния

На текущий момент реализована обработка этих кодов:

  • 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>