Внедрение валидатора (часть первая)

This commit is contained in:
Mikhail Chechnev 2018-11-21 22:13:13 +03:00
parent 3855aad2c9
commit 9525bb8609
7 changed files with 190 additions and 35 deletions

View File

@ -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 }; let setStateData = { connection: this.connection };
_.extend(setStateData, prms); _.extend(setStateData, prms);
//Исполняем действие в БД
try { try {
let res = await this.connector.setQueueState(setStateData); let res = await this.connector.setQueueState(setStateData);
return res; return res;
} catch (e) { } catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message); throw new ServerError(SERR_DB_EXECUTE, e.message);
} }
//} else { } else {
// throw new ServerError( throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
// glConst.SERR_OBJECT_BAD_INTERFACE, }
// "Объект имеет недопустимый интерфейс: " + sCheckResult
// );
//}
} else { } else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД"); throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
} }

View File

@ -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;

View 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)"
}
}
});

View File

@ -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: {},
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений) //Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)

View 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) должно быть строкой"
}
}
});

View File

@ -25,6 +25,7 @@
}, },
"_moduleAliases": { "_moduleAliases": {
"@core": "core", "@core": "core",
"@modules": "modules" "@modules": "modules",
"@models": "models"
} }
} }

37
test.js
View File

@ -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);
try {
let rr = await dbConn.setQueueState({ let rr = await dbConn.setQueueState({
nQueueId: 94568140, nQueueId: 94568140,
nExecState: 1, nExecState: 1,
sExecMsg: "Обработано сервером приложений" sExecMsg: "Обработано сервером приложений"
}); });
console.log(rr); console.log(rr);
} catch (e) {
console.log(e.sMessage);
}
await dbConn.disconnect(); await dbConn.disconnect();
}; };
test(); test();
*/