META
Руководства
Структура сущности

Структура сущности

Здесь описывается тип и назначение параметров сущности и полей сущности в файлах .yaml

id: 'api_issue_type' # String: Идентификатор сущности
name: Типы и поля тикетов # String: Название в произвольной форме. Подвергается переводу
description: Типы # String: Описание сущности. Для документации
db_alias: adplatform # String: id подключения к БД в meta-databases.yaml
schema: meta # String: Имя схемы БД, в которой хранятся объекты сущности
table: issue_type_to_fields_view # String: Имя таблицы БД, в которой хранятся объекты сущности
alias: api_issue_type # String: Используется в metaql как имя таблицы
# Boolean
# Имя сущности должно иметь перевод.
# Это поле используется Метой для вывода в интерфейс и скриптом перевода для выяснения, что именно нужно переводить
i18n: true
search_order: 100 # Integer: Приоритет сортировки сущностей в глобальном поиске
# String
# ID страницы, представляющей как бы список объектов этой сущности
# Например, для сущности "клиент" - это будет страница со списком клиентов
# Основная проблема в том, что этот page id должен быть во всех приложениях и иерархиях entity sharing (если такие заданы)
# Есть альтернативный вариант - https://developers.devision.io/meta/guides/entity_handlers/
object_list_base_page_id: "e25ab12f-0e27-4266-804c-3949e52f834c"
# EntityScripts
# Дополнительные скрипты, которые будут динамически добавлены на страницу редактирования Entity,
# если там используется смарт-форма
scripts:
  # EntityScriptItem[]
  items:
  - id: 'main'
    type: 'meta/sql'
  ... # Набор параметров, описывающий <script> на страницах Меты
# String  
# SQL строка на диалекте указанной в db_alias базы данных с возможностью вкрапления freemarker
# Используется после парсинга metaql запросов на этапе склеивания распаршеной информации в новый sql
# на диалекте бд, указанной в db-alias этой сущности
# Нужны как правило для вставки безусловных условий фильтрации
# Например для сущности Клиент даже если никаких фильтров в metaql нет мы хотели бы отфильтровать клиентов
# по acl доступности для пользователя, вызывающего metaql api
# + Шаблонизируется Freemarker
metaql_where: "(#table.allowed_roles::text[] && ARRAY['meta.role.centra_api_user']::text[])"
# String
# Запрос, который надо выполнить, чтобы заполнить me-input options для стандартной карточки
# + Шаблонизируется Freemarker
input_options_query: >
  SELECT
        id,
        question as name
  FROM public.poll_template
# String
# SQL строка. Если задана, то она используется при вставке нового объекта
# в смарт-формах вместо автоматически сгенерированного запроса.
# Редко надо. Обычно тут вызов хранимой процедуры.
insert_query: >
  SELECT client_id as id FROM ext_garpun_main."api_addClient"(
    :env.userId::bigint, :env.companyId::bigint,
    :env.sp.obj.name::text, 11
  );
kind: DICT # Enum: EntityKind
acl: # Map<String, CAcl>: Настройки ACL. Используются ядром
  edit: {} # ACL для редактирования
  view: # ACL для просмотра
    users: # List<Long> Список ID пользователей, который разрешен доступ индивидуально 
      - 18
    roles: # List<String>: Список ролей, который разрешен доступ
    - meta.role
    restrictRoles: # List<String>: Список ролей с запретом доступа. Имеет приоритет на roles и проверяется до него
    - meta.role.auth
# Object (структура жестко не определена)
# Валидатор, обрабатывающий всю форму целиком
# В данном случае, сам валидатор описывается скриптом с id="status_validator" на странице
# со свойством entity_id: "api_issue_type" и render_position: "validators"
# #entity играет роль ссылки на текущую сущность
refPvmValidator:
  id: "#entity.status_validator"
  sp: { }
# Object (структура жестко не определена)
# Объект, структурно идентичный refPvmValidator
# Это валидатор вызывается не при изменении полей, а только в момент отправки формы
submitRefPvmValidator:
  id: "#entity.status_validator"
  sp: { }
# I18nObject
# Настройки перевода объектов сущности
# Не путать с полями сущности
# Именно объектов, например перевод справочников - например типа тикетов или чего-то подобного
# Указываются поля таблицы, которые надо подвергнуть переводу
# Перевод в этом случае сразу же вставляется в поле me_i18n таблицы сущности
# Поле не создается автоматически, его надо создать предварительно самому
i18n_object:
  # List<I18nField>
  fields:
    - name: name
    - name: description
