forked from CITKParus/P8-ExchangeService
Схемы валидаций функции сервиса, списка функций сервиса, сервиса, списка сервисов, небольшой рефакторинг схемы валидации параметров модуля взаимодействия с БД, удаление лишного из утилей, схема валидации интерфейса пользовательского модуля взаимодействия с БД
This commit is contained in:
parent
d062a0d32e
commit
875b11a01e
@ -9,10 +9,11 @@
|
|||||||
|
|
||||||
const _ = require("lodash"); //Работа с массивами и объектами
|
const _ = require("lodash"); //Работа с массивами и объектами
|
||||||
const EventEmitter = require("events"); //Обработчик пользовательских событий
|
const EventEmitter = require("events"); //Обработчик пользовательских событий
|
||||||
const dbConnSchemas = require("../models/prms_db_connector.js"); //Схемы валидации параметров
|
const glConst = require("../core/constants"); //Глобальные константы
|
||||||
const glConst = require("../core/constants.js"); //Глобальные константы
|
const { ServerError } = require("../core/server_errors"); //Типовая ошибка
|
||||||
const { ServerError } = require("../core/server_errors.js"); //Типовая ошибка
|
const { makeModuleFullPath, checkObject, validateObject } = require("../core/utils"); //Вспомогательные функции
|
||||||
const { checkModuleInterface, makeModuleFullPath, checkObject, validateObject } = require("../core/utils.js"); //Вспомогательные функции
|
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));
|
this.connector = require(makeModuleFullPath(prms.sConnectorModule));
|
||||||
//Проверим его интерфейс
|
//Проверим его интерфейс
|
||||||
if (
|
let sCheckResult = validateObject(
|
||||||
!checkModuleInterface(this.connector, {
|
this.connector,
|
||||||
functions: [
|
intfDBConnectorModuleSchema,
|
||||||
"connect",
|
"Модуль " + prms.sConnectorModule
|
||||||
"disconnect",
|
|
||||||
"getServices",
|
|
||||||
"getServiceFunctions",
|
|
||||||
"log",
|
|
||||||
"getQueueOutgoing",
|
|
||||||
"putQueueIncoming",
|
|
||||||
"setQueueState"
|
|
||||||
]
|
|
||||||
})
|
|
||||||
) {
|
|
||||||
throw new ServerError(
|
|
||||||
glConst.SERR_MODULES_BAD_INTERFACE,
|
|
||||||
"Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!"
|
|
||||||
);
|
);
|
||||||
|
if (sCheckResult) {
|
||||||
|
throw new ServerError(glConst.SERR_MODULES_BAD_INTERFACE, sCheckResult);
|
||||||
}
|
}
|
||||||
//Всё успешно - сохраним настройки подключения
|
//Всё успешно - сохраним настройки подключения
|
||||||
this.connectSettings = {};
|
this.connectSettings = _.cloneDeep(prms);
|
||||||
_.extend(this.connectSettings, prms);
|
|
||||||
//Инициализируем остальные свойства
|
//Инициализируем остальные свойства
|
||||||
this.connection = {};
|
this.connection = {};
|
||||||
this.bConnected = false;
|
this.bConnected = false;
|
||||||
@ -132,9 +121,9 @@ class DBConnector extends EventEmitter {
|
|||||||
connection: this.connection,
|
connection: this.connection,
|
||||||
nServiceId: srv.nId
|
nServiceId: srv.nId
|
||||||
});
|
});
|
||||||
let tmp = {};
|
let tmp = _.cloneDeep(srv);
|
||||||
_.extend(tmp, srv, { functions: [] });
|
tmp.functions = [];
|
||||||
response.map(f => {
|
response.forEach(f => {
|
||||||
tmp.functions.push(f);
|
tmp.functions.push(f);
|
||||||
});
|
});
|
||||||
return tmp;
|
return tmp;
|
||||||
@ -252,7 +241,7 @@ class DBConnector extends EventEmitter {
|
|||||||
async setQueueState(prms) {
|
async setQueueState(prms) {
|
||||||
if (this.bConnected) {
|
if (this.bConnected) {
|
||||||
//Проверяем структуру переданных параметров
|
//Проверяем структуру переданных параметров
|
||||||
let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema);
|
let sCheckResult = validateObject(prms, prmsDBConnectorSchema.setQueueState);
|
||||||
//Если структура объекта в норме
|
//Если структура объекта в норме
|
||||||
if (!sCheckResult) {
|
if (!sCheckResult) {
|
||||||
//Подготовим параметры
|
//Подготовим параметры
|
||||||
|
@ -7,73 +7,27 @@
|
|||||||
// Подключение библиотек
|
// Подключение библиотек
|
||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
|
const _ = require("lodash"); //Работа с массивами и объектами
|
||||||
const Schema = require("validate"); //Схемы валидации
|
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) => {
|
const validateObject = (obj, schema, sObjName) => {
|
||||||
//Объявим результат
|
//Объявим результат
|
||||||
let sRes = "";
|
let sRes = "";
|
||||||
if (schema instanceof Schema) {
|
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 && Array.isArray(errors)) {
|
||||||
if (errors.length > 0) {
|
if (errors.length > 0) {
|
||||||
let a = errors.map(e => {
|
let a = errors.map(e => {
|
||||||
return e.message;
|
return e.message;
|
||||||
});
|
});
|
||||||
sRes =
|
sRes = (sObjName ? sObjName + " " : "Объект ") + "имеет некорректный формат: " + a.join("; ");
|
||||||
"Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; ");
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sRes = "Неожиданный ответ валидатора";
|
sRes = "Неожиданный ответ валидатора";
|
||||||
@ -145,9 +99,6 @@ const makeModuleFullPath = sModuleName => {
|
|||||||
// Интерфейс модуля
|
// Интерфейс модуля
|
||||||
//-----------------
|
//-----------------
|
||||||
|
|
||||||
exports.isFunction = isFunction;
|
|
||||||
exports.haveFunctions = haveFunctions;
|
|
||||||
exports.checkModuleInterface = checkModuleInterface;
|
|
||||||
exports.validateObject = validateObject;
|
exports.validateObject = validateObject;
|
||||||
exports.checkObject = checkObject;
|
exports.checkObject = checkObject;
|
||||||
exports.makeModuleFullPath = makeModuleFullPath;
|
exports.makeModuleFullPath = makeModuleFullPath;
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
const Schema = require("validate"); //Схемы валидации
|
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.SUNAVLBL_NTF_SIGN_YES = SUNAVLBL_NTF_SIGN_YES;
|
||||||
|
|
||||||
//Схема валидации
|
//Схема валидации
|
||||||
exports.schema = new Schema({
|
exports.Service = new Schema({
|
||||||
//Идентификатор сервиса
|
//Идентификатор сервиса
|
||||||
nId: {
|
nId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
@ -59,42 +60,102 @@ exports.schema = new Schema({
|
|||||||
required: "Не указан код сервиса (sCode)"
|
required: "Не указан код сервиса (sCode)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
//Тип сервиса (числовой код)
|
//Тип сервиса
|
||||||
nSrvType: {
|
nSrvType: {
|
||||||
type: Number,
|
type: Number,
|
||||||
enum: [NSRV_TYPE_SEND, NSRV_TYPE_RECIVE],
|
enum: [NSRV_TYPE_SEND, NSRV_TYPE_RECIVE],
|
||||||
required: true,
|
required: true,
|
||||||
message: {
|
message: {
|
||||||
enum: "Значение числового кода типа сервиса (nSrvType) не поддерживается",
|
type: "Тип сервиса (nSrvType) должен быть числом",
|
||||||
type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных",
|
enum: "Значение типа сервиса (nSrvType) не поддерживается",
|
||||||
required: "Не указан числовой код типа сервиса (nSrvType)"
|
required: "Не указан типа сервиса (nSrvType)"
|
||||||
}
|
}
|
||||||
} /*,
|
},
|
||||||
//Тип сервиса (строковый код)
|
//Тип сервиса (строковый код)
|
||||||
sSrvType: {
|
sSrvType: {
|
||||||
type: String,
|
type: String,
|
||||||
enum: [SSRV_TYPE_SEND, SSRV_TYPE_RECIVE],
|
enum: [SSRV_TYPE_SEND, SSRV_TYPE_RECIVE],
|
||||||
required: true,
|
required: true,
|
||||||
message: {
|
message: {
|
||||||
|
type: "Строковый код типа сервиса (sSrvType) должен быть строкой",
|
||||||
enum: "Значение строкового кода типа сервиса (sSrvType) не поддерживается",
|
enum: "Значение строкового кода типа сервиса (sSrvType) не поддерживается",
|
||||||
type: "Строковый код типа сервиса (sSrvType) имеет недопустимый тип данных",
|
|
||||||
required: "Не указан строковый код типа сервиса (sSrvType)"
|
required: "Не указан строковый код типа сервиса (sSrvType)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
//Корневой каталог сервиса
|
//Корневой каталог сервиса
|
||||||
sSrvRoot: {}*/
|
sSrvRoot: {
|
||||||
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
type: String,
|
||||||
//sSrvUser: {},
|
required: true,
|
||||||
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
message: {
|
||||||
//sSrvPass: {},
|
type: "Корневой каталог сервиса (sSrvRoot) должен быть строкой",
|
||||||
//Признак необходимости оповещения о простое внешнего сервиса (числовой код)
|
required: "Не указан корневой каталог сервиса (sSrvRoot)"
|
||||||
//nUnavlblNtfSign: {},
|
}
|
||||||
|
},
|
||||||
|
//Имя пользователя сервиса
|
||||||
|
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 для оповещения о простое внешнего сервиса
|
//Список адресов E-Mail для оповещения о простое внешнего сервиса
|
||||||
//sUnavlblNtfMail: {},
|
sUnavlblNtfMail: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
message: {
|
||||||
|
type:
|
||||||
|
"Список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail) должен быть строкой",
|
||||||
|
required: "Не указан список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail)"
|
||||||
|
}
|
||||||
|
},
|
||||||
//Список функций сервиса
|
//Список функций сервиса
|
||||||
//fn: {}
|
functions: defServiceFunctions(true, "functions")
|
||||||
});
|
});
|
||||||
|
231
models/obj_service_function.js
Normal file
231
models/obj_service_function.js
Normal file
@ -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)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
37
models/obj_service_functions.js
Normal file
37
models/obj_service_functions.js
Normal file
@ -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") });
|
37
models/obj_services.js
Normal file
37
models/obj_services.js
Normal file
@ -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") });
|
@ -14,7 +14,7 @@ const Schema = require("validate"); //Схемы валидации
|
|||||||
//------------------
|
//------------------
|
||||||
|
|
||||||
//Схема валидации параметров установки состояния позиции очереди
|
//Схема валидации параметров установки состояния позиции очереди
|
||||||
exports.getQueueStatePrmsSchema = new Schema({
|
exports.setQueueState = new Schema({
|
||||||
//Идентификатор позиции очереди
|
//Идентификатор позиции очереди
|
||||||
nQueueId: {
|
nQueueId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
|
52
test.js
52
test.js
@ -4,8 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require("module-alias/register");
|
require("module-alias/register");
|
||||||
|
const srvsModel = require("./models/obj_services"); //Модель данных списка сервисов
|
||||||
const srvModel = require("./models/obj_service"); //Модель данных сервиса
|
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 dbConnectorInterfaceModel = require("./models/intf_db_connector_module"); //Интерфейс модуля взаимодействия с БД
|
||||||
const utl = require("./core/utils"); //Вспомогательные функции
|
const utl = require("./core/utils"); //Вспомогательные функции
|
||||||
const db = require("./core/db_connector"); //Взаимодействие с БД
|
const db = require("./core/db_connector"); //Взаимодействие с БД
|
||||||
@ -13,20 +16,41 @@ const cfg = require("./config"); //Настройки сервера прило
|
|||||||
|
|
||||||
const pDB = require("./modules/parus_oracle_db");
|
const pDB = require("./modules/parus_oracle_db");
|
||||||
|
|
||||||
let a = utl.validateObject(
|
//let a = utl.validateObject(
|
||||||
{ nQueueId: 123, nExecState: 123, sExecMsg: "" },
|
// { nQueueId: 123, nExecState: 123, sExecMsg: "" },
|
||||||
dbConnectorModel.getQueueStatePrmsSchema,
|
// dbConnectorModel.getQueueStatePrmsSchema,
|
||||||
"Тестовый"
|
// "Тестовый"
|
||||||
);
|
//);
|
||||||
console.log(a);
|
//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: "" });
|
const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" });
|
||||||
console.log(errors);
|
console.log(errors);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user