ADR-0050: Разделение API-контрактов и Domain JSONB-моделей
Статус
Принято
Контекст
Публичные API forms и Application results напрямую использовали Domain.JsonDocuments (DictionarySchemaDocument, CatalogEntryPayload, SchemaDocument). Клиенты получали системные поля (SchemaVersion, Signature, DocumentVersion, import Meta) и должны были знать server-generated идентификаторы (FieldId) при создании сущностей.
Решение
- Три слоя моделей: Domain JSONB (persistence) → Application CRUD contracts (API) → Api forms (HTTP binding).
- Явные типы по операции:
Create*,Update*,Get*,List*Entry— без универсальных*Input/*View/*Upsert*. - Create:
FieldKey(slug) required;FieldIdотсутствует в типе; server генерирует Guid. - Update:
FieldIdдля существующих полей; новые поля — толькоFieldKey. - Get:
FieldId+FieldKey+ read-only metadata (SchemaVersion,Signature, …). - Mappers:
ToDocument(Create*),ToDocument(Update*, existing),ToGetModel(document)в Application. - Именование API:
Schema,FieldValues,EntryFieldsвместоSchemaJsonb/DataJsonb; EF column names не меняются. - Идентификаторы:
DictionaryId,CatalogEntryIdв queries/results вместо genericId.
Последствия
- Breaking change для OpenAPI и generated frontend clients.
- Дублирование полей между Create/Update/Get компенсируется строгой типизацией и отдельными validators.
- Domain JSONB может эволюционировать независимо от API при сохранении mappers.
Обратные ссылки
Автоссылки: где используется этот документ.
- api-domain-model-separation.md (1): Разделение API-контрактов и Domain-моделей
Связанные документы
docs/01-engineering-rules/api-domain-model-separation.mddocs/03-domain/Pin/04-cross-cutting/jsonb-document-conventions.md