Skip to content

Хранение EAV и registry

EntityFieldValue (Keystone)

apps/backend/src/schema/lists/EntityFieldValue.ts

ПолеНазначение
entityTypespace | artifact | …
entityIdID сущности
fieldKeynamespaced ключ (my-ext.strictMode)
extensionIdвладелец поля
valuetext — единственное поле значения
  • Unique: (entityType, entityId, fieldKey)
  • Index для filterable: (entityType, fieldKey, value)

Регистрация поля

ts
export default defineExtension((ctx) => {
  ctx.registerEntityField({
    entityType: 'space',
    key: 'my-ext.strictMode',
    label: 'Strict deliverables',
    filterable: true,
    defaultValue: 'false',
    maxLength: 64,
    async validate(value) {
      if (value !== 'true' && value !== 'false') {
        throw new Error('Expected "true" or "false"');
      }
    },
  });
});

Manifest:

js
{ registryId: 'backend.entityFields', keys: ['my-ext.strictMode'] }

Именование ключей

Рекомендуется prefix extension id: workflow-engine.strictMode. Это предотвращает коллизии и упрощает фильтрацию.

Default values

При первом setValues или seed (если реализован для entity) может применяться defaultValue из definition. Orphan EAV rows после uninstall расширения допустимы — при повторной загрузке semantics восстанавливаются.

Filterable fields

Только поля с filterable: true участвуют в artifactTree(..., fieldFilters). Numeric compare в ядре — string ops (eq, contains, …); для сортировки чисел используйте padding ("00042") или фильтруйте на стороне расширения.

AI workspace для командных материалов и знаний