Перейти к основному содержанию

Что покрывает слой данных

Уровень данных приложения Twenty — это данные, которые ваше приложение добавляет в рабочее пространство: новые типы записей, которые оно объявляет, столбцы, которые оно добавляет к существующим объектам, и то, как эти записи связываются друг с другом.

В этом разделе

card-page-objects
Объекты
defineObject — объявляют новые типы записей своими собственными полями.
card-page-extending-objects
Расширение объектов
defineField — добавляйте поля к объектам стандартного или другого приложения.
card-page-relations
Связи
Двусторонние связи MANY_TO_ONE / ONE_TO_MANY между объектами.
card-page-timeline
Типы действий на временной шкале
Определяйте автоматические события аудита и явные события приложения для временных шкал записей.

Сущности вкратце

CLI обнаруживает их с помощью анализа AST во время сборки, поэтому организация файлов остается на ваше усмотрение — по соглашению используются src/objects/, src/fields/, src/indexes/, src/timeline-activity-types/ и src/related-record-paths/. Стабильные UUID universalIdentifier связывают все воедино между развертываниями.

Индексы (необязательно)

Приложения могут поставлять индексы вместе со своими объектами, чтобы повторяющиеся запросы выполнялись быстро. Наиболее распространенный случай — столбец статуса или внешнего ключа, к которому вы часто обращаетесь при чтении.
src/indexes/post-card-status.index.ts

Уникальные индексы

defineIndex принимает isUnique: true как для уникальности по одному столбцу, так и по нескольким столбцам. Это рекомендуемый примитив — defineField({ isUnique: true }) устарел и будет удален в одном из будущих релизов.

Другие ограничения

  • Частичные предложения WHERE остаются под контролем администратора — приложения не могут объявлять их.
  • Для каждого объекта допускается не более 10 пользовательских индексов (индексы самого фреймворка не учитываются).
Упорядочьте массив fields в том порядке, в котором Postgres должен его использовать — сначала самый левый столбец, как в телефонной книге. Индексы не бесплатны: при каждой записи в таблицу они обновляются. Добавляйте индекс только тогда, когда у вас есть запрос, которому он действительно нужен.

Пути к связанным записям (необязательно)

Пути связанных записей находятся в предварительной версии: они синхронизируются с вашим приложением, но разрешения записей пока их не используют. После включения им требуется тариф Organization или выше, как и для безопасности на уровне строк.
Путь связанной записи начинается на объекте и проходит не более чем по трём полям связей, каждое из которых находится на объекте, достигнутом предыдущим полем. Разрешения записей используют эти пути для расширения доступа от записи к связанным с ней записям.
  • Неотъемлемый путь (isInherent: true) применяется всегда, когда начальная запись доступна для чтения, независимо от того, как был предоставлен этот доступ. Используйте его для записей, принадлежащих родительской записи, например для вложений карточки публикации.
  • Обычный путь применяется только тогда, когда доступ к начальной записи предоставляется непосредственно ролью, поэтому рабочие пространства выбирают, на какие из них полагаться.
src/related-record-paths/post-card-attachments.related-record-path.ts
Добавьте secondFieldMetadataUniversalIdentifier и thirdFieldMetadataUniversalIdentifier для более длинных путей. Каждый переход должен быть активной связью на достигнутом к этому моменту объекте, путь не может посещать один и тот же объект дважды, и два пути не могут использовать одни и те же переходы.
Ищете Application Config или Roles & Permissions? Они описывают само приложение, а не данные, которые оно добавляет, — их можно найти в разделе Config. Ищете Connections (Linear, GitHub, Slack OAuth)? Они существуют для вызова из логических функций и находятся в разделе Logic.