Пакет @morphcluster/carabi
Обзор
carabi — это клиентская библиотека для работы с информационными объектами (документами) в экосистеме CSP. Она предоставляет высокоуровневый API для взаимодействия с сервисами управления документами, а также вспомогательные утилиты для кэширования, работы со структурой и данными.
Библиотека построена поверх NATS-интеграции и использует ServiceNats для прозрачного вызова удалённых сервисов.
Клиенты
Клиенты наследуются от ServiceNats и предоставляют методы для вызова удалённых сервисов через NATS. Все методы принимают параметры, объект workspace (устаревший, всегда null) и логгер.
1. Documents
Назначение: Низкоуровневая работа с документами (чтение/запись значений, информация, проверки).
Методы:
| Метод | Параметры | Описание |
|---|---|---|
getInfo |
{ documentId } |
Получить основную информацию (тип, статус, дата, создатель) |
getDescr |
{ documentId } |
Получить описание документа (по правилам именования) |
getValues |
{ dockind, documentId, propNames } |
Получить значения указанных свойств |
setValues |
{ dockind, documentId, values } |
Установить значения свойств |
dublicate |
{ dockind, documentId } |
Создать копию документа |
insertRefs |
{ dockind, documentId, propName, values } |
Добавить ссылки в множественное поле |
deleteRefs |
{ dockind, documentId, propName, values } |
Удалить ссылки |
checkNull |
{ dockind, documentId } |
Проверить обязательные поля |
listIdByProps |
{ dockind, values, count? } |
Найти ID документов по свойствам (AND) |
listPropsByProps |
{ dockind, props, filter?, count? } |
Выбрать документы с указанными полями |
listByUniqueFields |
{ dockind, values } |
Найти по уникальным полям |
getUniqueCollisions |
{ dockind, documentId } |
Найти конфликты уникальности |
2. DocumentLists
Назначение: Расширенный поиск документов с фильтрацией по статусам.
Методы:
| Метод | Параметры | Описание |
|---|---|---|
listIdByProps |
{ dockind, values, statuses?, notStatuses?, count? } |
Найти ID с фильтром по статусам |
listPropsByProps |
{ dockind, props, filter?, statuses?, notStatuses?, count? } |
Вывести поля с фильтрацией |
listByUniqueFields |
{ dockind, values } |
Поиск по уникальным полям |
getUniqueCollisions |
{ dockind, documentId } |
Проверить коллизии |
3. DockindStructure
Назначение: Управление метаданными типа документа (статусы, свойства, функции, действия, права).
Методы:
| Метод | Параметры | Описание |
|---|---|---|
getInfo |
{ docKind } |
Получить базовую информацию |
setMain |
{ oldDocKind, newDocKind, description, parentId } |
Обновить описание и родителя |
getStatuses |
{ docKind } |
Получить список статусов |
setStatuses |
{ docKind, deleteIds, statuses, newOrder } |
Обновить статусы |
getProps |
{ docKind } |
Получить свойства |
setProps |
{ docKind, props, deleteIds } |
Обновить свойства |
getFunctions |
{ docKind } |
Получить функции (DB/CSP) |
setFunctions |
{ docKind, funcs, deleteIds } |
Обновить функции |
setActions |
{ docKind, deleteIds, actions } |
Обновить действия |
setNames |
{ docKind, names } |
Обновить правила именования |
setPermissions |
{ docKind, roles, deleteRoleIds } |
Обновить права доступа |
getIdByName |
{ docKind } |
Получить ID по имени |
getNameById |
{ docKindId } |
Получить имя по ID |
updateDockindNames |
{} |
Отложенное обновление всех имён |
Событие: onChanged — генерируется при любом изменении структуры.
4. DockindImporter
Назначение: Импорт/экспорт метаданных в форматах XML и JSON.
Методы:
| Метод | Параметры | Описание |
|---|---|---|
importXml |
{ root, vocabs, types } |
Импорт структуры из XML |
exportXml |
{ dockind } |
Экспорт структуры в XML |
5. DocDataImporter
Назначение: Импорт/экспорт данных документов (содержимого).
Методы:
| Метод | Параметры | Описание |
|---|---|---|
importXml |
{ XML } |
Импорт данных из XML |
exportXml |
{ columnsXML, filterXML } |
Экспорт данных в XML |
Классы - Хелперы
DocumentsHelper
Назначение: Высокоуровневый фасад для работы с документами. Предоставляет объектно-ориентированный API, скрывая детали низкоуровневых вызовов.
Зависимости: QueriesHelper, DockindCache, Documents, DocumentLists.
Методы:
| Метод | Описание |
|---|---|
createDocument(log, session, docKindName, trxId?) |
Создать новый документ. Возвращает Document. |
loadDocument(log, session, docKindName, documentId, trxId?) |
Загрузить существующий документ. Возвращает Document. |
loadDocList(log, session, docKindName, options) |
Загрузить список документов по фильтру. Возвращает массив Document. |
getDocKindByDocumentId(log, documentId) |
Получить тип документа по ID документа. |
Параметры options для loadDocList:
-
props: string[]— имена свойств для вывода -
filter: object— фильтр по значениям -
statuses: string[]— ограничение по статусам -
notStatuses: string[]— исключение статусов -
count: number— максимальное количество (по умолчанию 100000) -
trxId: number— идентификатор транзакции (опционально)
Пример:
const helper = new DocumentsHelper(host);
// ... зависимости подгружаются автоматически
const doc = await helper.createDocument(log, session, 'INVOICE');
await doc.setValues({ amount: 1000 }, true); // autocommit
DockindCache
Назначение: Кэширование типов документов (DocumentKind) с автоматической загрузкой и инвалидацией.
Особенности:
- Использует
MemoryCacheAsyncс TTL 10 часов, максимум 100 типов. - Предоставляет методы
getById(log, docKindId)иget(log, docKindName). - Автоматически инвалидируется при изменении структуры через событие
onChanged. Для принудительной очистки вызовитеclearCache().
Внутренние PromiseSingleton:
-
vocabNames— список справочников -
dockindNames— список типов документов
Пример:
const cache = new DockindCache(host);
const dockind = await cache.get(log, 'INVOICE');
// dockind — это DocumentKind
DocumentKind
Назначение: Модель типа документа, загружаемая из БД. Содержит всю структуру: свойства, статусы, привязки.
Свойства:
| Свойство | Тип | Описание |
|---|---|---|
id |
number |
ID типа |
name |
string |
Имя типа |
description |
string |
Описание |
tableName |
string |
Имя таблицы в БД |
properties |
DocProperty[] |
Список свойств |
propEvents |
DocEventProperty[] |
Привязки свойств к статусам (read/write/not null) |
statuses |
Array<{id, name, descr}> |
Список статусов |
loaded |
boolean |
Загружен ли объект |
Методы:
| Метод | Описание |
|---|---|
load(log) |
Загрузить структуру из БД |
getTableName() |
Получить имя таблицы |
getPropFieldName(prop) |
Получить имя поля для свойства |
getUniqueProps() |
Получить уникальные свойства |
DocProperty:
-
id,name,descr— идентификатор, имя, описание -
propKind— тип свойства (1 — строка, 9 — ссылка, 10 — справочник и т.д.) -
formatBase— базовый тип (text, numeric, timestamp, ref, int8) -
formatLogic— логический тип (text, numeric, date, ref, vocab) -
multi— множественное -
unique— уникальное -
refDocKinds— для ссылок: список допустимых типов -
fieldName— имя поля для синхронизации таблиц
Document
Назначение: Обёртка над документом с кэшированием значений и отслеживанием изменений.
Конструктор:
new Document(log, session, docKind, { Documents, QueriesHelper, trxId })
Свойства:
-
id— ID документа -
docKind— объектDocumentKind -
valuesCache— кэш значений свойств -
valuesChanged— Set имён изменённых свойств
Методы:
| Метод | Описание |
|---|---|
getValues(propNames) |
Получить значения нескольких свойств (с кэшированием) |
getValue(propName) |
Получить значение одного свойства |
setValues(values, autocommit) |
Установить значения (с отслеживанием изменений) |
commitValues() |
Сохранить накопленные изменения в БД |
insertRefs(propName, values) |
Добавить ссылки (без кэширования) |
setStatus(newStatusName) |
Сменить статус документа |
loadFromJson(data) |
Загрузить документ из JSON (полученного из listPropsByProps) |
Важно: setValues не вызывает commitValues автоматически, если autocommit = false. Это позволяет группировать изменения в рамках одной транзакции.
VocabsHelper
Назначение: Загрузка справочников по имени с кэшированием и защитой от конкурентных запросов.
Методы:
| Метод | Описание |
|---|---|
getVocab(log, vocabName) |
Получить объект Vocab по имени (загружается асинхронно) |
Пример:
const helper = new VocabsHelper(host);
const vocab = await helper.getVocab(log, 'CURRENCY');
// vocab.id — ID справочника
Vocab
Назначение: Модель справочника (пока только загружает ID по имени).
Свойства:
-
id— ID справочника -
name— имя -
loaded— флаг загрузки
DocInstaller
Назначение: Автоматическая установка структуры и данных документов из файлов при старте приложения. Используется для развёртывания типов документов и миграций.
DocInstaller (главный)
Зависимости: DockindInstaller, DocDataInstaller.
Методы (запросы):
| Метод | Описание |
|---|---|
getStatus() |
Получить статус установки |
run() |
Запустить полную установку (типы + данные) |
dockindsRun() |
Запустить только установку типов |
docDataRun() |
Запустить только установку данных |
docDataGetLast() |
Получить последнюю установленную версию данных |
Конфигурация:
-
skipInstall: true— пропустить автоматическую установку при старте.
DockindInstaller
Назначение: Установка типов документов из XML-файлов.
Путь: ./dockinds/<категория>/
Структура каталога:
dockinds/
└── my_category/
├── category.json # Метаданные категории (опционально)
├── INVOICE_types.xml # Структура типа INVOICE
└── INVOICE_vocabs.xml # Справочники для типа (опционально)
Формат category.json:
{
"name": "Моя категория",
"roles": ["ROLE_ADMIN"]
}
Логика:
- Сканирует подкаталоги в
./dockinds/. - Для каждой категории загружает все пары
*_types.xmlи*_vocabs.xml. - Вычисляет SHA-256 хеш содержимого.
- Сравнивает с хешем в таблице
DOCKIND_VERSIONS. - Если изменилось — вызывает
DockindImporter.importXml. - После успешной установки вызывает
PKG_XML_REPL_CS.REVISION_STRUCTURE.
DocDataInstaller
Назначение: Установка данных документов из XML-файлов (миграции).
Путь: ./doc-data/<номер_версии>/*.xml
Логика:
- Проверяет наличие таблицы
MIGRATIONS_DATA. - Сканирует подкаталоги в
./doc-data/с числовыми именами. - Для каждой версии, которая ещё не установлена или была с ошибкой:
- Выполняет все
*.xmlфайлы черезDocDataImporter.importXml. - В случае успеха записывает запись со статусом
done. - В случае ошибки — запись со статусом
errorи текстом ошибки.
- Выполняет все
- Если миграция завершилась ошибкой, последующие не выполняются.
Метод resolveError: Позволяет вручную пометить ошибочную миграцию как выполненную (перезапуск с этой версии пропускается).
No Comments