From 875b11a01e5d9367850eaff1920402b34dac42b2 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 23 Nov 2018 21:21:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=85=D0=B5=D0=BC=D1=8B=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D0=B9=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0,=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=B0,=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0,=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=BE=D0=B2,=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=81=D1=85=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20=D0=B2=D0=B7=D0=B0=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=20=D0=91=D0=94,=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=83=D1=82=D0=B8=D0=BB=D0=B5=D0=B9,=20=D1=81?= =?UTF-8?q?=D1=85=D0=B5=D0=BC=D0=B0=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20=D0=B2=D0=B7=D0=B0=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/db_connector.js | 45 +++---- core/utils.js | 59 +------- models/obj_service.js | 97 +++++++++++--- models/obj_service_function.js | 231 ++++++++++++++++++++++++++++++++ models/obj_service_functions.js | 37 +++++ models/obj_services.js | 37 +++++ models/prms_db_connector.js | 2 +- test.js | 52 +++++-- 8 files changed, 445 insertions(+), 115 deletions(-) create mode 100644 models/obj_service_function.js create mode 100644 models/obj_service_functions.js create mode 100644 models/obj_services.js diff --git a/core/db_connector.js b/core/db_connector.js index 4272f1f..9d66f0f 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -9,10 +9,11 @@ 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, validateObject } = require("../core/utils.js"); //Вспомогательные функции +const glConst = require("../core/constants"); //Глобальные константы +const { ServerError } = require("../core/server_errors"); //Типовая ошибка +const { makeModuleFullPath, checkObject, validateObject } = require("../core/utils"); //Вспомогательные функции +const prmsDBConnectorSchema = require("../models/prms_db_connector.js"); //Схемы валидации параметров процедур модуля +const { intfDBConnectorModuleSchema } = require("../models/intf_db_connector_module"); //Схема валидации интерфейса модуля взаимодействия с БД //---------- // Константы @@ -59,28 +60,16 @@ class DBConnector extends EventEmitter { //Подключим модуль this.connector = require(makeModuleFullPath(prms.sConnectorModule)); //Проверим его интерфейс - if ( - !checkModuleInterface(this.connector, { - functions: [ - "connect", - "disconnect", - "getServices", - "getServiceFunctions", - "log", - "getQueueOutgoing", - "putQueueIncoming", - "setQueueState" - ] - }) - ) { - throw new ServerError( - glConst.SERR_MODULES_BAD_INTERFACE, - "Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!" - ); + let sCheckResult = validateObject( + this.connector, + intfDBConnectorModuleSchema, + "Модуль " + prms.sConnectorModule + ); + if (sCheckResult) { + throw new ServerError(glConst.SERR_MODULES_BAD_INTERFACE, sCheckResult); } //Всё успешно - сохраним настройки подключения - this.connectSettings = {}; - _.extend(this.connectSettings, prms); + this.connectSettings = _.cloneDeep(prms); //Инициализируем остальные свойства this.connection = {}; this.bConnected = false; @@ -132,9 +121,9 @@ class DBConnector extends EventEmitter { connection: this.connection, nServiceId: srv.nId }); - let tmp = {}; - _.extend(tmp, srv, { functions: [] }); - response.map(f => { + let tmp = _.cloneDeep(srv); + tmp.functions = []; + response.forEach(f => { tmp.functions.push(f); }); return tmp; @@ -252,7 +241,7 @@ class DBConnector extends EventEmitter { async setQueueState(prms) { if (this.bConnected) { //Проверяем структуру переданных параметров - let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema); + let sCheckResult = validateObject(prms, prmsDBConnectorSchema.setQueueState); //Если структура объекта в норме if (!sCheckResult) { //Подготовим параметры diff --git a/core/utils.js b/core/utils.js index f3422e1..4474e4a 100644 --- a/core/utils.js +++ b/core/utils.js @@ -7,73 +7,27 @@ // Подключение библиотек //---------------------- +const _ = require("lodash"); //Работа с массивами и объектами const Schema = require("validate"); //Схемы валидации -const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы +const { SMODULES_PATH_EX } = require("../core/constants"); //Глобавльные константы системы //------------ // Тело модуля //------------ -//Проверка на функцию -const isFunction = fnToCheck => { - let sFn = {}.toString.call(fnToCheck); - return fnToCheck && (sFn === "[object Function]" || sFn === "[object AsyncFunction]"); -}; - -//Проверка объекта на наличие списка функций -const haveFunctions = (obj, list) => { - //Объявим результат - let bRes = true; - //Если есть что проверять - if (obj && list) { - //И если пришел массив наименований функций - if (Array.isArray(list)) { - list.forEach(sFnName => { - if (!isFunction(obj[sFnName])) bRes = false; - }); - } else { - bRes = false; - } - } else { - bRes = false; - } - //Вернем результат - return bRes; -}; - -//Проверка корректности интерфейса модуля -const checkModuleInterface = (module, interface) => { - //Объявим результат - let bRes = true; - //Если есть что проверять - if (module && interface) { - //Eсли есть список функций - if (interface.functions) { - //Проверим их наличие - bRes = haveFunctions(module, interface.functions); - } else { - bRes = false; - } - } else { - bRes = false; - } - //Вернем результат - return bRes; -}; - //Валидация объекта const validateObject = (obj, schema, sObjName) => { //Объявим результат let sRes = ""; if (schema instanceof Schema) { - const errors = schema.validate(obj); + const objTmp = _.cloneDeep(obj); + const errors = schema.validate(objTmp, { strip: false }); if (errors && Array.isArray(errors)) { if (errors.length > 0) { let a = errors.map(e => { return e.message; }); - sRes = - "Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; "); + sRes = (sObjName ? sObjName + " " : "Объект ") + "имеет некорректный формат: " + a.join("; "); } } else { sRes = "Неожиданный ответ валидатора"; @@ -145,9 +99,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/obj_service.js b/models/obj_service.js index 3d02797..f46b56a 100644 --- a/models/obj_service.js +++ b/models/obj_service.js @@ -8,6 +8,7 @@ //---------------------- const Schema = require("validate"); //Схемы валидации +const { defServiceFunctions } = require("../models/obj_service_functions"); //---------- // Константы @@ -40,7 +41,7 @@ exports.SUNAVLBL_NTF_SIGN_NO = SUNAVLBL_NTF_SIGN_NO; exports.SUNAVLBL_NTF_SIGN_YES = SUNAVLBL_NTF_SIGN_YES; //Схема валидации -exports.schema = new Schema({ +exports.Service = new Schema({ //Идентификатор сервиса nId: { type: Number, @@ -59,42 +60,102 @@ exports.schema = new Schema({ required: "Не указан код сервиса (sCode)" } }, - //Тип сервиса (числовой код) + //Тип сервиса nSrvType: { type: Number, enum: [NSRV_TYPE_SEND, NSRV_TYPE_RECIVE], required: true, message: { - enum: "Значение числового кода типа сервиса (nSrvType) не поддерживается", - type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных", - required: "Не указан числовой код типа сервиса (nSrvType)" + type: "Тип сервиса (nSrvType) должен быть числом", + enum: "Значение типа сервиса (nSrvType) не поддерживается", + required: "Не указан типа сервиса (nSrvType)" } - } /*, + }, //Тип сервиса (строковый код) sSrvType: { type: String, enum: [SSRV_TYPE_SEND, SSRV_TYPE_RECIVE], required: true, message: { + type: "Строковый код типа сервиса (sSrvType) должен быть строкой", enum: "Значение строкового кода типа сервиса (sSrvType) не поддерживается", - type: "Строковый код типа сервиса (sSrvType) имеет недопустимый тип данных", required: "Не указан строковый код типа сервиса (sSrvType)" } }, //Корневой каталог сервиса - sSrvRoot: {}*/ - //Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений) - //sSrvUser: {}, - //Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений) - //sSrvPass: {}, - //Признак необходимости оповещения о простое внешнего сервиса (числовой код) - //nUnavlblNtfSign: {}, + sSrvRoot: { + type: String, + required: true, + message: { + type: "Корневой каталог сервиса (sSrvRoot) должен быть строкой", + required: "Не указан корневой каталог сервиса (sSrvRoot)" + } + }, + //Имя пользователя сервиса + sSrvUser: { + type: String, + required: false, + message: { + type: "Имя пользователя сервиса (sSrvUser) должно быть строкой", + required: "Не указано имя пользователя сервиса (sSrvUser)" + } + }, + //Пароль пользователя + sSrvPass: { + type: String, + required: false, + message: { + type: "Пароль пользователя сервиса (sSrvPass) должен быть строкой", + required: "Не указан пароль пользователя сервиса (sSrvPass)" + } + }, + //Признак необходимости оповещения о простое внешнего сервиса + nUnavlblNtfSign: { + type: Number, + enum: [NUNAVLBL_NTF_SIGN_NO, NUNAVLBL_NTF_SIGN_YES], + required: true, + message: { + type: "Признак необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign) должен быть числом", + enum: + "Значение признака необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign) не поддерживается", + required: "Не указан признак необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign)" + } + }, //Признак необходимости оповещения о простое внешнего сервиса (строковый код) - //sUnavlblNtfSign: {}, + sUnavlblNtfSign: { + type: String, + enum: [SUNAVLBL_NTF_SIGN_NO, SUNAVLBL_NTF_SIGN_YES], + required: true, + message: { + type: + "Строковый код признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign) должен быть строкой", + enum: + "Значение строкового кода признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign) не поддерживается", + required: + "Не указан строковый код признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign)" + } + }, //Максимальное время простоя (мин) удалённого сервиса для генерации оповещения - //nUnavlblNtfTime: {}, + nUnavlblNtfTime: { + type: Number, + required: true, + message: { + type: + "Максимальное время простоя (мин) удалённого сервиса для генерации оповещения (nUnavlblNtfTime) должно быть числом", + required: + "Не указано максимальное время простоя (мин) удалённого сервиса для генерации оповещения (nUnavlblNtfTime)" + } + }, //Список адресов E-Mail для оповещения о простое внешнего сервиса - //sUnavlblNtfMail: {}, + sUnavlblNtfMail: { + type: String, + required: false, + message: { + type: + "Список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail) должен быть строкой", + required: "Не указан список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail)" + } + }, //Список функций сервиса - //fn: {} + functions: defServiceFunctions(true, "functions") }); diff --git a/models/obj_service_function.js b/models/obj_service_function.js new file mode 100644 index 0000000..be8ad3c --- /dev/null +++ b/models/obj_service_function.js @@ -0,0 +1,231 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: Описатель функции сервиса +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации + +//---------- +// Константы +//---------- + +//Типы функций сервиса +const NFN_TYPE_DATA = 0; //Обмен данными +const NFN_TYPE_LOGIN = 1; //Начало сеанса +const NFN_TYPE_LOGOUT = 2; //Завершение сеанса +const SFN_TYPE_DATA = "DATA"; //Обмен данными (строковый код) +const SFN_TYPE_LOGIN = "LOGIN"; //Начало сеанса (строковый код) +const SFN_TYPE_LOGOUT = "LOGOUT"; //Завершение сеанса (строковый код) + +//Способы передачи параметров функциям сервиса +const NFN_PRMS_TYPE_POST = 0; //POST-запрос +const NFN_PRMS_TYPE_GET = 1; //GET-запрос +const SFN_PRMS_TYPE_POST = "POST"; //POST-запрос +const SFN_PRMS_TYPE_GET = "GET"; //GET-запрос + +//Расписание повторного исполнения функции +const NRETRY_SCHEDULE_UNDEF = 0; //Не определено +const NRETRY_SCHEDULE_SEC = 1; //Секунда +const NRETRY_SCHEDULE_MIN = 2; //Минута +const NRETRY_SCHEDULE_HOUR = 3; //Час +const NRETRY_SCHEDULE_DAY = 4; //Сутки +const NRETRY_SCHEDULE_WEEK = 5; //Неделя +const NRETRY_SCHEDULE_MONTH = 6; //Месяц +const SRETRY_SCHEDULE_UNDEF = "UNDEFINED"; //Не определено (строковый код) +const SRETRY_SCHEDULE_SEC = "SEC"; //Секунда (строковый код) +const SRETRY_SCHEDULE_MIN = "MIN"; //Минута (строковый код) +const SRETRY_SCHEDULE_HOUR = "HOUR"; //Час (строковый код) +const SRETRY_SCHEDULE_DAY = "DAY"; //Сутки (строковый код) +const SRETRY_SCHEDULE_WEEK = "WEEK"; //Неделя (строковый код) +const SRETRY_SCHEDULE_MONTH = "MONTH"; //Месяц (строковый код) + +//------------------ +// Интерфейс модуля +//------------------ + +//Константы +exports.NFN_TYPE_DATA = NFN_TYPE_DATA; +exports.NFN_TYPE_LOGIN = NFN_TYPE_LOGIN; +exports.NFN_TYPE_LOGOUT = NFN_TYPE_LOGOUT; +exports.SFN_TYPE_DATA = SFN_TYPE_DATA; +exports.SFN_TYPE_LOGIN = SFN_TYPE_LOGIN; +exports.SFN_TYPE_LOGOUT = SFN_TYPE_LOGOUT; +exports.NFN_PRMS_TYPE_POST = NFN_PRMS_TYPE_POST; +exports.NFN_PRMS_TYPE_GET = NFN_PRMS_TYPE_GET; +exports.SFN_PRMS_TYPE_POST = SFN_PRMS_TYPE_POST; +exports.SFN_PRMS_TYPE_GET = SFN_PRMS_TYPE_GET; +exports.NRETRY_SCHEDULE_UNDEF = NRETRY_SCHEDULE_UNDEF; +exports.NRETRY_SCHEDULE_SEC = NRETRY_SCHEDULE_SEC; +exports.NRETRY_SCHEDULE_MIN = NRETRY_SCHEDULE_MIN; +exports.NRETRY_SCHEDULE_HOUR = NRETRY_SCHEDULE_HOUR; +exports.NRETRY_SCHEDULE_DAY = NRETRY_SCHEDULE_DAY; +exports.NRETRY_SCHEDULE_WEEK = NRETRY_SCHEDULE_WEEK; +exports.NRETRY_SCHEDULE_MONTH = NRETRY_SCHEDULE_MONTH; +exports.SRETRY_SCHEDULE_UNDEF = SRETRY_SCHEDULE_UNDEF; +exports.SRETRY_SCHEDULE_SEC = SRETRY_SCHEDULE_SEC; +exports.SRETRY_SCHEDULE_MIN = SRETRY_SCHEDULE_MIN; +exports.SRETRY_SCHEDULE_HOUR = SRETRY_SCHEDULE_HOUR; +exports.SRETRY_SCHEDULE_DAY = SRETRY_SCHEDULE_DAY; +exports.SRETRY_SCHEDULE_WEEK = SRETRY_SCHEDULE_WEEK; +exports.SRETRY_SCHEDULE_MONTH = SRETRY_SCHEDULE_MONTH; + +//Схема валидации функции сервиса +exports.ServiceFunction = new Schema({ + //Идентификатор функции сервиса + nId: { + type: Number, + required: true, + message: { + type: "Идентификатор функции сервиса (nId) должен быть числом", + required: "Не указан идентификатор функции сервиса (nId)" + } + }, + //Код функции сервиса + sCode: { + type: String, + required: true, + message: { + type: "Код функции сервиса (sCode) должен быть строкой", + required: "Не указан код функции сервиса (sCode)" + } + }, + //Тип функции сервиса + nFnType: { + type: Number, + enum: [NFN_TYPE_DATA, NFN_TYPE_LOGIN, NFN_TYPE_LOGOUT], + required: true, + message: { + type: "Тип функции сервиса (nFnType) должен быть числом", + enum: "Значение типа функции сервиса (nFnType) не поддерживается", + required: "Не указан тип функции сервиса (nFnType)" + } + }, + //Тип функции сервиса (строковый код) + sFnType: { + type: String, + enum: [SFN_TYPE_DATA, SFN_TYPE_LOGIN, SFN_TYPE_LOGOUT], + required: true, + message: { + type: "Строковый код типа функции сервиса (sFnType) должен быть строкой", + enum: "Значение строкового кода типа функции сервиса (sFnType) не поддерживается", + required: "Не указан строковый код типа функции сервиса (sFnType)" + } + }, + //Адрес функции сервиса + sFnURL: { + type: String, + required: true, + message: { + type: "Адрес функции сервиса (sFnURL) должен быть строкой", + required: "Не указан адрес функции сервиса (sFnURL)" + } + }, + //Способ передачи параметров функции сервиса + nFnPrmsType: { + type: Number, + enum: [NFN_PRMS_TYPE_GET, NFN_PRMS_TYPE_POST], + required: true, + message: { + type: "Способ передачи параметров функции сервиса (nFnPrmsType) должен быть числом", + enum: "Значение способа передачи параметров функции сервиса (nFnPrmsType) не поддерживается", + required: "Не указан способ передачи параметров функции сервиса (nFnPrmsType)" + } + }, + //Способ передачи параметров функции сервиса (строковый код) + sFnPrmsType: { + type: String, + enum: [SFN_PRMS_TYPE_GET, SFN_PRMS_TYPE_POST], + required: true, + message: { + type: "Строковый код способа передачи параметров функции сервиса (sFnPrmsType) должен быть строкой", + enum: + "Значение строкового кода способа передачи параметров функции сервиса (sFnPrmsType) не поддерживается", + required: "Не указан строковый код способа передачи параметров функции сервиса (sFnPrmsType)" + } + }, + //График повторной отправки запроса функции сервиса + nRetrySchedule: { + type: Number, + enum: [ + NRETRY_SCHEDULE_UNDEF, + NRETRY_SCHEDULE_SEC, + NRETRY_SCHEDULE_MIN, + NRETRY_SCHEDULE_HOUR, + NRETRY_SCHEDULE_DAY, + NRETRY_SCHEDULE_WEEK, + NRETRY_SCHEDULE_MONTH + ], + required: true, + message: { + type: "График повторной отправки запроса функции сервиса (nRetrySchedule) должен быть числом", + enum: "Значение графика повторной отправки запроса функции сервиса (nRetrySchedule) не поддерживается", + required: "Не указан график повторной отправки запроса функции сервиса (nRetrySchedule)" + } + }, + //График повторной отправки запроса функции сервиса (строковый код) + sRetrySchedule: { + type: String, + enum: [ + SRETRY_SCHEDULE_UNDEF, + SRETRY_SCHEDULE_SEC, + SRETRY_SCHEDULE_MIN, + SRETRY_SCHEDULE_HOUR, + SRETRY_SCHEDULE_DAY, + SRETRY_SCHEDULE_WEEK, + SRETRY_SCHEDULE_MONTH + ], + required: true, + message: { + type: + "Строковый код графика повторной отправки запроса функции сервиса (sRetrySchedule) должен быть строкой", + enum: + "Значение строкового кода графика повторной отправки запроса функции сервиса (sRetrySchedule) не поддерживается", + required: "Не указан строковый код графика повторной отправки запроса функции сервиса (sRetrySchedule)" + } + }, + //Идентификатор типового сообщения обмена, обрабатываемого функцией сервиса + nMsgId: { + type: Number, + required: true, + message: { + type: + "Идентификатор типового сообщения обмена, обрабатываемого функцией сервиса (nMsgId) должен быть числом", + required: "Не указан идентификатор типового сообщения обмена, обрабатываемого функцией сервиса (nMsgId)" + } + }, + //Код типового сообщения обмена, обрабатываемого функцией сервиса + sMsgCode: { + type: String, + required: true, + message: { + type: "Код типового сообщения обмена, обрабатываемого функцией сервиса (sMsgCode) должен быть строкой", + required: "Не указан код типового сообщения обмена, обрабатываемого функцией сервиса (sMsgCode)" + } + }, + //Обработчик сообщения "до" на строне сервера приложений для функции сервиса + sAppSrvBefore: { + type: String, + required: false, + message: { + type: + 'Обработчик сообщения "до" на строне сервера приложений для функции сервиса (sAppSrvBefore) должен быть строкой', + required: + 'Не указан обработчик сообщения "до" на строне сервера приложений для функции сервиса (sAppSrvBefore)' + } + }, + //Обработчик сообщения "после" на строне сервера приложений для функции сервиса + sAppSrvAfter: { + type: String, + required: false, + message: { + type: + 'Обработчик сообщения "после" на строне сервера приложений для функции сервиса (sAppSrvAfter) должен быть строкой', + required: + 'Не указан обработчик сообщения "после" на строне сервера приложений для функции сервиса (sAppSrvBefore)' + } + } +}); diff --git a/models/obj_service_functions.js b/models/obj_service_functions.js new file mode 100644 index 0000000..78cd2ed --- /dev/null +++ b/models/obj_service_functions.js @@ -0,0 +1,37 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: Описатель списка функций сервиса +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации +const { ServiceFunction } = require("../models/obj_service_function"); //Схема валидации функции сервиса + +//------------ +// Тело модуля +//------------ + +//Описатель схемы валидации списка функций сервиса +const defServiceFunctions = (bRequired, sName) => { + return { + type: Array, + required: bRequired, + each: ServiceFunction, + message: { + required: "Не указан список функций сервиса (" + sName + ")" + } + }; +}; + +//------------------ +// Интерфейс модуля +//------------------ + +//Описатель схемы валидации списка функций сервиса +exports.defServiceFunctions = defServiceFunctions; + +//Схема валидации списка функций сервиса +exports.ServiceFunctions = new Schema({ functions: defServiceFunctions(true, "functions") }); diff --git a/models/obj_services.js b/models/obj_services.js new file mode 100644 index 0000000..9db6338 --- /dev/null +++ b/models/obj_services.js @@ -0,0 +1,37 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: Описатель списка сервисов +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации +const { Service } = require("../models/obj_service"); + +//------------ +// Тело модуля +//------------ + +//Описатель схемы валидации списка сервисов +const defServices = (bRequired, sName) => { + return { + type: Array, + required: bRequired, + each: Service, + message: { + required: "Не указан список сервисов (" + sName + ")" + } + }; +}; + +//------------------ +// Интерфейс модуля +//------------------ + +//Описатель схемы валидации списка сервисов +exports.defServices = defServices; + +//Схема валидации списка сервисов +exports.Services = new Schema({ services: defServices(true, "services") }); diff --git a/models/prms_db_connector.js b/models/prms_db_connector.js index 7eedd9e..326a96f 100644 --- a/models/prms_db_connector.js +++ b/models/prms_db_connector.js @@ -14,7 +14,7 @@ const Schema = require("validate"); //Схемы валидации //------------------ //Схема валидации параметров установки состояния позиции очереди -exports.getQueueStatePrmsSchema = new Schema({ +exports.setQueueState = new Schema({ //Идентификатор позиции очереди nQueueId: { type: Number, diff --git a/test.js b/test.js index 6938fe8..1eb551e 100644 --- a/test.js +++ b/test.js @@ -4,8 +4,11 @@ */ require("module-alias/register"); +const srvsModel = require("./models/obj_services"); //Модель данных списка сервисов const srvModel = require("./models/obj_service"); //Модель данных сервиса -const dbConnectorModel = require("./models/prms_db_connector"); //Модель данных сервиса +const srvFnModel = require("./models/obj_service_function"); //Модель данных функции сервиса +const srvFnSModel = require("./models/obj_service_functions"); //Модель данных функции сервиса +const dbConnectorModel = require("./models/prms_db_connector"); //Описатели параметров функций модуля подключения к БД const dbConnectorInterfaceModel = require("./models/intf_db_connector_module"); //Интерфейс модуля взаимодействия с БД const utl = require("./core/utils"); //Вспомогательные функции const db = require("./core/db_connector"); //Взаимодействие с БД @@ -13,20 +16,41 @@ const cfg = require("./config"); //Настройки сервера прило const pDB = require("./modules/parus_oracle_db"); -let a = utl.validateObject( - { nQueueId: 123, nExecState: 123, sExecMsg: "" }, - dbConnectorModel.getQueueStatePrmsSchema, - "Тестовый" -); -console.log(a); +//let a = utl.validateObject( +// { nQueueId: 123, nExecState: 123, sExecMsg: "" }, +// dbConnectorModel.getQueueStatePrmsSchema, +// "Тестовый" +//); +//console.log(a); + +//let b = utl.validateObject( +// pDB, +// dbConnectorInterfaceModel.dbConnectorModule, +// "Пользовательский модуль подключения к БД" +//); +//if (b) console.log(b); +//else console.log("Нет ошибок в модуле"); + +const getServices = async () => { + let d = new db.DBConnector(cfg.dbConnect); + await d.connect(); + r = await d.getServices(); + await d.disconnect(); + console.log(r); + let errs = utl.validateObject(r[1], srvModel.Service, "Сервис"); + let errs2 = utl.validateObject({ functions: r[1].functions }, srvFnSModel.ServiceFunctions, "Функция сервиса"); + let errs3 = utl.validateObject({ services: r }, srvsModel.Services, "Список сервисов"); + console.log(r[1].functions[0]); + if (errs2) console.log(errs2); + else console.log("Нет ошибок в функции сервиса"); + if (errs) console.log(errs); + else console.log("Нет ошибок в сервисе"); + if (errs3) console.log(errs3); + else console.log("Нет ошибок в списке сервисов"); +}; + +getServices(); -let b = utl.validateObject( - pDB, - dbConnectorInterfaceModel.dbConnectorModule, - "Пользовательский модуль подключения к БД" -); -if (b) console.log(b); -else console.log("Нет ошибок в модуле"); /* const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" }); console.log(errors);