CRUD
Чтение
Менеджер получает логический запрос и возвращает типизированный результат. Проверяйте success, используйте next_cursor и has_more, задавайте явный limit. Для полного документа используйте get; для шапки — get_header.
Успешный поиск без найденного объекта отличается от ошибки: lookup содержит found.
Создание и запись
DocumentManager::save выбирает ObjectCommandKind::create для нового объекта и save для существующего. Нужны корректная типизированная identity, полный агрегат и фабрика контекста изменения.
У нового документа provider identity может быть пустой при корректной типизированной принадлежности: канонический идентификатор выделяется в команде создания. Самостоятельно конструировать storage token не нужно.
ObjectMutationContext включает session_id, principal_id, correlation_id, idempotency_key, request_sequence. Их выдаёт интеграция хоста.
Удаление
| Действие | Интерфейс |
|---|---|
| Пометить | set_delete_mark(object, true) |
| Снять пометку | set_delete_mark(object, false) |
| Пометить через общий метод | remove(object, false) |
| Физически удалить | remove(object, true) |
Физическое удаление документа требует сохранённый загруженный объект с ненулевой ревизией. Пометка и физическое удаление — разные команды жизненного цикла.
Результат и ошибки
После изменения проверяйте ObjectCommandResult, включая committed и reconciliation_required. При неизвестном исходе сначала восстановите фактическое состояние чтением; не отправляйте автоматически вторую запись.
Диагностические статусы менеджера: provider-unavailable, mutation-context-unavailable, document-reference-invalid, document-save-complete-aggregate-required. Подробность находится в error.
Практическая проверка — одна запись и повторное чтение того же объекта. Наличие метода не доказывает завершённость CRUD для всех метаданных и провайдеров.