# Boolean
# Запрещает копирование объекта сущности
# Ориентируясь на это поле, фронтенд должен скрывать или показывать кнопку копирования
# в смартформе
disable_copy_mode: true
# List<CEntityElem>
# Список элементов формы
# Это список полиморфных объектов, часть из которых может описывать конкретное поле в БД,
# а часть - лего-элементы
# Подробнее описано тут: https://developers.devision.io/meta/components/smart_forms
elems:
  # Тип элемента - field (класс CEntityField). Описывает поле в БД в контексте привязки к базе данных
- type: field # String
  alias: id # String: Имя колонки в metaql
  name: id # String: Имя поля в БД
  # Boolean
  # Признак того, что данное поле является первичным ключом в таблице сущности
  is_primary: true
  # Boolean
  # Скрывать поле при генерации смартформы
  is_hidden: true
  # Boolean
  # Поле является заголовком/именем/титульным названием объекта
  # Обычно это поле `name` в таблицах, например, имя клиента или название фида
  is_title: true
  # Boolean
  # Поле обязательно для заполнения
  # Смарт-формы будут ставить обязательность в UI и при сохранении в backend-е
  is_required: true
  # Boolean
  # Поле только для чтения
  # При сохранении через смарт формы (непосредственное сохранение в MutateService) будет пропущено
  is_readonly: true
  # String
  # Тип поля в нотации базы данных, в которой содержатся объекты сущности
  # Например, для postgresql тут будет text, int8, int4[] или что-то подобное
  db_type: text
  # Enum ColumnType
  # Мета-тип данных, который хранится в колонке
  # Используется в metaql, так же отдавался через api для построения отчетов в Google DataStudio для авто разметки полей там
  # Список возможных типов: https://developers.devision.io/meta/guides/data_types
  data_type: TEXT
  # String
  # Отображаемое имя поля
  display_name: Идентификатор типа тикетов
  # String
  # Связанная entity
  # Говорит, ссылка на какой entityId хранится в этом поле
  # Например, если есть сущность Клиент и у него есть поле category_id,
  # то для этого поля может быть указана ссылка на Entity "client_category"
  # Далее, по сути, в таблице клиентов в поле category_id у конкретного клиента
  # будет указан первичный ключ из таблицы category, а мета сможет автоматически построить ссылку на эту категорию
  foreign_entity_id: 600
  # Enum с фильтром по kind, id которого хранится в поле
  # Подробнее: https://developers.devision.io/meta/components/smart_forms#%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9-enum
  foreign_enum_kind: 'booking_planning_horizon_type'
  # Enum AggFn
  # Функция агрегации по умолчанию
  # Отдавался через api для построения отчетов в Google DataStudio для авто разметки полей там
  # Развитие использования поля - указание для мета-отчетов, чтобы пользователь просто перетаскивал поля в таблицу, а
  # как их лучше суммировать или вычислять среднее мета бы понимала сама
  default_agg_fn: SUM
  # Enum SemanticRole
  # Семантическая роль - разрез/метрика
  # Отдавался через api для построения отчетов в Google DataStudio для авто разметки полей там
  semantic_role: DIMENSION
  # Enum SemanticType
  # Семантический тип данных
  # Отдавался через api для построения отчетов в Google DataStudio для авто разметки полей там
  # Развитие использования поля - указание для мета-отчетов, чтобы отдавать дату, но чтобы рисовался например только год или год+месяц,
  # ну и далее в таком духе. Что-то отдаленное похожее сейчас решают некоторые cell props
  semantic_type: DURATION
  # Boolean
  # Говорит, что поле хранит список значений указанного в поле типа
  # Это нужно, чтобы не дублировать названия типов с указанием того, что это массив такого типа
  # Иначе говоря, repeated int это int[], просто оформленный двумя параметрами type: int, repeated: true
  repeated: true
  # Boolean
  # Если true, то поле в обязательном порядке должно быть передано в условиях фильтрации данных
  # Например - периодическая колонка date для статистики
  # Без этого условия можно было бы запросить данные вообще без фильтрации, и это убило бы БД
  metaql_where_required: true
  # String
  # Описание поля. Только для генерации документации
  description: "Описание"
  # Object (структура жестко не определена)
  # Дефолтное значение поля
  # Например для подстановки текущего месяца можно написать тут ${ref.now.plusMonths(1)?date}
  # + Шаблонизируется Freemarker
  default_value: "15"
  # Boolean
  # При копировании объекта через смарт-формы значения не будет копироваться из исходного объекта
  # Будет подставлено то, что установлено или не установлено в значении по умолчанию для поля
  is_use_default_value_on_copy: true
  # Boolean
  # Название поля переводится
  # Обычно это надо, если названия поля автоматизировано или вручную выводится в таблице
  # Это поле используется метой для вывода в интерфейс и скриптом перевода для выяснения, что именно нужно переводить
  i18n: true
  # String
  # Для смартформ https://developers.devision.io/meta/components/smart_forms/#параметры-add_expression-и-set_expression
  # Используется для автовычисления значения поля при сохранении смартформы для нового создаваемого объекта
  # Например add_expression: :env.userId
  # + Шаблонизируется Freemarker
  add_expression: :env.userId
  # String
  # Для смартформ https://developers.devision.io/meta/components/smart_forms/#параметры-add_expression-и-set_expression
  # Используется для автовычисления значения поля при обновлении сохранении смартформы с заполненым objectId
  # Например set_expression: :env.userId
  # + Шаблонизируется Freemarker
  set_expression: :env.userId
  # Тип элемента - block (класс CEntityBlock). Это элемент, который может как служить контейнером и позволять реализовывать
  # сложную верстку смартформ, так и быть самостоятельным элементом дизайна
