forked from CITKParus/P8-ExchangeService
Внедрение валидатора (часть первая)
This commit is contained in:
parent
3855aad2c9
commit
9525bb8609
@ -9,9 +9,10 @@
|
|||||||
|
|
||||||
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.js"); //Глобальные константы
|
const glConst = require("../core/constants.js"); //Глобальные константы
|
||||||
const { ServerError } = require("../core/server_errors.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 {
|
class DBConnector extends EventEmitter {
|
||||||
//Конструктор
|
//Конструктор
|
||||||
constructor(prms) {
|
constructor(prms) {
|
||||||
@ -249,26 +251,23 @@ class DBConnector extends EventEmitter {
|
|||||||
//Установить состояние позиции очереди
|
//Установить состояние позиции очереди
|
||||||
async setQueueState(prms) {
|
async setQueueState(prms) {
|
||||||
if (this.bConnected) {
|
if (this.bConnected) {
|
||||||
//Проверяем структуру переданного объекта для подключения
|
//Проверяем структуру переданных параметров
|
||||||
//let sCheckResult = checkObject(prms, {
|
let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema);
|
||||||
// fields: [{ sName: "nPortionSize", bRequired: true }]
|
|
||||||
//});
|
|
||||||
//Если структура объекта в норме
|
//Если структура объекта в норме
|
||||||
//if (!sCheckResult) {
|
if (!sCheckResult) {
|
||||||
let setStateData = { connection: this.connection };
|
//Подготовим параметры
|
||||||
_.extend(setStateData, prms);
|
let setStateData = { connection: this.connection };
|
||||||
try {
|
_.extend(setStateData, prms);
|
||||||
let res = await this.connector.setQueueState(setStateData);
|
//Исполняем действие в БД
|
||||||
return res;
|
try {
|
||||||
} catch (e) {
|
let res = await this.connector.setQueueState(setStateData);
|
||||||
throw new ServerError(SERR_DB_EXECUTE, e.message);
|
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 {
|
} else {
|
||||||
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
|
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
// Подключение библиотек
|
// Подключение библиотек
|
||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
|
const Schema = require("validate"); //Схемы валидации
|
||||||
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
|
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
@ -60,6 +61,30 @@ const checkModuleInterface = (module, interface) => {
|
|||||||
return bRes;
|
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) => {
|
const checkObject = (obj, interface) => {
|
||||||
//Объявим результат
|
//Объявим результат
|
||||||
@ -123,5 +148,6 @@ const makeModuleFullPath = sModuleName => {
|
|||||||
exports.isFunction = isFunction;
|
exports.isFunction = isFunction;
|
||||||
exports.haveFunctions = haveFunctions;
|
exports.haveFunctions = haveFunctions;
|
||||||
exports.checkModuleInterface = checkModuleInterface;
|
exports.checkModuleInterface = checkModuleInterface;
|
||||||
|
exports.validateObject = validateObject;
|
||||||
exports.checkObject = checkObject;
|
exports.checkObject = checkObject;
|
||||||
exports.makeModuleFullPath = makeModuleFullPath;
|
exports.makeModuleFullPath = makeModuleFullPath;
|
||||||
|
60
models/interface_db_connector_module.js
Normal file
60
models/interface_db_connector_module.js
Normal file
@ -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)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -69,7 +69,7 @@ exports.schema = new Schema({
|
|||||||
type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных",
|
type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных",
|
||||||
required: "Не указан числовой код типа сервиса (nSrvType)"
|
required: "Не указан числовой код типа сервиса (nSrvType)"
|
||||||
}
|
}
|
||||||
},
|
} /*,
|
||||||
//Тип сервиса (строковый код)
|
//Тип сервиса (строковый код)
|
||||||
sSrvType: {
|
sSrvType: {
|
||||||
type: String,
|
type: String,
|
||||||
@ -82,7 +82,7 @@ exports.schema = new Schema({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
//Корневой каталог сервиса
|
//Корневой каталог сервиса
|
||||||
sSrvRoot: {}
|
sSrvRoot: {}*/
|
||||||
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
||||||
//sSrvUser: {},
|
//sSrvUser: {},
|
||||||
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
46
models/prms_db_connector.js
Normal file
46
models/prms_db_connector.js
Normal file
@ -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) должно быть строкой"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
@ -25,6 +25,7 @@
|
|||||||
},
|
},
|
||||||
"_moduleAliases": {
|
"_moduleAliases": {
|
||||||
"@core": "core",
|
"@core": "core",
|
||||||
"@modules": "modules"
|
"@modules": "modules",
|
||||||
|
"@models": "models"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
49
test.js
49
test.js
@ -4,14 +4,31 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require("module-alias/register");
|
require("module-alias/register");
|
||||||
const srvModel = require("./models/service");
|
const srvModel = require("./models/obj_service"); //Модель данных сервиса
|
||||||
const db = require("./core/db_connector.js"); //Взаимодействие с БД
|
const dbConnectorModel = require("./models/prms_db_connector"); //Модель данных сервиса
|
||||||
const cfg = require("./config.js"); //Настройки сервера приложений
|
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: "" });
|
const pDB = require("./modules/parus_oracle_db");
|
||||||
//errors.forEach(e => {
|
|
||||||
//console.log(e.message);
|
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);
|
const dbConn = new db.DBConnector(cfg.dbConnect);
|
||||||
|
|
||||||
@ -19,13 +36,19 @@ const test = async () => {
|
|||||||
await dbConn.connect();
|
await dbConn.connect();
|
||||||
let r = await dbConn.getOutgoing({ nPortionSize: 123 });
|
let r = await dbConn.getOutgoing({ nPortionSize: 123 });
|
||||||
console.log(r);
|
console.log(r);
|
||||||
let rr = await dbConn.setQueueState({
|
try {
|
||||||
nQueueId: 94568140,
|
let rr = await dbConn.setQueueState({
|
||||||
nExecState: 1,
|
nQueueId: 94568140,
|
||||||
sExecMsg: "Обработано сервером приложений"
|
nExecState: 1,
|
||||||
});
|
sExecMsg: "Обработано сервером приложений"
|
||||||
console.log(rr);
|
});
|
||||||
|
console.log(rr);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.sMessage);
|
||||||
|
}
|
||||||
|
|
||||||
await dbConn.disconnect();
|
await dbConn.disconnect();
|
||||||
};
|
};
|
||||||
|
|
||||||
test();
|
test();
|
||||||
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user