diff --git a/core/db_connector.js b/core/db_connector.js index 475016b..4272f1f 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -9,9 +9,10 @@ const _ = require("lodash"); //Работа с массивами и объектами const EventEmitter = require("events"); //Обработчик пользовательских событий +const dbConnSchemas = require("../models/prms_db_connector.js"); //Схемы валидации параметров const glConst = require("../core/constants.js"); //Глобальные константы const { ServerError } = require("../core/server_errors.js"); //Типовая ошибка -const { checkModuleInterface, makeModuleFullPath, checkObject } = require("../core/utils.js"); //Вспомогательные функции +const { checkModuleInterface, makeModuleFullPath, checkObject, validateObject } = require("../core/utils.js"); //Вспомогательные функции //---------- // Константы @@ -35,6 +36,7 @@ const SEVT_DB_CONNECTOR_DISCONNECTED = "DB_CONNECTOR_DISCONNECTED"; //Отклю // Тело модуля //------------ +//Класс для взаимодействия с БД class DBConnector extends EventEmitter { //Конструктор constructor(prms) { @@ -249,26 +251,23 @@ class DBConnector extends EventEmitter { //Установить состояние позиции очереди async setQueueState(prms) { if (this.bConnected) { - //Проверяем структуру переданного объекта для подключения - //let sCheckResult = checkObject(prms, { - // fields: [{ sName: "nPortionSize", bRequired: true }] - //}); + //Проверяем структуру переданных параметров + let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema); //Если структура объекта в норме - //if (!sCheckResult) { - let setStateData = { connection: this.connection }; - _.extend(setStateData, prms); - try { - let res = await this.connector.setQueueState(setStateData); - return res; - } catch (e) { - throw new ServerError(SERR_DB_EXECUTE, e.message); + if (!sCheckResult) { + //Подготовим параметры + let setStateData = { connection: this.connection }; + _.extend(setStateData, prms); + //Исполняем действие в БД + try { + let res = await this.connector.setQueueState(setStateData); + return res; + } catch (e) { + throw new ServerError(SERR_DB_EXECUTE, e.message); + } + } else { + throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult); } - //} else { - // throw new ServerError( - // glConst.SERR_OBJECT_BAD_INTERFACE, - // "Объект имеет недопустимый интерфейс: " + sCheckResult - // ); - //} } else { throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); } diff --git a/core/utils.js b/core/utils.js index b2a9995..f3422e1 100644 --- a/core/utils.js +++ b/core/utils.js @@ -7,6 +7,7 @@ // Подключение библиотек //---------------------- +const Schema = require("validate"); //Схемы валидации const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы //------------ @@ -60,6 +61,30 @@ const checkModuleInterface = (module, interface) => { return bRes; }; +//Валидация объекта +const validateObject = (obj, schema, sObjName) => { + //Объявим результат + let sRes = ""; + if (schema instanceof Schema) { + const errors = schema.validate(obj); + if (errors && Array.isArray(errors)) { + if (errors.length > 0) { + let a = errors.map(e => { + return e.message; + }); + sRes = + "Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; "); + } + } else { + sRes = "Неожиданный ответ валидатора"; + } + } else { + sRes = "Ошибочный формат схемы валидации"; + } + //Вернем результат + return sRes; +}; + //Проверка корректности полей объекта const checkObject = (obj, interface) => { //Объявим результат @@ -123,5 +148,6 @@ const makeModuleFullPath = sModuleName => { exports.isFunction = isFunction; exports.haveFunctions = haveFunctions; exports.checkModuleInterface = checkModuleInterface; +exports.validateObject = validateObject; exports.checkObject = checkObject; exports.makeModuleFullPath = makeModuleFullPath; diff --git a/models/interface_db_connector_module.js b/models/interface_db_connector_module.js new file mode 100644 index 0000000..3ada0d1 --- /dev/null +++ b/models/interface_db_connector_module.js @@ -0,0 +1,60 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: Описатель интерфейса подключаемого модуля взаимодействия с БД +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации + +//------------------ +// Интерфейс модуля +//------------------ + +/* + "getServiceFunctions", + "log", + "getQueueOutgoing", + "putQueueIncoming", + "setQueueState" + +*/ + +const validateFunctionType = val => { + let sFn = {}.toString.call(val); + console.log(sFn); + return sFn === "[object Function]" || sFn === "[object AsyncFunction]"; +}; + +//Схема валидации подключаемого модуля взаимодействия с БД +exports.dbConnectorModule = new Schema({ + //Функция подключения к БД + connect: { + use: { validateFunctionType }, + required: true, + message: { + validateFunctionType: "Функция подключения к БД (connect) имеет неверный формат", + required: "Не реализована функция подключения к БД (connect)" + } + }, + //Функция отключения от БД + disconnect: { + type: Function, + required: true, + message: { + type: "Функция отключения от БД (disconnect) имеет неверный формат", + required: "Не реализована функция отключения от БД (disconnect)" + } + }, + //Функция получения данных о сервисах + getServices: { + type: Function, + required: true, + message: { + type: "Функция получения данных сервисов (getServices) имеет неверный формат", + required: "Не реализована функция получения данных сервисов (getServices)" + } + } +}); diff --git a/models/service.js b/models/obj_service.js similarity index 99% rename from models/service.js rename to models/obj_service.js index 548099c..3d02797 100644 --- a/models/service.js +++ b/models/obj_service.js @@ -69,7 +69,7 @@ exports.schema = new Schema({ type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных", required: "Не указан числовой код типа сервиса (nSrvType)" } - }, + } /*, //Тип сервиса (строковый код) sSrvType: { type: String, @@ -82,7 +82,7 @@ exports.schema = new Schema({ } }, //Корневой каталог сервиса - sSrvRoot: {} + sSrvRoot: {}*/ //Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений) //sSrvUser: {}, //Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений) diff --git a/models/prms_db_connector.js b/models/prms_db_connector.js new file mode 100644 index 0000000..7eedd9e --- /dev/null +++ b/models/prms_db_connector.js @@ -0,0 +1,46 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: Описатели параметров процедур модуля взаимодействия с БД (класс DBConnector) +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации + +//------------------ +// Интерфейс модуля +//------------------ + +//Схема валидации параметров установки состояния позиции очереди +exports.getQueueStatePrmsSchema = new Schema({ + //Идентификатор позиции очереди + nQueueId: { + type: Number, + required: true, + message: { + type: "Идентификатор позиции очереди (nQueueId) должен быть числом", + required: "Не указан идентификатор позиции очереди (nQueueId)" + } + }, + //Код состояния + nExecState: { + type: Number, + enum: [1, 2], //!!!!!!!!!!!!!!!!!!!!!! + required: true, + message: { + type: "Код состояния (nExecState) должен быть числовым", + enum: "Указанный код состояния (nExecState) не поддерживается", + required: "Не указан код состояния (nExecState)" + } + }, + //Сообщение обработчика + sExecMsg: { + type: String, + required: false, + message: { + type: "Сообщение обработчика (sExecMsg) должно быть строкой" + } + } +}); diff --git a/package.json b/package.json index dbdcc96..8b7695c 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ }, "_moduleAliases": { "@core": "core", - "@modules": "modules" + "@modules": "modules", + "@models": "models" } } diff --git a/test.js b/test.js index 366b47a..8c8f1b0 100644 --- a/test.js +++ b/test.js @@ -4,14 +4,31 @@ */ require("module-alias/register"); -const srvModel = require("./models/service"); -const db = require("./core/db_connector.js"); //Взаимодействие с БД -const cfg = require("./config.js"); //Настройки сервера приложений +const srvModel = require("./models/obj_service"); //Модель данных сервиса +const dbConnectorModel = require("./models/prms_db_connector"); //Модель данных сервиса +const dbConnectorInterfaceModel = require("./models/interface_db_connector_module"); //Интерфейс модуля взаимодействия с БД +const utl = require("./core/utils"); //Вспомогательные функции +const db = require("./core/db_connector"); //Взаимодействие с БД +const cfg = require("./config"); //Настройки сервера приложений -//const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" }); -//errors.forEach(e => { -//console.log(e.message); -//}); +const pDB = require("./modules/parus_oracle_db"); + +let a = utl.validateObject( + { nQueueId: 123, nExecState: 123, sExecMsg: "" }, + dbConnectorModel.getQueueStatePrmsSchema, + "Тестовый" +); +console.log(a); + +let b = utl.validateObject(pDB, dbConnectorInterfaceModel.dbConnectorModule); +console.log(b); +/* +const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" }); +console.log(errors); +let a = errors.map(e => { + return e.message; +}); +console.log(a.join("; ")); const dbConn = new db.DBConnector(cfg.dbConnect); @@ -19,13 +36,19 @@ const test = async () => { await dbConn.connect(); let r = await dbConn.getOutgoing({ nPortionSize: 123 }); console.log(r); - let rr = await dbConn.setQueueState({ - nQueueId: 94568140, - nExecState: 1, - sExecMsg: "Обработано сервером приложений" - }); - console.log(rr); + try { + let rr = await dbConn.setQueueState({ + nQueueId: 94568140, + nExecState: 1, + sExecMsg: "Обработано сервером приложений" + }); + console.log(rr); + } catch (e) { + console.log(e.sMessage); + } + await dbConn.disconnect(); }; test(); +*/