Пакет @morphcluster/carabi
Документация сервисов хоста PgDocuments
Обзор
ПХост PgDocuments предоставляет клиентские обёртки, хелперы и утилиты для работы с базой данных, документами, справочниками и миграциями.
Клиенты удалённых сервисов
Все клиенты предоставляют методы, соответствующие удалённым запросам:
OraLongTransactions- клиентдля упработы с двлинными транзакциями Oracle-адаптера. (см. хост Postgres).OraQueries- клиент для выполненияобычных (без транзакций) запросов в стиле Oracle.PgQueryPool- клиент для работы с прямым пулом PostgreSQL (если используется режимpg).Documents- низкоуровневая работа синформационными объектами (документами)бв систезме MorphCluster. Основная функциональность включалидацииет:и- Управ
. DocumentLists- расширленныиезапструктуросыйстиписков документовс(DocKind)фильтрацией по статусам.DockindStructure- работа со структурой информационных объектов (типы,— свойства, статусы, действия, права).
проверкиУтилиты SQLSqlQueryНазначение:пдострупа- Управ
- Рабо
ениета сложных SQL-запросов программным способом. Поддерживает SELECT, FROM, JOIN, WHERE, ORDER BY, LIMIT/OFFSET.const q = new SqlQuery() .select(['u.id', 'u.name']) .from('users', 'u') .leftJoin('orders', 'o', new WhereCondition('simple', 'u.id = o.user_id')) .orderBy('u.name'); const sql = q.build({ pretty: true });
амиПодробнее в отдельномдокументеSqlModifyНазначение:упрощает— созданиезапросовINSERTиUPDATE.const mod = new SqlModify('users'); mod.set('name','varchar2', 'Alice'); mod.set('age', 'number', 30); mod.setId('id', 'number', 123); const { sql, params } = mod.getUpdateQuery();Мечтоды:МетодОписаниеset(column, type, value) ртЗадать значение, обновление, удаление- Импорт/экспо
лонкиsetId(column, type, value)Зметадатьнных и данных в XML/JSON- Генерация и синхронизация таблиц документ
ификатор записиgetInsertQuery()Возвращает{sql, params}для INSERT ... RETURNINGgetUpdateQuery()Возвращает{sql, params}для UPDATEПараметры формируютсяввидеPostgreSQL - Импорт/экспо
- Выполнени
я запросов ке баизнеданныхс-логики через функции и действия
{ name, type, value }QueriesHelperСервисы-помошники
QueriesHelper
универсальный сервис-помощник для в
Структура сервисов
Клиентыбр (ServiceNats)
Клиенты не описываются в данныой документадаптерции, (но они исполoraи pg). Являеьзуются псервисами для медпжсервисночтительным спгособом взаимодействия:
-
Eventer — отправка событий,
БДуправление пользовательскими соединениями -
SysProcesses — управлени
кле фоновыми бизнес-процессадми
Основныхе сервисах.
Подробнее смотрите в отдельном разделе
OLTHelper1. DockindStructure
УОтветственность: Упраревший, сейчас его замленил QueriesHelper. Класс-помощник для упрощённой работы с длинными транзакциями (OraLongTransactions).
Не является сервисом, это обычный класс, который нужно создавать вручную.
Конструктурой типов документов (DocKind): статусы, свойства, функции, действия, права доступа, правила именования.
Зависимости: QueriesHelper, OraLongTransactions, SysProcesses
События:
new OLTHelper(oltServiceInstance, workspace, oltId?, log, options?)
-
oltServiceInstanceonChanged–—экземпляр клигентаOraLongTransactions. workspace–ерабочируее пространство (обычно"main").oltId– ID существующей транзакции (если не указана, создаётсяавтоматическиприпервлюбомвизменении структурызтипа довкуме).log– экземплярLogger.options–{ userId?, noUser? }.нта
Основные методы:
| Метод | Описание |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Методы автоматически вызывают create(), если транзакция ещё не создана.
Пример:
const olt = new OLTHelper(this.OraLongTransactions, 'main', null, log, getInfo({ noUser: truedocKind });
await olt.execFunc('PKG_TEST.DO_SOMETHING', { param1: 1 });
const rows = await olt.fetch(olt.result, 100);
await olt.commit();
Работа с документами
DockindCache
Сервис кэширования метаданных типов документов (DocumentKind) и имён справочников. Автоматически сбрасывает кэш при получении события onChanged от DockindStructure.
Методы:
| |
Получить базовую информацию о типе док |
setMain({ oldDocKind, newDocKind, description, parentId }) |
Обновить основную информацию (только описание и родительскую папку) | |
getStatuses({ docKind, docKindId }) |
Получить список статусов |
|
|
Обновить статусы: удалить, изменить, добавить, переупорядочить | |
|
Получить список свойств типа документа | |
setProps({ docKind, props, deleteIds }) |
Обновить свойства: удалить, изменить, добавить | |
setProperty({ docKindId, property }) |
Внутренний метод для сохранения одного свойства с его статусными масками и ссылками | |
getFunctions({ docKind, docKindId }) |
Получить функции, привязанные к типу документа | |
setFunctions({ docKind, funcs, deleteIds }) |
Обновить функции (DB или CSP) с их привязкой к статусам и свойствам | |
setActions({ docKind, deleteIds, actions }) |
Обновить действия (переходы между |
|
setNames({ docKind, names }) |
Обновить правила именования документов | |
setPermissions({ docKind, roles, deleteRoleIds }) |
Установить права доступа для ролей (создание, видимость/редактирование статусов и свойств) | |
getIdByName( | docKind |
Получить ID типа документа по имени |
getNameById( | docKindId |
Получить имя типа документа по ID |
|
||
createDbFunction({ schema, name }) |
Создать пустую PL/pgSQL-функцию, если она не существует |
DocumentKind2. Documents
Ответственность: Низкоуровневая работа с документами — чтение/запись значение: представляет метаданные одного типай, информационногя о объекта (документа).е, Загпружается из БД човерезка CSP_DOCUMENTS.GET_DOCKIND_INFO и свобязанныте запросы.
Конструктор:
new DocumentKind(queriesHelper)
После создания нужно вызвать await docKind.load(log).
Основные свойства (после загрузки):
name,id,description,tableNameproperties– массивDocPropertypropEvents– массивDocEventPropertystatuses– массив объектов{id, name, descr}
Методы:
getTableName()– имя таблицы БД для этого типа.getPropFieldName(prop)– имя колонки для свойства.getUniqueProps()– массив уникальныхсвойств.
Класс DocProperty:
{
id, name, fieldName, propKind,
formatBase, formatLogic,
object, multi, unique,
fpath, SQL, rule, raw
}
Класс DocEventProperty:
{
propId, statusId,
writable, readable, notNull
}
Справочники
VocabsHelper
Назначение: сервис для загрузки и кэширования справочников.
Методы:
| |
При первом запросе загружает справочник асинхронно, последующие вызовы возвращают уже загруженный экземпляр.
Vocab
Назначение: представляет один справочник (простейшая модель).
Конструктор: new Vocab(name, queriesHelper)
Методы:
load(log)– загружает ID справочника по имени.
Свойства после загрузки: id, name, loaded = true.
Document
Назначение: представляет один экземпляр информационного объекта с кэшированием значений и отслеживанием изменений.
КЗависимонструктори: QueriesHelper, DockindCache
new Document(log, session, docKind, { Documents, QueriesHelper, trxId? })
Основные методы:
| Метод | Описание |
|---|---|
|
|
getDescr({ documentId }) |
Получить описан |
getValues( |
Получить значения указанных свойств документа ( |
| setValues({ |
|
Установить значения | рамках
| |
insertRefs({ dockind, documentId, propName, |
Добавить ссылки |
|
Пример:
const doc = new Document(log, session, dockind, { QueriesHelper: this.QueriesHelper, Documents: this.Documents, trxId });
doc.id = 123;
await doc.getValues(['Name', 'Age']);
await doc.setValues({ Name: 'Alice' }); // изменится, но не сохранено
await doc.setValues({ Age: 30 }, false); // ещё измененгие
await doc.commitValues(); // одно сохранение двух полей
DocumentsHelper
Назначение: высокоуровневый сервис для работы с документами. Создаёт документы в множественное ссылочное поле
deleteRefs({ dockind, documentId, propName, values })checkNull({ dockind, documentId })3. DocumentLists
Ответственность: пПоиск и выборка списков документов по значениям свойств.
МЗависимости: QueriesHelper, DockindCache, Documents
Основные методы:
| Метод | |
|---|---|
listIdByProps({ dockind, values, statuses, notStatuses, count }) |
Найти ID документов по значениям свойств (AND-условия) |
listPropsByProps({ dockind, props, filter, statuses, notStatuses, count }) |
Выбрать документы с указанными полями для вывода |
listByUniqueFields({ dockind, values }) |
Найти документы по уникальным полям (автоматически определяются по конфигурации) |
getUniqueCollisions({ dockind, documentId }) |
Найти документы с конфликтами по уникальным полям (исключая переданный ID) |
4. DocumentFuncs
Ответственность: Выполнение бизнес-функций, привязанных к статурсам и свойствам документов.
Зависимости: QueriesHelper, DockindCache, Documents, GlobalServices, Eventer
Основные методы:
| Метод | Описание |
|---|---|
|
Выполнить все функции, привязанные к указанному статусу (pre- или post-process) |
|
Выполнить функции, привязанные к изменению свойства |
processAnykindFuncs({ dockind, documentId, params, session }) |
Выполнить глобальные (anykind) функции для документа |
runFunc({ func, dockind, documentId, params, session, trxId }) |
Выполнить конкретную функцию (DB или CSP) |
Поддерживаемые типы функций:
-
DB — вызов хранимой процедуры PostgreSQL (формат
schema.function) -
CSP — вызов метода удалённого сервиса (формат
ServiceName.method)
5. DocCardValues
Ответственность: Высокоуровневая работа со значениями документов в контексте карточки (UI-транзакции).
Зависимости: QueriesHelper, DockindCache, Documents, DocumentFuncs, DocumentLists
Основные методы:
| Метод | Описание |
|---|---|
getValDisplay({ documentId, propName }) |
Получить отображаемое значение поля (например, имя справочника вместо ID) |
getValues({ documentId, propName }) |
Получить массив значений простого поля |
setValues({ cardId, documentId, propName, value/values }) |
Установить значения простого поля в рамках карточной транзакции |
getRefs({ documentId, propName }) |
Получить список связанных документов для ссылочного поля |
setRefs({ cardId, documentId, propName, refDocumentIds }) |
Заменить весь список связанных документов |
clearRefs({ cardId, documentId, propName }) |
Очистить ссылочное поле |
insertRefs({ cardId, documentId, propName, refDocumentIds }) |
Добавить ссылки в множественное поле |
deleteRefs({ cardId, documentId, propName, refDocumentIds }) |
Удалить указанные ссылки |
createRefDoc({ cardId, documentId, propName, parentId }) |
Создать новый документ, привязанный к ссылолю |
|
Удалить связанные документы (полное удаление) |
|
За |
rollback({ cardId }) |
Откатить |
6. DocCardActions
Ответственность: Выполнение действий (переходов междующ статусами) с документами.
Зависимости: QueriesHelper, DockindCache, Documents, DocumentFuncs, DocCardValues, SysProcesses, DocumentLists
Основные методы:
| Метод | Описание |
|---|---|
runActions({ dockind, documentIds, actionId, actParams, cardId, session }) |
Выполнить действие над одним или несколькими документами |
runAction({ dockind, documentId, action, actParams, cardId, session }) |
Внутренний метод выполнения одного действия (проверка статуса, смена статуса, вызов функций) |
runGlobalAction({ action, actParams, cardId, session }) |
Выполнить глобальное действие (без привязки к документу) |
create({ dockind, parentId, classifPropId, classifId, session }) |
Создать новый документ с опциональным родителем и классификатором |
|
Пометить документы как удалённые и запустить фоновую очистку |
|
Отложенная постобработка удаления (вызов функций статуса "deleted", физическое удаление) |
Логика действия:
- Проверка допустимости текущего статуса (
FROM_STATUS_IDS) - (Опционально) Смена статуса на
TO_STATUS_IDс вызовом pre-process функций - (Опционально) Вызов функции, привязанной к действию
- Запуск post-process функций для нового статуса
- Запуск глобальных (anykind) функций
7. DocTables
Ответственность: Генерация и синхронизация струзктур таблить списокц документов в PostgreSQL для быс фильтрого поиска и отчетов.
Зависимости: QueriesHelper, OraLongTransactions, DockindCache
Основные методы:
| Метод | Описание |
|---|---|
recreate({ docKind }) |
Полностью пересоздать таблицу, представление и процедуру синхронизации для типа, затем синхронизировать все данные |
recreateStruct({ docKind }) |
Пересоздать только структуру таблицы (без представления и данных) |
recreateView({ docKind }) |
Пересоздать представление для типа документа (объединяет основную таблицу и словари) |
recreateAll({}) |
Пересоздать структуры для всех типов документов (последовательно) |
createSyncProcedure({ dockind }) |
Сгенерировать PL/pgSQL-процедуру синхронизации для типа |
documentSync({ docKind, documentId }) |
Синхронизировать один документ с его таблицей |
|
Синхронизировать все документы указанного типа (пакетная обработка) |
Архитектура таблиц:
- Основная таблица:
→doc_tables.<dockind>_tDocumentKind— содержит single-свойства - Дочерние таблицы:
doc_tables.<dockind>_t_<prop>— для multi-свойств - Представление:
doc_tables.<dockind>_v— объединяет данные для удобного чтения
8. DockindImporter
Ответственность: Импорт метаданных из XML и JSON в базу данных.
Зависимости: DockindStructure, QueriesHelper, DocumentsHelper, OraLongTransactions
Основные методы:
| Метод | Описание |
|---|---|
importXml({ root, vocabs, types }) |
|
importJson({ root, data }) |
Импорт структуры из JSON |
Внутренние классы:
- XmlImporter — парсинг XML, создание/обновление словарей, типов, статусов, свойств, действий, имён, функций
- JsonImporter — аналогичный функционал для JSON (более современный формат)
Поддерживаемые сущности при импорте (JSON):
- Словари (
vocabs) - Типы документов (
name,descr) - Статусы (
statusesс цветами, функциями, правами) - Свойства (
propsс типом, мульти, уникальностью, статусными масками, ссылками, правами, функциями) - Правила именования (
names) - Действия (
actionsс условиями, переходами, правами, функциями) - Права доступа (
permissionsна уровне ролей)
9. DockindExporter
Ответственность: Экспорт метаданных типа документа в JSON.
Зависимости: DockindStructure, QueriesHelper, DocumentsHelper, OraLongTransactions
Основные методы:
| Метод | Описание |
|---|---|
exportJson({ dockind }) |
Экспортировать полную структуру типа документа в JSON |
Внутренний класс: JsonExporter
Экспортируемые данные:
- Основная информация (
name,descr) - Используемые словари (
vocabsсо значениями) - Статусы (
statusesс цветами, правами, функциями) - Свойства (
propsс типами, параметрами, статусными масками, ссылками, правами, функциями) - Правила именования (
names) - Действия (
actionsс условиями, переходами, правами, функциями)
10. DocDataImporter
Ответственность: Импорт данных документов из внешних источников (XML).
Зависимости: QueriesHelper, DocumentsHelper, DockindCache, Documents
Основные методы:
| Метод | Описание |
|---|---|
importXml({ dataXml, uniqueProps }) |
Импортировать данные документов из XML |
Логика импорта:
- Парсинг XML, извлечение структуры документов
- Для каждого документа:
- Поиск существующего документа по
ID эуникзеальнымпляраПараметрыloadDocList:{ props: ['Name', 'Age'], //полямд(есля выборкиfilter: { Name: 'Alice' }, // фильтр statuses: ['Active'], // огруказаны) - Если
чнайден — применение правил слияния (добавление, перезапись, стирание) - Если не найден — создание нового документа
- Поиск существующего документа по
- Заполнение свойств документа (включая ссылки на подчинённые документы)
- Установка статуса
Правила слияния:
-
0— значение не меняется -
['Deleted'],2//— добавление новых значений в множество -
3— перезапись значения -
4— стирание значения
Вспомогательные модули
db-functions.mjs
Содержит определения SQL-функций для csp_documents (схема CSP-документов). Эти функции используются сервисами для работы с базой данных:
-
get_all_dockinds— получить все типы документов -
get_document_info— получить информациючо документе -
get_dockind_id_by_name/get_dockind_name_by_id— преобразование ID/имыени -
get_dockind_props— свойства типа документа -
get_dockind_prop_events— статусныеcount:маски100,свойств -
nullget_document_values}/get_document_refs— чтение значений и ссылок - и другие
DocFunctionsInstaller
Наследуется от DbFunctionsInstaller и устанавливает функции из db-functions.mjs при старте сервиса.