- type: block
  lego_elem: # Объект типа LegoElem, описывающий элемент
   name: "me-div"
   span: 8
   style:
     border: "1px solid #E0E0E0"
     borderRadius: 8
     padding: "12px 4px 4px 12px"
  elems: # Список дочерних элементов (если сам элемент является контейнером)
  - name: "author_user_id"
    db_type: "bigint"
    is_read_only: true
    foreign_entity_id: "2654"
    add_expression: ":env.userId"
    display_name: "Добавлено"
    i18n: true
# Deprecated структура
# Массив, оставленный для обратной совместимости. Представляет из себя список только полей,
# т.е. элементов с type="field"
fields:
  - alias: id
    name: id
    db_type: text
    data_type: TEXT
    display_name: Идентификатор типа тикетов
    semantic_role: DIMENSION

AggFn

Enum с допустимыми функциями агрегации: AUTO, SUM, AVG, MIN, MAX, COUNT, COUNT_DISTINCT

SemanticRole

Enum с семантическими ролями полей сущности: DIMENSION, METRIC

SemanticType

Enum с семантическими типами данных: YEAR, YEAR_QUARTER, YEAR_MONTH, YEAR_WEEK, YEAR_MONTH_DAY, YEAR_MONTH_DAY_HOUR, QUARTER, MONTH, WEEK, MONTH_DAY, DAY_OF_WEEK, DAY, DURATION, LATITUDE_LONGITUDE, URL

EntityKind

Enum с возможными значениями: DICT, DOC и REPORT

DICT

Справочники. Обычные списки чего-то, что не является отражением каких-то событий во времени. Например списки: пользователей, клиентов, токенов, аккаунтов. Не агрегируются в стандартных случаях.

Должны содержать настройки какие поля отвечают за:

  • creation_time (время создания)
  • author_user_id (авторство)
  • modification_time (время модификаци)
  • last_user_id (авторство модификации)

DOC

Документы. От справочников отличаются тем, что отражают события по справочникам по времени. Например все текущие таблицы, в которых присутствуют entity_id, object_id и date.

Должны содержать настройки какие поля отвечают за:

  • period_time (timestamptz период к которому относятся данные документа)
  • creation_time (timestamptz время создания)
  • author_user_id (bigint авторство)
  • modification_time (timestamptz время модификаци)
  • last_user_id (bigint авторство модификации)

Документ может менять статусы, если нужно сохранять историю изменения, то для этого должна быть использовата отдельная таблица (Регистр)

REPORT

Отчет. По сути просто данные (могут быть уже агрегированными). Например статистика. При выборке всегда агрегируется

Должены содержать настройки какие поля отвечают за:

  • period_time (timestamptz период к которому относятся данные отчета)