Внедрение валидатора (часть первая)
This commit is contained in:
parent
3855aad2c9
commit
9525bb8609
@ -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, "Нет подключения к БД");
|
||||
}
|
||||
|
@ -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;
|
||||
|
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) имеет недопустимый тип данных",
|
||||
required: "Не указан числовой код типа сервиса (nSrvType)"
|
||||
}
|
||||
},
|
||||
} /*,
|
||||
//Тип сервиса (строковый код)
|
||||
sSrvType: {
|
||||
type: String,
|
||||
@ -82,7 +82,7 @@ exports.schema = new Schema({
|
||||
}
|
||||
},
|
||||
//Корневой каталог сервиса
|
||||
sSrvRoot: {}
|
||||
sSrvRoot: {}*/
|
||||
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
|
||||
//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": {
|
||||
"@core": "core",
|
||||
"@modules": "modules"
|
||||
"@modules": "modules",
|
||||
"@models": "models"
|
||||
}
|
||||
}
|
||||
|
49
test.js
49
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();
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user