Обслуживание аутентицикации: функции получения, установки и очистки контекста сервиса, фукнция проверки аутентифицированности сервиса, функция постановки в очередь задания на аутентификацию сервиса

This commit is contained in:
Mikhail Chechnev 2019-01-02 01:50:19 +03:00
parent 43c946b16a
commit 508f476d3e
7 changed files with 896 additions and 47 deletions

View File

@ -13,6 +13,7 @@ const { ServerError } = require("./server_errors"); //Типовая ошибк
const { makeModuleFullPath, validateObject } = require("./utils"); //Вспомогательные функции
const prmsDBConnectorSchema = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля
const intfDBConnectorModuleSchema = require("../models/intf_db_connector_module"); //Схема валидации интерфейса модуля взаимодействия с БД
const objServiceSchema = require("../models/obj_service"); //Схема валидации сервиса
const objServicesSchema = require("../models/obj_services"); //Схема валидации списка сервисов
const objServiceFunctionsSchema = require("../models/obj_service_functions"); //Схема валидации списка функций сервиса
const objQueueSchema = require("../models/obj_queue"); //Схема валидации сообщения очереди обмена
@ -197,7 +198,7 @@ class DBConnector extends EventEmitter {
"Список функций сервиса"
);
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Вернём добавленную запись
//Успешно - отдаём список функций сервиса
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
@ -209,6 +210,165 @@ class DBConnector extends EventEmitter {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Получить контекст сервиса
async getServiceContext(prms) {
//Работаем только при наличии подключения
if (this.bConnected) {
//Проверяем структуру переданного объекта с параметрами для получения контекста сервиса
let sCheckResult = validateObject(
prms,
prmsDBConnectorSchema.getServiceContext,
"Параметры функции считывания контекста сервиса"
);
//Если структура объекта в норме
if (!sCheckResult) {
try {
//Подготовим параметры для передачи в БД
let getServiceContextData = _.cloneDeep(prms);
getServiceContextData.connection = this.connection;
//И выполним считывание контекста сервиса
let res = await this.connector.getServiceContext(getServiceContextData);
//Валидируем полученный ответ
sCheckResult = validateObject(res, objServiceSchema.ServiceCtx, "Контекст сервиса");
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Успешно - отдаём контекст считанный сервиса
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Установить контекст сервиса
async setServiceContext(prms) {
//Работаем только при наличии подключения
if (this.bConnected) {
//Проверяем структуру переданного объекта с параметрами для установки контекста сервиса
let sCheckResult = validateObject(
prms,
prmsDBConnectorSchema.setServiceContext,
"Параметры функции установки контекста сервиса"
);
//Если структура объекта в норме
if (!sCheckResult) {
try {
//Подготовим параметры для передачи в БД
let setServiceContextData = _.cloneDeep(prms);
setServiceContextData.connection = this.connection;
//И выполним установку контекста сервиса
await this.connector.setServiceContext(setServiceContextData);
//Успешно - возвращаем ничего
return;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Очистить контекст сервиса
async clearServiceContext(prms) {
//Работаем только при наличии подключения
if (this.bConnected) {
//Проверяем структуру переданного объекта с параметрами для очистки контекста сервиса
let sCheckResult = validateObject(
prms,
prmsDBConnectorSchema.clearServiceContext,
"Параметры функции очистки контекста сервиса"
);
//Если структура объекта в норме
if (!sCheckResult) {
try {
//Подготовим параметры для передачи в БД
let clearServiceContextData = _.cloneDeep(prms);
clearServiceContextData.connection = this.connection;
//И выполним очистку контекста сервиса
await this.connector.clearServiceContext(clearServiceContextData);
//Успешно - возвращаем ничего
return;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Проверить аутентифицированность сервиса
async isServiceAuth(prms) {
//Работаем только при наличии подключения
if (this.bConnected) {
//Проверяем структуру переданного объекта с параметрами для проверки аутентифицированности сервиса
let sCheckResult = validateObject(
prms,
prmsDBConnectorSchema.isServiceAuth,
"Параметры функции проверки аутентифицированности сервиса"
);
//Если структура объекта в норме
if (!sCheckResult) {
try {
//Подготовим параметры для передачи в БД
let isServiceAuthData = _.cloneDeep(prms);
isServiceAuthData.connection = this.connection;
//И выполним проверку атентифицированности сервиса
let res = await this.connector.isServiceAuth(isServiceAuthData);
//Валидируем результат
if (![objServiceSchema.NIS_AUTH_NO, objServiceSchema.NIS_AUTH_YES].includes(res))
throw new ServerError(
SERR_OBJECT_BAD_INTERFACE,
"Неожиданный ответ функции проверки аутентифицированности сервиса"
);
//Успешно - возвращаем то, что вернула функция проверки
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Поставить в очередь задание на аутентификацию сервиса
async putServiceAuthInQueue(prms) {
//Работаем только при наличии подключения
if (this.bConnected) {
//Проверяем структуру переданного объекта с параметрами постановки в очередь задания на аутентификацию сервиса
let sCheckResult = validateObject(
prms,
prmsDBConnectorSchema.putServiceAuthInQueue,
"Параметры функции постановки в очередь задания на аутентификацию сервиса"
);
//Если структура объекта в норме
if (!sCheckResult) {
try {
//Подготовим параметры для передачи в БД
let putServiceAuthInQueueData = _.cloneDeep(prms);
putServiceAuthInQueueData.connection = this.connection;
//И выполним постановку в очередь задания на аутентификацию сервиса
await this.connector.putServiceAuthInQueue(putServiceAuthInQueueData);
//Успешно - возвращаем ничего
return;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Запись в журнал работы
async putLog(prms) {
//Работаем только при наличии подключения

View File

@ -54,6 +54,12 @@ create or replace package PKG_EXS as
SUNAVLBL_NTF_SIGN_NO constant varchar2(40) := 'UNAVLBL_NTF_NO'; -- Íå îïîâåùàòü î ïðîñòîå (ñòðîêîâûé êîä)
SUNAVLBL_NTF_SIGN_YES constant varchar2(40) := 'UNAVLBL_NTF_YES'; -- Îïîâåùàòü î ïðîñòîå (ñòðîêîâûé êîä)
/* Êîíñòàíòû - ïðèçíàê îïîâåùåíèÿ îá îøèáêå èñïîëíåíèÿ ñîîáùåíèÿ î÷åðåäè äëÿ ôóíêöèè îáðàáîòêè */
NERR_NTF_SIGN_NO constant EXSSERVICEFN.ERR_NTF_SIGN%type := 0; -- Íå îïîâåùàòü îá îøèáêå èñïîëíåíèÿ
NERR_NTF_SIGN_YES constant EXSSERVICEFN.ERR_NTF_SIGN%type := 1; -- Îïîâåùàòü îá îøèáêå èñïîëíåíèÿ
SERR_NTF_SIGN_NO constant varchar2(40) := 'ERR_NTF_SIGN_NO'; -- Íå îïîâåùàòü îá îøèáêå èñïîëíåíèÿ (ñòðîêîâûé êîä)
SERR_NTF_SIGN_YES constant varchar2(40) := 'ERR_NTF_SIGN_YES'; -- Îïîâåùàòü îá îøèáêå èñïîëíåíèÿ (ñòðîêîâûé êîä)
/* Êîíñòàíòû - ñîñòîÿíèÿ çàïèñåé æóðíàëà ðàáîòû ñåðâèñà */
NLOG_STATE_INF constant EXSLOG.LOG_STATE%type := 0; -- Èíôîðìàöèÿ
NLOG_STATE_WRN constant EXSLOG.LOG_STATE%type := 1; -- Ïðåäóïðåæäåíèå
@ -86,10 +92,22 @@ create or replace package PKG_EXS as
NINC_EXEC_CNT_NO constant number(1) := 0; -- Íå èíêðåìåíòèðîâàòü
NINC_EXEC_CNT_YES constant number(1) := 1; -- Èíêðåìåíòèðîâàòü
/* Константы - признак инкремента количества попыток исполнения позиции очереди */
/* Êîíñòàíòû - ïðèçíàê íåîáõîäèìîñòè èñïîëíåíèÿ ïîçèöèè î÷åðåäè */
NQUEUE_EXEC_NO constant number(1) := 0; -- Íå èñïîëíÿòü
NQUEUE_EXEC_YES constant number(1) := 1; -- Èñïîëíÿòü
/* Êîíñòàíòû - ïðèçíàê àóòåíòèôèöèðîâàííîñòè ñåðâèñà */
NIS_AUTH_YES constant EXSSERVICE.IS_AUTH%type := 1; -- Àóòåíòèôèöèðîâàí
NIS_AUTH_NO constant EXSSERVICE.IS_AUTH%type := 0; -- Íåàóòåíòèôèöèðîâàí
SIS_AUTH_YES constant varchar2(40) := 'IS_AUTH_YES'; -- Àóòåíòèôèöèðîâàí (ñòðîêîâûé êîä)
SIS_AUTH_NO constant varchar2(40) := 'IS_AUTH_NO'; -- Íåàóòåíòèôèöèðîâàí (ñòðîêîâûé êîä)
/* Êîíñòàíòû - ïðèçíàê íåîáõîäèìîñòè àóòåíòèôèöèðîâàííîñòè ñåðâèñà äëÿ èñïîëíåíèÿ ôóíêöèè */
NAUTH_ONLY_YES constant EXSSERVICEFN.AUTH_ONLY%type := 1; -- Òðåáóåòñÿ àóòåíòèôèêàöèÿ
NAUTH_ONLY_NO constant EXSSERVICEFN.AUTH_ONLY%type := 0; -- Àóòåíòèôèêàöèÿ íå òðåáóåòñÿ
SAUTH_ONLY_YES constant varchar2(40) := 'AUTH_ONLY_YES'; -- Òðåáóåòñÿ àóòåíòèôèêàöèÿ (ñòðîêîâûé êîä)
SAUTH_ONLY_NO constant varchar2(40) := 'AUTH_ONLY_NO'; -- Àóòåíòèôèêàöèÿ íå òðåáóåòñÿ (ñòðîêîâûé êîä)
/* Êîíñòàíòû - îæèäàåìûé èíòåðôåéñ ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ î÷åðåäè íà ñòîðîíå ÁÄ */
SPRC_RESP_ARGS constant varchar2(80) := 'NIDENT,IN,NUMBER;NSRV_TYPE,IN,NUMBER;NEXSQUEUE,IN,NUMBER;'; -- Ñïèñîê ïàðàìåòðîâ ïðîöåäóðû îáðàáîòêè
@ -119,8 +137,7 @@ create or replace package PKG_EXS as
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
SSUB_CONTAINER in varchar2 := null -- Íàèìåíîâàíèå êîíòåéíåðà âòîðîãî óðîâíÿ
)
return varchar2; -- Полное наименование контейнера
) return varchar2; -- Ïîëíîå íàèìåíîâàíèå êîíòåéíåðà
/* Î÷èñòêà êîíòåéíåðà äëÿ õðàíåíèÿ îêðóæåíèÿ âûçîâà ïðîöåäóðû */
procedure UTL_CONTAINER_PURGE
@ -135,8 +152,7 @@ create or replace package PKG_EXS as
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number -- Øàã ãðàôèêà ïåðåçàïóñêà
)
return date; -- Дата следующего запуска
) return date; -- Äàòà ñëåäóþùåãî çàïóñêà
/* Âûÿñíåíèå íåîáõîäèìîñòè çàïóñêà ïî ðàñïèñàíèþ */
function UTL_SCHED_CHECK_EXEC
@ -145,8 +161,7 @@ create or replace package PKG_EXS as
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number, -- Øàã ãðàôèêà ïåðåçàïóñêà
DEXEC in date := sysdate -- Äàòà, îòíîñèòåëüíî êîòîðîé íåîáõîäèìî âûïîëíèòü ïðîâåðêó
)
return boolean; -- Признак необходимости запуска
) return boolean; -- Ïðèçíàê íåîáõîäèìîñòè çàïóñêà
/* Óñòàíîâêà çíà÷åíèÿ òèïà ñòðîêà ïàðàìåòðà ïðîöåäóðû îáðàáîòêè ñîîáùåíèÿ îáìåíà */
procedure PRC_RESP_ARG_STR_SET
@ -243,12 +258,60 @@ create or replace package PKG_EXS as
RCSERVICE out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ
);
/* Ïîëó÷åíèå êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_GET
(
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
RCSERVICE_CTX out sys_refcursor -- Êóðñîð ñî êîíòåêòîì ñåðâèñà
);
/* Óñòàíîâêà êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_SET
(
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
SCTX in varchar2, -- Êîíòåêñò
DCTX_EXP in date -- Äàòà èñòå÷åíèÿ êîíòåêñòà
);
/* Î÷èñòêà êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_CLEAR
(
NEXSSERVICE in number -- Ðåã. íîìåð çàïèñè ñåðâèñà
);
/* Ïðîâåðêà íåîáõîäèìîñòè àóòåíòèôèêàöèè */
function SERVICE_IS_AUTH
(
NEXSSERVICE in number -- Ðåã. íîìåð çàïèñè ñåðâèñà
) return number; -- Ôëàã àóòåíòèôèêàöèè (ñì. êîíñòàíòû NIS_AUTH_*)
/* Ïîèñê ôóíêöèè àóòåíòèôèêàöèè äëÿ ñåðâèñà îáìåíà */
procedure SERVICE_AUTH_FN_FIND
(
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
REXSSERVICEFN out EXSSERVICEFN%rowtype -- Çàïèñü ôóíêöèè àóòåíòèôèêàöèè
);
/* Ïîìåùåíèå çàäàíèÿ íà àóòåíòèôèêàöèþ ñåðâèñà â î÷åðåäü îáìåíà */
procedure SERVICE_AUTH_PUT_INQUEUE
(
NEXSSERVICE in number -- Ðåã. íîìåð ñåðâèñà îáìåíà
);
/* Ïîëó÷åíèå ñïèñêà ñåðâèñîâ */
procedure SERVICES_GET
(
RCSERVICES out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ
);
/* Ïîëó÷åíèå ñïèñêà ñåðâèñîâ òðåáóþùèõ àóòåíòèôèêàöèè */
procedure SERVICES_AUTH_GET
(
RCSERVICES_AUTH out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ òðåáóþùèõ àóòåíòèôèêàöèè
);
/* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */
procedure SERVICEFN_GET
(
@ -277,8 +340,13 @@ create or replace package PKG_EXS as
NFLAG_SMART in number, -- Ïðèçíàê ãåíåðàöèè èñêëþ÷åíèÿ (0 - äà, 1 - íåò)
SEXSSERVICE in varchar2, -- Ìíåìîêîä ñåðâèñà äëÿ îáðàáîòêè
SEXSSERVICEFN in varchar2 -- Ìíåìîêîä ôóíêöèè ñåðâèñà äëÿ îáðàáîòêè
)
return number; -- Рег. номер функции сервиса обмена
) return number; -- Ðåã. íîìåð ôóíêöèè ñåðâèñà îáìåíà
/* Ïðîâåðêà íàëè÷èÿ â î÷åðåäè íåèñïîëíåííîãî çàäàíèÿ äëÿ óêàçàííîé ôóíêöèè ñåðâèñà îáìåíà */
function SERVICEFN_CHECK_INCMPL_INQUEUE
(
NEXSSERVICEFN in number -- Ðåã. íîìåð çàïèñè ôóíêöèè ñåðâèñà îáìåíà
) return boolean; -- Ðåçóëüòàò ïðîâåðêè (true - â î÷åðåäè åñòü íåèñïîëíåííûå çàäàíèÿ äëÿ äàííîé ôóíêöèè, false - â î÷åðåäè íåò íåèñïîëíåííûõ çàäàíèé äëÿ äàííîé ôóíêöèè)
/* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */
procedure LOG_GET
@ -325,8 +393,7 @@ create or replace package PKG_EXS as
function QUEUE_SRV_TYPE_SEND_EXEC_CHECK
(
NEXSQUEUE in number -- Ðåã. íîìåð çàïèñè î÷åðåäè
)
return number; -- Флаг необходимости исполнения позиции очереди (см. константы NQUEUE_EXEC_*)
) return number; -- Ôëàã íåîáõîäèìîñòè èñïîëíåíèÿ ïîçèöèè î÷åðåäè (ñì. êîíñòàíòû NQUEUE_EXEC_*)
/* Ñ÷èòûâàíèå î÷åðåäíîé ïîðöèè èñõîäÿùèõ ñîîáùåíèé èç î÷åðåäè */
procedure QUEUE_SRV_TYPE_SEND_GET
@ -682,8 +749,7 @@ create or replace package body PKG_EXS as
(
NIDENT in number, -- Èäåíòèôèêàòîð ïðîöåññà
SSUB_CONTAINER in varchar2 := null -- Íàèìåíîâàíèå êîíòåéíåðà âòîðîãî óðîâíÿ
)
return varchar2 -- Полное наименование контейнера
) return varchar2 -- Ïîëíîå íàèìåíîâàíèå êîíòåéíåðà
is
/* Ôîðìèðîâàíèå ïîëíîãî íàèìåíîâàíèÿ êîíòåéíåðà */
function CONTAINER_MAKE_NAME
@ -731,8 +797,7 @@ create or replace package body PKG_EXS as
DEXEC_DATE in date, -- Äàòà ïðåäûäóùåãî èñïîëíåíèÿ
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number -- Øàã ãðàôèêà ïåðåçàïóñêà
)
return date -- Дата следующего запуска
) return date -- Äàòà ñëåäóþùåãî çàïóñêà
is
begin
/* Åñëè íåò äàòû ïðåäûäóùåãî çàïóñêà èëè ðàñïèñàíèå íå îïðåäåëåíî, òî äàòà î÷åðåäíîãî çàïóñêà - ýòî òåêóùàÿ äàòà */
@ -790,8 +855,7 @@ create or replace package body PKG_EXS as
NRETRY_SCHEDULE in number, -- Ãðàôèê ïåðåçàïóñêà (ñì. êîíñòàíòû NRETRY_SCHEDULE_*)
NRETRY_STEP in number, -- Øàã ãðàôèêà ïåðåçàïóñêà
DEXEC in date := sysdate -- Äàòà, îòíîñèòåëüíî êîòîðîé íåîáõîäèìî âûïîëíèòü ïðîâåðêó
)
return boolean -- Признак необходимости запуска
) return boolean -- Ïðèçíàê íåîáõîäèìîñòè çàïóñêà
is
DEXEC_NEXT date; -- Hàñ÷åòíàÿ äàòà ñëåäóþùåãî çàïóñêà
begin
@ -1056,6 +1120,173 @@ create or replace package body PKG_EXS as
RNLIST_BASE_CLEAR(NIDENT => NIDENT);
end SERVICE_GET;
/* Ïîëó÷åíèå êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_GET
(
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
RCSERVICE_CTX out sys_refcursor -- Êóðñîð ñî êîíòåêòîì ñåðâèñà
)
is
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
begin
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSSERVICE);
/* Îòêðûâàåì âûõîäíîé êóðñîð */
open RCSERVICE_CTX for
select T.RN "nId",
T.CTX "sCtx",
T.CTX_EXP "dCtxExp",
TO_CHAR(T.CTX_EXP, 'dd.mm.yyyy hh24:mi:ss') "sCtxExp",
T.IS_AUTH "nIsAuth",
DECODE(T.IS_AUTH, NIS_AUTH_YES, SIS_AUTH_YES, NIS_AUTH_NO, SIS_AUTH_NO) "sIsAuth"
from EXSSERVICE T
where T.RN = REXSSERVICE.RN;
end SERVICE_CTX_GET;
/* Óñòàíîâêà êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_SET
(
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
SCTX in varchar2, -- Êîíòåêñò
DCTX_EXP in date -- Äàòà èñòå÷åíèÿ êîíòåêñòà
)
is
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
begin
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => NEXSSERVICE);
/* Ïðîâåðèì, ÷òî êîíòåêñò åñòü */
if (SCTX is null) then
P_EXCEPTION(0, 'Íå óêàçàí êîíòåêñò ðàáîòû ñåðâèñà.');
end if;
/* Óñòàíàâëèâàåì êîíòåêñò */
update EXSSERVICE T
set T.CTX = SCTX,
T.CTX_EXP = DCTX_EXP,
T.IS_AUTH = NIS_AUTH_YES
where T.RN = REXSSERVICE.RN;
end SERVICE_CTX_SET;
/* Î÷èñòêà êîíòåêñòà ñåðâèñà */
procedure SERVICE_CTX_CLEAR
(
NEXSSERVICE in number -- Ðåã. íîìåð çàïèñè ñåðâèñà
)
is
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
begin
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => NEXSSERVICE);
/* Óñòàíàâëèâàåì êîíòåêñò */
update EXSSERVICE T
set T.CTX = null,
T.CTX_EXP = null,
T.IS_AUTH = NIS_AUTH_NO
where T.RN = REXSSERVICE.RN;
end SERVICE_CTX_CLEAR;
/* Ïðîâåðêà àóòåíòèôèöèðîâàííîñòè ñåðâèñà */
function SERVICE_IS_AUTH
(
NEXSSERVICE in number -- Ðåã. íîìåð çàïèñè ñåðâèñà
) return number -- Ôëàã àóòåíòèôèêàöèè (ñì. êîíñòàíòû NIS_AUTH_*)
is
NRES PKG_STD.TNUMBER; -- Ðåçóëüòàò ðàáîòû
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
begin
/* èíèöèàëèçèðóåì ðåçóëüòàò */
NRES := NIS_AUTH_NO;
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => NEXSSERVICE);
/* Åñëè ñåðâèñ àóòåíòèôèöèðîâàí */
if (REXSSERVICE.IS_AUTH = NIS_AUTH_YES) then
/* Åñëè óêàçàíà äàòà èñ÷åòå÷åíèÿ àóòåíòèôèêàöèè */
if (REXSSERVICE.CTX_EXP is not null) then
/* Åñëè äàòà èñòå÷åíèÿ åù¸ íå íàñòóïèëà */
if (REXSSERVICE.CTX_EXP > sysdate) then
/* Òî îí àóòåíòèôèöèðîâàí */
NRES := NIS_AUTH_YES;
end if;
else
/* Äàòû íåò - ñ÷èòàåì åãî àóòåíòèôèöèðîâàííûì */
NRES := NIS_AUTH_YES;
end if;
end if;
/* Âåðíåì ðåçóëüòàò ðàáîòû */
return NRES;
end SERVICE_IS_AUTH;
/* Ïîèñê ôóíêöèè àóòåíòèôèêàöèè äëÿ ñåðâèñà îáìåíà */
procedure SERVICE_AUTH_FN_FIND
(
NFLAG_SMART in number, -- Ïðèçíàê âûäà÷è ñîîáùåíèÿ îá îøèáêå
NEXSSERVICE in number, -- Ðåã. íîìåð çàïèñè ñåðâèñà
REXSSERVICEFN out EXSSERVICEFN%rowtype -- Çàïèñü ôóíêöèè àóòåíòèôèêàöèè
)
is
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà
begin
/* Ñ÷èòàåì çàïèñü ñåðâèñà */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => NFLAG_SMART, NRN => NEXSSERVICE);
/* Åñëè ñåðâèñ ñ÷èòàëñÿ */
if (REXSSERVICE.RN is not null) then
/* Èùåì ôóíêöèþ */
begin
select T.*
into REXSSERVICEFN
from EXSSERVICEFN T
where T.PRN = REXSSERVICE.RN
and T.FN_TYPE = NFN_TYPE_LOGIN;
exception
when TOO_MANY_ROWS then
P_EXCEPTION(NFLAG_SMART,
'Äëÿ ñåðâèñà îáìåíà "%s" ôóíêöèÿ àóòåíòèôèêàöèè îïðåäåëåíà íåîäíîçíà÷íî.',
REXSSERVICE.CODE);
when NO_DATA_FOUND then
P_EXCEPTION(NFLAG_SMART,
'Äëÿ ñåðâèñà îáìåíà "%s" íå îïðåäåëåíà ôóíêöèÿ àóòåíòèôèêàöèè.',
REXSSERVICE.CODE);
end;
end if;
end SERVICE_AUTH_FN_FIND;
/* Ïîìåùåíèå çàäàíèÿ íà àóòåíòèôèêàöèþ ñåðâèñà â î÷åðåäü îáìåíà */
procedure SERVICE_AUTH_PUT_INQUEUE
(
NEXSSERVICE in number -- Ðåã. íîìåð ñåðâèñà îáìåíà
)
is
pragma autonomous_transaction;
REXSSERVICEFN_AUTH EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè àóòåíòèôèêàöèè
NAUTH_EXSQUEUE PKG_STD.TREF; -- Ðåã. íîìåð ïîçèöèè î÷åðåäè äëÿ àòóåíòèôèêàöèè
begin
/* Èùåì ôóíêöèþ å¸ îñóùåñòâëÿþùóþ àóòåíòèôèêàöèþ */
SERVICE_AUTH_FN_FIND(NFLAG_SMART => 0, NEXSSERVICE => NEXSSERVICE, REXSSERVICEFN => REXSSERVICEFN_AUTH);
/* Ïðîâåðÿåì, ÷òî â î÷åðåäè åù¸ ïîêà íåò çàïðîñîâ íà àóòåíòèôèêàöèþ */
if (not SERVICEFN_CHECK_INCMPL_INQUEUE(NEXSSERVICEFN => REXSSERVICEFN_AUTH.RN)) then
/* Çà÷èùàåì òåêóùèé êîíòåêñò ñåðâèñà */
SERVICE_CTX_CLEAR(NEXSSERVICE => REXSSERVICEFN_AUTH.PRN);
/* Ðåãèñòðèðóåì â î÷åðåäè çàäàíèå íà àóòåíòèôèêàöèþ */
P_EXSQUEUE_BASE_INSERT(DIN_DATE => sysdate,
SIN_AUTHID => UTILIZER(),
NEXSSERVICEFN => REXSSERVICEFN_AUTH.RN,
DEXEC_DATE => null,
NEXEC_CNT => 0,
NEXEC_STATE => NQUEUE_EXEC_STATE_INQUEUE,
SEXEC_MSG => null,
BMSG => null,
BRESP => null,
NEXSQUEUE => null,
NLNK_COMPANY => null,
NLNK_DOCUMENT => null,
SLNK_UNITCODE => null,
SOPTIONS => null,
NRN => NAUTH_EXSQUEUE);
end if;
commit;
end SERVICE_AUTH_PUT_INQUEUE;
/* Ïîëó÷åíèå ñïèñêà ñåðâèñîâ */
procedure SERVICES_GET
(
@ -1078,7 +1309,41 @@ create or replace package body PKG_EXS as
/* ×èñòèì áóôåð */
RNLIST_BASE_CLEAR(NIDENT => NIDENT);
end SERVICES_GET;
/* Ïîëó÷åíèå ñïèñêà ñåðâèñîâ òðåáóþùèõ àóòåíòèôèêàöèè */
procedure SERVICES_AUTH_GET
(
RCSERVICES_AUTH out sys_refcursor -- Êóðñîð ñî ñïèñêîì ñåðâèñîâ òðåáóþùèõ àóòåíòèôèêàöèè
)
is
NIDENT PKG_STD.TREF; -- Èäåíòèôèêàòîð áóôåðà
NTMP PKG_STD.TREF; -- Ðåã. íîìåð î÷åðåäíîé çàïèñè áóôåðà
begin
/* Ñôîðìèðóåì èäåíòèôèêàòîð áóôåðà */
NIDENT := GEN_IDENT();
/* Îáõîäèì íóæíûå ñåðâèñû */
for C in (select T.RN
from EXSSERVICE T
where T.IS_AUTH = NIS_AUTH_NO
and exists (select FN.RN
from EXSSERVICEFN FN
where FN.PRN = T.RN
and FN.FN_TYPE = NFN_TYPE_LOGIN)
and exists (select FN.RN
from EXSSERVICEFN FN
where FN.PRN = T.RN
and FN.AUTH_ONLY = NAUTH_ONLY_YES
and FN.FN_TYPE <> NFN_TYPE_LOGIN))
loop
/* Çàïîìèíàåì èõ ðåã. íîìåðà â áóôåðå */
RNLIST_BASE_INSERT(NIDENT => NIDENT, NDOCUMENT => C.RN, NRN => NTMP);
end loop;
/* Çàáèðàåì îòîáðàííûå ñåðâèñû */
SERVICE_GET(NIDENT => NIDENT, RCSERVICE => RCSERVICES_AUTH);
/* ×èñòèì áóôåð */
RNLIST_BASE_CLEAR(NIDENT => NIDENT);
end SERVICES_AUTH_GET;
/* Ïîëó÷åíèå ôóíêöèè ñåðâèñà */
procedure SERVICEFN_GET
(
@ -1123,7 +1388,12 @@ create or replace package body PKG_EXS as
M.CODE "sMsgCode",
DECODE(M.PRC_RESP, null, null, UTL_STORED_MAKE_LINK(SPROCEDURE => M.PRC_RESP, SPACKAGE => M.PKG_RESP)) "sPrcResp",
M.APPSRV_BEFORE "sAppSrvBefore",
M.APPSRV_AFTER "sAppSrvAfter"
M.APPSRV_AFTER "sAppSrvAfter",
T.AUTH_ONLY "nAuthOnly",
DECODE(T.AUTH_ONLY, NAUTH_ONLY_NO, SAUTH_ONLY_NO, NAUTH_ONLY_YES, SAUTH_ONLY_YES) "sAuthOnly",
T.ERR_NTF_SIGN "nErrNtfSign",
DECODE(T.ERR_NTF_SIGN, NERR_NTF_SIGN_NO, SERR_NTF_SIGN_NO, NERR_NTF_SIGN_YES, SERR_NTF_SIGN_YES) "sErrNtfSign",
T.ERR_NTF_MAIL "sErrNtfMail"
from EXSSERVICEFN T,
EXSMSGTYPE M
where T.RN in (select L.DOCUMENT from EXSRNLIST L where L.IDENT = NIDENT)
@ -1184,8 +1454,7 @@ create or replace package body PKG_EXS as
NFLAG_SMART in number, -- Ïðèçíàê ãåíåðàöèè èñêëþ÷åíèÿ (0 - äà, 1 - íåò)
SEXSSERVICE in varchar2, -- Ìíåìîêîä ñåðâèñà äëÿ îáðàáîòêè
SEXSSERVICEFN in varchar2 -- Ìíåìîêîä ôóíêöèè ñåðâèñà äëÿ îáðàáîòêè
)
return number -- Рег. номер функции сервиса обмена
) return number -- Ðåã. íîìåð ôóíêöèè ñåðâèñà îáìåíà
is
NEXSSERVICE PKG_STD.TREF; -- Ðåã. íîìåð ñåðâèñà îáðàáîòêè
NEXSSERVICEFN PKG_STD.TREF; -- Ðåã. íîìåð ôóíêöèè ñåðâèñà îáðàáîòêè
@ -1202,6 +1471,36 @@ create or replace package body PKG_EXS as
return NEXSSERVICEFN;
end SERVICEFN_FIND_BY_SRVCODE;
/* Ïðîâåðêà íàëè÷èÿ â î÷åðåäè íåèñïîëíåííîãî çàäàíèÿ äëÿ óêàçàííîé ôóíêöèè ñåðâèñà îáìåíà */
function SERVICEFN_CHECK_INCMPL_INQUEUE
(
NEXSSERVICEFN in number -- Ðåã. íîìåð çàïèñè ôóíêöèè ñåðâèñà îáìåíà
) return boolean -- Ðåçóëüòàò ïðîâåðêè (true - â î÷åðåäè åñòü íåèñïîëíåííûå çàäàíèÿ äëÿ äàííîé ôóíêöèè, false - â î÷åðåäè íåò íåèñïîëíåííûõ çàäàíèé äëÿ äàííîé ôóíêöèè)
is
NCNT PKG_STD.TNUMBER; -- Êîëè÷åñòâî íàéäåííûõ çàïèñåé î÷åðåäè
begin
/* Ïðîâåðèì î÷åðåäü */
select count(Q.RN)
into NCNT
from EXSQUEUE Q
where Q.EXSSERVICEFN = NEXSSERVICEFN
and Q.EXEC_STATE not in (NQUEUE_EXEC_STATE_OK, NQUEUE_EXEC_STATE_ERR);
/* Åñëè íå íàøëè íè÷åãî â î÷åðåäè... */
if (NCNT = 0) then
/* ...ñêàæåì ÷òî çàäàíèé íåò */
return false;
else
/* Åñëè íàøëè - ñêàæåì ÷òî çàäàíèÿ åñòü */
return true;
end if;
exception
when others then
P_EXCEPTION(0,
'Îøèáêà îïðåäåëåíèÿ íàëè÷èÿ â î÷åðåäè çàäàíèé äëÿ ôóíêöèè (RN: %s) ñåðâèñà îáìåíà: %s',
TO_CHAR(NEXSSERVICEFN),
sqlerrm);
end SERVICEFN_CHECK_INCMPL_INQUEUE;
/* Ñ÷èòûâàíèå çàïèñè æóðíàëà ðàáîòû */
procedure LOG_GET
(
@ -1394,14 +1693,13 @@ create or replace package body PKG_EXS as
/* Ïðîâåðêà íåîáõîäèìîñòè èñïîëíåíèÿ ïîçèöèè î÷åðåäè */
function QUEUE_SRV_TYPE_SEND_EXEC_CHECK
(
NEXSQUEUE in number -- Рег. номер записи очереди
)
return number -- Флаг необходимости исполнения позиции очереди (см. константы NQUEUE_EXEC_*)
NEXSQUEUE in number -- Ðåã. íîìåð çàïèñè î÷åðåäè
) return number -- Ôëàã íåîáõîäèìîñòè èñïîëíåíèÿ ïîçèöèè î÷åðåäè (ñì. êîíñòàíòû NQUEUE_EXEC_*)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
REXSSERVICE EXSSERVICE%rowtype; -- Запись сервиса обработки
REXSSERVICEFN EXSSERVICEFN%rowtype; -- Запись функции обработки
NRESULT number(17); -- Результат работы
REXSQUEUE EXSQUEUE%rowtype; -- Çàïèñü ïîçèöèè î÷åðåäè
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà îáðàáîòêè
REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè îáðàáîòêè
NRESULT PKG_STD.TNUMBER; -- Ðåçóëüòàò ðàáîòû
begin
/* Èíèöèàëèçèðóåì ðåçóëüòàò */
NRESULT := NQUEUE_EXEC_NO;
@ -1412,7 +1710,7 @@ create or replace package body PKG_EXS as
REXSSERVICEFN := GET_EXSSERVICEFN_ID(NFLAG_SMART => 0, NRN => REXSQUEUE.EXSSERVICEFN);
/* Ñ÷èòàåì çàïèñü ñåðâèñà îáðàáîòêè */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => REXSSERVICEFN.PRN);
/* Проверим условия исполнения - исходящее, недоисполнено, и остались попытки */
/* Ïðîâåðèì óñëîâèÿ èñïîëíåíèÿ - èñõîäÿùåå, íåäîèñïîëíåíî, è îñòàëèñü ïîïûòêè, òðåáóåò àóòåíòèôèêàöèè è ñåðâèñ àóòåíòèôèöèðîâàí */
if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and
(REXSQUEUE.EXEC_STATE not in
(NQUEUE_EXEC_STATE_OK, NQUEUE_EXEC_STATE_ERR, NQUEUE_EXEC_STATE_APP, NQUEUE_EXEC_STATE_DB)) and
@ -1421,7 +1719,9 @@ create or replace package body PKG_EXS as
((REXSSERVICEFN.RETRY_SCHEDULE = NRETRY_SCHEDULE_UNDEF) and (REXSQUEUE.EXEC_CNT = 0))) and
(UTL_SCHED_CHECK_EXEC(DEXEC_DATE => REXSQUEUE.EXEC_DATE,
NRETRY_SCHEDULE => REXSSERVICEFN.RETRY_SCHEDULE,
NRETRY_STEP => REXSSERVICEFN.RETRY_STEP))) then
NRETRY_STEP => REXSSERVICEFN.RETRY_STEP)) and
((REXSSERVICEFN.AUTH_ONLY = NAUTH_ONLY_NO) or
((REXSSERVICEFN.AUTH_ONLY = NAUTH_ONLY_YES) and (REXSSERVICE.IS_AUTH = NIS_AUTH_YES)))) then
/* Íàäî èñïîëíÿòü */
NRESULT := NQUEUE_EXEC_YES;
end if;
@ -1461,7 +1761,7 @@ create or replace package body PKG_EXS as
/* ×èñòèì áóôåð */
RNLIST_BASE_CLEAR(NIDENT => NIDENT);
end QUEUE_SRV_TYPE_SEND_GET;
/* Óñòàíîâêà ñîñòîÿíèå çàïèñè î÷åðåäè */
procedure QUEUE_EXEC_STATE_SET
(
@ -1585,29 +1885,43 @@ create or replace package body PKG_EXS as
/* Âåðíåì èçìåíåííóþ ïîçèöèþ î÷åðåäè */
QUEUE_GET(NFLAG_SMART => 0, NEXSQUEUE => NEXSQUEUE, RCQUEUE => RCQUEUE);
end QUEUE_MSG_SET;
/* Ïîìåùåíèå ñîîáùåíèÿ îáìåíà â î÷åðåäü */
procedure QUEUE_PUT
(
NEXSSERVICEFN in number, -- Рег. номер функции обработки
BMSG in blob, -- Данные
NEXSQUEUE in number := null, -- Рег. номер связанной позиции очереди
NLNK_COMPANY in number := null, -- Рег. номер связанной организации
NLNK_DOCUMENT in number := null, -- Рег. номер связанной записи документа
SLNK_UNITCODE in varchar2 := null, -- Код связанного раздела
SOPTIONS in varchar2 := null, -- Параметры сообщения
NNEW_EXSQUEUE out number -- Курсор с добавленной позицией очереди
NEXSSERVICEFN in number, -- Ðåã. íîìåð ôóíêöèè îáðàáîòêè
BMSG in blob, -- Äàííûå
NEXSQUEUE in number := null, -- Ðåã. íîìåð ñâÿçàííîé ïîçèöèè î÷åðåäè
NLNK_COMPANY in number := null, -- Ðåã. íîìåð ñâÿçàííîé îðãàíèçàöèè
NLNK_DOCUMENT in number := null, -- Ðåã. íîìåð ñâÿçàííîé çàïèñè äîêóìåíòà
SLNK_UNITCODE in varchar2 := null, -- Êîä ñâÿçàííîãî ðàçäåëà
SOPTIONS in varchar2 := null, -- Ïàðàìåòðû ñîîáùåíèÿ
NNEW_EXSQUEUE out number -- Êóðñîð ñ äîáàâëåííîé ïîçèöèåé î÷åðåäè
)
is
REXSSERVICE EXSSERVICE%rowtype; -- Çàïèñü ñåðâèñà îáðàáîòêè
REXSSERVICEFN EXSSERVICEFN%rowtype; -- Çàïèñü ôóíêöèè îáðàáîòêè
begin
/* Ïðîâåðÿåì ïàðàìåòðû */
if (NEXSSERVICEFN is null) then
P_EXCEPTION(0, 'Не указан идентификатор функции сервиса обмена');
P_EXCEPTION(0, 'Íå óêàçàí èäåíòèôèêàòîð ôóíêöèè ñåðâèñà îáìåíà.');
end if;
/* Ñ÷èòàåì çàïèñü ôóíêöèè îáðàáîòêè */
REXSSERVICEFN := GET_EXSSERVICEFN_ID(NFLAG_SMART => 0, NRN => NEXSSERVICEFN);
/* Ñ÷èòàåì çàïèñü ñåðâèñà îáðàáîòêè */
REXSSERVICE := GET_EXSSERVICE_ID(NFLAG_SMART => 0, NRN => REXSSERVICEFN.PRN);
/* Åñëè ýòî èñõîäÿùåå ñîîáùåíèå è ôóíêöèÿ òðåáóåò àóòåíòèôèêàöèè */
if ((REXSSERVICE.SRV_TYPE = NSRV_TYPE_SEND) and (REXSSERVICEFN.AUTH_ONLY = NAUTH_ONLY_YES)) then
/* Ïðîâåðèì íåîáõîäèìîñòü àóòåíòèôèêàöèè */
if (SERVICE_IS_AUTH(NEXSSERVICE => REXSSERVICE.RN) = NIS_AUTH_NO) then
/* Íóæíà àóòåíòèôèêàöèÿ - ïîñòàâèì â î÷åðåäü çàäàíèå äëÿ íå¸ */
SERVICE_AUTH_PUT_INQUEUE(NEXSSERVICE => REXSSERVICE.RN);
end if;
end if;
/* Ñòàâèì çàïèñü â î÷åðåäü */
P_EXSQUEUE_BASE_INSERT(DIN_DATE => sysdate,
SIN_AUTHID => UTILIZER(),
NEXSSERVICEFN => NEXSSERVICEFN,
NEXSSERVICEFN => REXSSERVICEFN.RN,
DEXEC_DATE => null,
NEXEC_CNT => 0,
NEXEC_STATE => NQUEUE_EXEC_STATE_INQUEUE,
@ -1635,7 +1949,7 @@ create or replace package body PKG_EXS as
RCQUEUE out sys_refcursor -- Êóðñîð ñ äîáàâëåííîé ïîçèöèåé î÷åðåäè
)
is
NRN EXSQUEUE.RN%type; -- Рег. номер добавленной записи очереди
NRN EXSQUEUE.RN%type; -- Ðåã. íîìåð äîáàâëåííîé çàïèñè î÷åðåäè
begin
/* Ïðîâåðÿåì ïàðàìåòðû */
QUEUE_PUT(NEXSSERVICEFN => NEXSSERVICEFN,
@ -1664,7 +1978,7 @@ create or replace package body PKG_EXS as
NNEW_EXSQUEUE out number -- Êóðñîð ñ äîáàâëåííîé ïîçèöèåé î÷åðåäè
)
is
NEXSSERVICEFN PKG_STD.TREF; -- Рег. номер функции сервиса обработки
NEXSSERVICEFN PKG_STD.TREF; -- Ðåã. íîìåð ôóíêöèè ñåðâèñà îáðàáîòêè
begin
/* Ïðîâåðÿåì ïàðàìåòðû */
if (SEXSSERVICE is null) then
@ -1702,7 +2016,7 @@ create or replace package body PKG_EXS as
RCQUEUE out sys_refcursor -- Êóðñîð ñ äîáàâëåííîé ïîçèöèåé î÷åðåäè
)
is
NRN EXSQUEUE.RN%type; -- Рег. номер добавленной записи очереди
NRN EXSQUEUE.RN%type; -- Ðåã. íîìåð äîáàâëåííîé çàïèñè î÷åðåäè
begin
/* Ñòàâèì çàïèñü â î÷åðåäü */
QUEUE_PUT(SEXSSERVICE => SEXSSERVICE,

View File

@ -64,6 +64,57 @@ exports.dbConnectorModule = new Schema({
required: "Не реализована функция получения списка функций сервиса (getServiceFunctions)"
}
},
//Получение контекста сервиса
getServiceContext: {
use: { validateAsyncFunctionType },
required: true,
message: {
validateAsyncFunctionType:
"Функция получения контекста сервиса (getServiceContext) имеет неверный формат (ожидалось - AsyncFunction)",
required: "Не реализована функция получения контекста сервиса (getServiceContext)"
}
},
//Установка контекста сервиса
setServiceContext: {
use: { validateAsyncFunctionType },
required: true,
message: {
validateAsyncFunctionType:
"Функция установки контекста сервиса (setServiceContext) имеет неверный формат (ожидалось - AsyncFunction)",
required: "Не реализована функция установки контекста сервиса (setServiceContext)"
}
},
//Очистка контекста сервиса
clearServiceContext: {
use: { validateAsyncFunctionType },
required: true,
message: {
validateAsyncFunctionType:
"Функция очистки контекста сервиса (clearServiceContext) имеет неверный формат (ожидалось - AsyncFunction)",
required: "Не реализована функция очистки контекста сервиса (clearServiceContext)"
}
},
//Проверка атуентифицированности сервиса
isServiceAuth: {
use: { validateAsyncFunctionType },
required: true,
message: {
validateAsyncFunctionType:
"Функция проверки атуентифицированности сервиса (isServiceAuth) имеет неверный формат (ожидалось - AsyncFunction)",
required: "Не реализована функция проверки атуентифицированности сервиса (isServiceAuth)"
}
},
//Постановка в очередь задания на аутентификацию сервиса
putServiceAuthInQueue: {
use: { validateAsyncFunctionType },
required: true,
message: {
validateAsyncFunctionType:
"Функция постановки в очередь задания на аутентификацию сервиса (putServiceAuthInQueue) имеет неверный формат (ожидалось - AsyncFunction)",
required:
"Не реализована функция постановки в очередь задания на аутентификацию сервиса (putServiceAuthInQueue)"
}
},
//Протоколирование работы сервиса
log: {
use: { validateAsyncFunctionType },

View File

@ -27,6 +27,12 @@ const NUNAVLBL_NTF_SIGN_YES = 1; //Оповещать о простое
const SUNAVLBL_NTF_SIGN_NO = "UNAVLBL_NTF_NO"; //Не оповещать о простое (строковый код)
const SUNAVLBL_NTF_SIGN_YES = "UNAVLBL_NTF_YES"; //Оповещать о простое (строковый код)
//Признак аутентифицированности сервиса
const NIS_AUTH_YES = 1; //Аутентифицирован
const NIS_AUTH_NO = 0; //Неаутентифицирован
const SIS_AUTH_YES = "IS_AUTH_YES"; //Аутентифицирован (строковый код)
const SIS_AUTH_NO = "IS_AUTH_NO"; //Неаутентифицирован (строковый код)
//-------------
// Тело модуля
//-------------
@ -49,8 +55,12 @@ exports.NUNAVLBL_NTF_SIGN_NO = NUNAVLBL_NTF_SIGN_NO;
exports.NUNAVLBL_NTF_SIGN_YES = NUNAVLBL_NTF_SIGN_YES;
exports.SUNAVLBL_NTF_SIGN_NO = SUNAVLBL_NTF_SIGN_NO;
exports.SUNAVLBL_NTF_SIGN_YES = SUNAVLBL_NTF_SIGN_YES;
exports.NIS_AUTH_YES = NIS_AUTH_YES;
exports.NIS_AUTH_NO = NIS_AUTH_NO;
exports.SIS_AUTH_YES = SIS_AUTH_YES;
exports.SIS_AUTH_NO = SIS_AUTH_NO;
//Схема валидации
//Схема валидации сервиса
exports.Service = new Schema({
//Идентификатор сервиса
nId: {
@ -191,3 +201,67 @@ exports.Service = new Schema({
}
}
});
//Схема валидации контекста сервиса
exports.ServiceCtx = new Schema({
//Идентификатор сервиса
nId: {
type: Number,
required: true,
message: {
type: "Идентификатор сервиса (nId) имеет некорректный тип данных (ожидалось - Number)",
required: "Не указан идентификатор сервиса (nId)"
}
},
//Контекст
sCtx: {
type: String,
required: false,
message: {
type: "Контектс сервиса (sCtx) имеет некорректный тип данных (ожидалось - String)",
required: "Не указан контекст сервиса (sCtx)"
}
},
//Дата истечения контекста
dCtxExp: {
type: Date,
required: false,
message: {
type: "Дата истечения контекста (dCtxExp) имеет некорректный тип данных (ожидалось - Date)",
required: "Не указана дата истечения контекста (dCtxExp)"
}
},
//Дата истечения контекста (строковое представление)
sCtxExp: {
type: String,
required: false,
message: {
type:
"Строковое представление даты истечения контекста (sCtxExp) имеет некорректный тип данных (ожидалось - String)",
required: "Не указано строковое представление даты истечения контекста (sCtxExp)"
}
},
//Признак аутентицированности сервиса
nIsAuth: {
type: Number,
enum: [NIS_AUTH_YES, NIS_AUTH_NO],
required: true,
message: {
type: "Признака аутентицированности сервиса (nIsAuth) имеет некорректный тип данных (ожидалось - Number)",
enum: "Значение признака аутентицированности сервиса (nIsAuth) не поддерживается",
required: "Не указан признак аутентицированности сервиса (nIsAuth)"
}
},
//Признак аутентицированности сервиса (строковый код)
sIsAuth: {
type: String,
enum: [SIS_AUTH_YES, SIS_AUTH_NO],
required: true,
message: {
type:
"Строковый код признака аутентицированности сервиса (sIsAuth) имеет некорректный тип данных (ожидалось - String)",
enum: "Значение строкового кода признака аутентицированности сервиса (sIsAuth) не поддерживается",
required: "Не указан строковый код признака аутентицированности сервиса (sIsAuth)"
}
}
});

View File

@ -8,6 +8,7 @@
//----------------------
const Schema = require("validate"); //Схемы валидации
const { validateMailList } = require("./common"); //Общие объекты валидации моделей данных
//----------
// Константы
@ -43,6 +44,18 @@ const SRETRY_SCHEDULE_DAY = "DAY"; //Сутки (строковый код)
const SRETRY_SCHEDULE_WEEK = "WEEK"; //Неделя (строковый код)
const SRETRY_SCHEDULE_MONTH = "MONTH"; //Месяц (строковый код)
//Признак необходимости аутентифицированности сервиса для исполнения функции
const NAUTH_ONLY_YES = 1; //Требуется аутентификация
const NAUTH_ONLY_NO = 0; //Аутентификация не требуется
const SAUTH_ONLY_YES = "AUTH_ONLY_YES"; //Требуется аутентификация (строковый код)
const SAUTH_ONLY_NO = "AUTH_ONLY_NO"; //Аутентификация не требуется (строковый код)
//Признак оповещения об ошибке исполнения сообщения очереди для функции обработки
const NERR_NTF_SIGN_NO = 0; //Не оповещать об ошибке исполнения
const NERR_NTF_SIGN_YES = 1; //Оповещать об ошибке исполнения
const SERR_NTF_SIGN_NO = "ERR_NTF_SIGN_NO"; //Не оповещать об ошибке исполнения (строковый код)
const SERR_NTF_SIGN_YES = "ERR_NTF_SIGN_YES"; //Оповещать об ошибке исполнения (строковый код)
//-------------
// Тело модуля
//-------------
@ -56,6 +69,11 @@ const validateAppSrvFn = val => {
return true;
};
//Валидация списка адресов E-Mail для оповещения об ошибке обработки сообщения очереди
const validateErrNtfMail = val => {
return validateMailList(val);
};
//------------------
// Интерфейс модуля
//------------------
@ -85,6 +103,14 @@ 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.NAUTH_ONLY_YES = NAUTH_ONLY_YES;
exports.NAUTH_ONLY_NO = NAUTH_ONLY_NO;
exports.SAUTH_ONLY_YES = SAUTH_ONLY_YES;
exports.SAUTH_ONLY_NO = SAUTH_ONLY_NO;
exports.NERR_NTF_SIGN_NO = NERR_NTF_SIGN_NO;
exports.NERR_NTF_SIGN_YES = NERR_NTF_SIGN_YES;
exports.SERR_NTF_SIGN_NO = SERR_NTF_SIGN_NO;
exports.SERR_NTF_SIGN_YES = SERR_NTF_SIGN_YES;
//Схема валидации функции сервиса
exports.ServiceFunction = new Schema({
@ -270,5 +296,74 @@ exports.ServiceFunction = new Schema({
validateAppSrvFn:
"Обработчик сообщения 'после' на строне сервера приложений для функции сервиса (sAppSrvBefore) имеет некорректный формат, ожидалось: <МОДУЛЬ>.js/<ФУНКЦИЯ>"
}
},
//Признак необходимости аутентификации для исполнения функции сервсиа обмена
nAuthOnly: {
type: Number,
enum: [NAUTH_ONLY_NO, NAUTH_ONLY_YES],
required: true,
message: {
type:
"Признак необходимости аутентификации для исполнения функции сервсиа обмена (nAuthOnly) имеет некорректный тип данных (ожидалось - Number)",
enum:
"Значение признака необходимости аутентификации для исполнения функции сервсиа обмена (nAuthOnly) не поддерживается",
required: "Не указан признак необходимости аутентификации для исполнения функции сервсиа обмена (nAuthOnly)"
}
},
//Признак необходимости аутентификации для исполнения функции сервсиа обмена (строковый код)
sAuthOnly: {
type: String,
enum: [SAUTH_ONLY_NO, SAUTH_ONLY_YES],
required: true,
message: {
type:
"Строковый код признака необходимости аутентификации для исполнения функции сервсиа обмена (sAuthOnly) имеет некорректный тип данных (ожидалось - String)",
enum:
"Значение строкового кода признака необходимости аутентификации для исполнения функции сервсиа обмена (sAuthOnly) не поддерживается",
required:
"Не указан строковый код признака необходимости аутентификации для исполнения функции сервсиа обмена (sAuthOnly)"
}
},
//Признак оповещения об ошибке исполнения сообщения очереди для функции обработки
nErrNtfSign: {
type: Number,
enum: [NERR_NTF_SIGN_NO, NERR_NTF_SIGN_YES],
required: true,
message: {
type:
"Признак оповещения об ошибке исполнения сообщения очереди для функции обработки (nErrNtfSign) имеет некорректный тип данных (ожидалось - Number)",
enum:
"Значение признака оповещения об ошибке исполнения сообщения очереди для функции обработки (nErrNtfSign) не поддерживается",
required:
"Не указан признак оповещения об ошибке исполнения сообщения очереди для функции обработки (nErrNtfSign)"
}
},
//Признак оповещения об ошибке исполнения сообщения очереди для функции обработки (строковый код)
sErrNtfSign: {
type: String,
enum: [SERR_NTF_SIGN_NO, SERR_NTF_SIGN_YES],
required: true,
message: {
type:
"Строковый код признака оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfSign) имеет некорректный тип данных (ожидалось - String)",
enum:
"Значение строкового кода признака оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfSign) не поддерживается",
required:
"Не указан строковый код признака оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfSign)"
}
},
//Список адресов E-Mail для оповещения об ошибке исполнения сообщения очереди для функции обработки
sErrNtfMail: {
type: String,
required: false,
use: { validateErrNtfMail },
message: {
type:
"Список адресов E-Mail для оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfMail) имеет некорректный тип данных (ожидалось - String)",
required:
"Не указан список адресов E-Mail для оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfMail)",
validateErrNtfMail:
"Неверный формат списка адресов E-Mail для оповещения об ошибке исполнения сообщения очереди для функции обработки (sErrNtfMail), для указания нескольких адресов следует использовать запятую в качестве разделителя (без пробелов)"
}
}
});

View File

@ -78,6 +78,89 @@ exports.getServiceFunctions = new Schema({
}
});
//Схема валидации параметров функции получения контекста сервиса
exports.getServiceContext = new Schema({
//Идентификатор сервиса
nServiceId: {
type: Number,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
}
});
//Схема валидации параметров функции установки контектса сервиса
exports.setServiceContext = new Schema({
//Идентификатор сервиса
nServiceId: {
type: Number,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
},
//Контекст сервиса
sCtx: {
type: String,
required: true,
message: {
type: path => `Контекст сервиса (${path}) имеет некорректный тип данных (ожидалось - String)`,
required: path => `Не указан контекст сервиса (${path})`
}
},
//Дата истечения контекста сервиса
dCtxExp: {
type: Date,
required: false,
message: {
type: path => `Дата истечения контекст сервиса (${path}) имеет некорректный тип данных (ожидалось - Date)`,
required: path => `Не указана дата истечения контекста сервиса (${path})`
}
}
});
//Схема валидации параметров функции очистки контекста сервиса
exports.clearServiceContext = new Schema({
//Идентификатор сервиса
nServiceId: {
type: Number,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
}
});
//Схема валидации параметров функции проверки аутентифицированности сервиса
exports.isServiceAuth = new Schema({
//Идентификатор сервиса
nServiceId: {
type: Number,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
}
});
//Схема валидации параметров функции постановки в очередь задания на аутентификацию сервиса
exports.putServiceAuthInQueue = new Schema({
//Идентификатор сервиса
nServiceId: {
type: Number,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
}
});
//Схема валидации параметров функции записи в журнал работы сервиса
exports.putLog = new Schema({
//Тип сообщения журнала работы сервиса

View File

@ -85,6 +85,73 @@ const getServiceFunctions = async prms => {
}
};
//Получение контекста сервиса
const getServiceContext = async prms => {
try {
let res = await prms.connection.execute(
"BEGIN PKG_EXS.SERVICE_CTX_GET(NFLAG_SMART => 0, NEXSSERVICE => :NEXSSERVICE, RCSERVICE_CTX => :RCSERVICE_CTX); END;",
{ NEXSSERVICE: prms.nServiceId, RCSERVICE_CTX: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } },
{ outFormat: oracledb.OBJECT }
);
let rows = await readCursorData(res.outBinds.RCSERVICE_CTX);
return rows[0];
} catch (e) {
throw new Error(e.message);
}
};
//Установка контекста сервиса
const setServiceContext = async prms => {
try {
await prms.connection.execute(
"BEGIN PKG_EXS.SERVICE_CTX_SET(NEXSSERVICE => :NEXSSERVICE, SCTX => :SCTX, DCTX_EXP => :DCTX_EXP); END;",
{ NEXSSERVICE: prms.nServiceId, SCTX: prms.sCtx, DCTX_EXP: prms.dCtxExp },
{ autoCommit: true }
);
} catch (e) {
throw new Error(e.message);
}
};
//Очистка контекста сервиса
const clearServiceContext = async prms => {
try {
await prms.connection.execute(
"BEGIN PKG_EXS.SERVICE_CTX_CLEAR(NEXSSERVICE => :NEXSSERVICE); END;",
{ NEXSSERVICE: prms.nServiceId },
{ autoCommit: true }
);
} catch (e) {
throw new Error(e.message);
}
};
//Проверка атуентифицированности сервиса
const isServiceAuth = async prms => {
try {
let res = await prms.connection.execute(
"BEGIN :RET := PKG_EXS.SERVICE_IS_AUTH(NEXSSERVICE => :NEXSSERVICE); END;",
{ NEXSSERVICE: prms.nServiceId, RET: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER } }
);
return res.outBinds.RET;
} catch (e) {
throw new Error(e.message);
}
};
//Постановка в очередь задания на аутентификацию сервиса
const putServiceAuthInQueue = async prms => {
try {
await prms.connection.execute(
"BEGIN PKG_EXS.SERVICE_AUTH_PUT_INQUEUE(NEXSSERVICE => :NEXSSERVICE); END;",
{ NEXSSERVICE: prms.nServiceId },
{ autoCommit: true }
);
} catch (e) {
throw new Error(e.message);
}
};
//Запись в протокол работы
const log = async prms => {
try {
@ -296,6 +363,11 @@ exports.connect = connect;
exports.disconnect = disconnect;
exports.getServices = getServices;
exports.getServiceFunctions = getServiceFunctions;
exports.getServiceContext = getServiceContext;
exports.setServiceContext = setServiceContext;
exports.clearServiceContext = clearServiceContext;
exports.isServiceAuth = isServiceAuth;
exports.putServiceAuthInQueue = putServiceAuthInQueue;
exports.log = log;
exports.getQueue = getQueue;
exports.putQueue = putQueue;