Хранение EAV и registry
EntityFieldValue (Keystone)
apps/backend/src/schema/lists/EntityFieldValue.ts
| Поле | Назначение |
|---|---|
entityType | space | artifact | … |
entityId | ID сущности |
fieldKey | namespaced ключ (my-ext.strictMode) |
extensionId | владелец поля |
value | text — единственное поле значения |
- 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") или фильтруйте на стороне расширения.