prg-class
Version:
Clases genéricas utilizadas por microservicios Programamos SPA.
405 lines (404 loc) • 15.8 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseClass = void 0;
const obj_xls_1 = require("../obj-xls/obj-xls");
const C = require('prg-constant');
const F = require('../function/function'); // Funciones genéricas.
const jwt_1 = require("../jwt/jwt");
// const Jwt = require('prg-jwt');
// const expressPino = require('express-pino-logger')({});
// const pino = require('pino')('./logs/info.log');
// const expressPinoFile = require('express-pino-logger')({
// logger: pino,
// });
class BaseClass {
constructor() {
this.msErrAuth = '';
this.mbAudit = false;
this.mbEnsureAuth = true;
this.useExcelWidth = false; // Usar medidas de Excel para exportar.
this.unitToXls = 1.42857142857143; // Unidades a Excel.
this.xlsToUnit = 0.7; // Excel a Unidades.
this.msPermiso = '';
this.moIdApp = [];
this.moColSql = []; // Arreglo para auditar.
this.moUPRM = { IP: '', P_EMP: '', P_SUC: '', P_SYS: '', P_TKN: '', P_USR: '', UA: '' };
this.msTable = '';
this.msPk = '';
this.msView = '';
this.mbLogme = false;
this.mbCanOperate = false;
this.msModuleName = this.constructor.name;
}
fnInitClass(aoReq) {
this.auditMe(this.mbAudit, 'fnInitClass...start', '');
this.mbCanOperate = this.setIpUa(aoReq);
}
fnVoid() {
return new Promise((resolve) => {
return resolve(F.fnReturn(null, null, C.HttpCode.Ok.OK));
});
}
allRight() {
return new Promise((resolve) => {
return resolve(F.fnReturn(null, null, C.HttpCode.Ok.OK));
});
}
getUsr() {
let lsUsr = this.getUPRMValue('P_USR');
if (F.trim(lsUsr) === '') {
lsUsr = '-1';
}
return lsUsr;
}
auditMe(abAudit, asTitle, aoValue) {
if (abAudit) {
this.developerMsg(asTitle, aoValue);
}
}
developerMsg(asTitle, aoValue) {
console.log(asTitle, aoValue);
}
getSys() {
let lsValue = this.getUPRMValue('P_SYS');
if (F.trim(lsValue) === '') {
lsValue = '-1';
}
return F.intval(lsValue);
}
getCompany() {
let lsValue = this.getUPRMValue('P_EMP');
if (F.trim(lsValue) === '') {
lsValue = '-1';
}
return F.intval(lsValue);
}
getCampus() {
let lsValue = this.getUPRMValue('P_SUC');
if (F.trim(lsValue) === '') {
lsValue = '-1';
}
return F.intval(lsValue);
}
getMaq() {
return this.getUPRMValue('IP');
}
init(aoUPRM, aoIdApp, asTable, asPk, asView) {
this.moUPRM = aoUPRM;
this.moIdApp = aoIdApp;
this.msTable = asTable;
this.msPk = asPk;
this.msView = asView;
}
logme(asFunction, aoErr, asSql) {
if (this.mbLogme) {
return;
}
}
readFileSync(asFile_1, aoFs_1) {
return __awaiter(this, arguments, void 0, function* (asFile, aoFs, asEncoding = 'utf8') {
try {
const loData = aoFs.readFileSync(asFile, asEncoding);
return F.fnRetOk(loData);
}
catch (err) {
return F.fnRetErrInt(err);
}
});
}
deleteFileSync(asFile, aoFs) {
return __awaiter(this, void 0, void 0, function* () {
try {
aoFs.unlinkSync(asFile);
return F.fnRetOk('');
}
catch (err) {
return F.fnRetErrInt(err);
}
});
}
// protected async deleteFileSyncDelay(asFile: string, aoFs: any): Promise<IParamRet> {
// try {
// aoFs.unlinkSync(asFile);
// return F.fnRetOk('');
// } catch (err) {
// return F.fnRetErrInt(err);
// }
// }
writeFileSync(asFile, aoFs, aoContent) {
return __awaiter(this, void 0, void 0, function* () {
try {
aoFs.writeFileSync(asFile, aoContent);
return F.fnRetOk('');
}
catch (err) {
return F.fnRetErrInt(err);
}
});
}
getCHF(asField, asCaption, asType = C.tipoCampo.String, asFieldAlt = '') {
const lsFldAlt = asFieldAlt === '' ? asField : asFieldAlt;
return { n: asField, c: asCaption, t: asType, fa: lsFldAlt };
}
checkMod(aoNewData, aoOldData, aoCheck) {
const loMod = [];
const llDec = 2;
aoCheck.forEach((check) => {
let lsOld = '';
let lsNew = '';
if (check.t === C.tipoCampo.String) { // String.
lsOld = F.trim(aoOldData[check.n]);
lsNew = F.trim(aoNewData[check.fa]);
}
if (check.t === C.tipoCampo.Numero) { // Número.
lsOld = F.floatval(aoOldData[check.n]);
lsNew = F.floatval(aoNewData[check.fa]);
lsOld = F.floatval(Number.parseFloat(lsOld).toFixed(llDec));
lsNew = F.floatval(Number.parseFloat(lsNew).toFixed(llDec));
}
if (check.t === C.tipoCampo.Moneda) { // Moneda.
lsOld = F.floatval(aoOldData[check.n]);
lsNew = F.floatval(aoNewData[check.fa]);
lsOld = F.floatval(Number.parseFloat(lsOld).toFixed(llDec));
lsNew = F.floatval(Number.parseFloat(lsNew).toFixed(llDec));
lsOld = F.numberFormat(lsOld, '$ ', llDec);
lsNew = F.numberFormat(lsNew, '$ ', llDec);
}
if (check.t === C.tipoCampo.Porcentaje) { // Porcentaje.
lsOld = F.floatval(aoOldData[check.n]);
lsNew = F.floatval(aoNewData[check.fa]);
lsOld = F.floatval(Number.parseFloat(lsOld).toFixed(llDec));
lsNew = F.floatval(Number.parseFloat(lsNew).toFixed(llDec));
lsOld = F.numberFormat(lsOld, '', llDec, ' %');
lsNew = F.numberFormat(lsNew, '', llDec, ' %');
}
if (check.t === C.tipoCampo.Boolean) { // Boolean.
lsOld = F.intval(aoOldData[check.n]) === 1 ? 'SI' : 'NO';
lsNew = F.intval(aoNewData[check.fa]) === 1 ? 'SI' : 'NO';
}
if (check.t === C.tipoCampo.Fecha) { // Fecha.
lsOld = F.fechaChile(aoOldData[check.n]);
lsNew = F.fechaChile(aoNewData[`_${check.fa}`]);
}
if (lsOld === null || lsOld === undefined) {
lsOld = '';
}
if (lsNew === null || lsNew === undefined) {
lsNew = '';
}
if (lsOld !== lsNew) {
loMod.push({ n: check.n, c: check.c, a: lsOld, d: lsNew });
}
});
return JSON.stringify(loMod);
}
getUPRMValue(asField) {
let lsRet = '';
if (this.moUPRM) {
const loObj = this.moUPRM;
lsRet = loObj[asField];
if (lsRet === undefined || lsRet === null) {
lsRet = '';
}
}
return lsRet;
}
// protected fnFec(asField: string): string {
// const lsTz: string = U.Params.App.Timezone.Database;
// return `(${asField} at time zone '${lsTz}') AT TIME ZONE 'UTC' `;
// }
/**
* Define una columna para exportar datos a Excel y/o mostrar lista de datos a Cliente.
*
* @protected
* @param {string} asFieldName Nombre de campo en base de datos.
* @param {string} asCaption Nombre de encabezado de columna.
* @param {number} [alWidth=100] Ancho de columna,
* @param {string} [asFormat=""] Formato para exportar a Excel.
* @param {string} [asAlign="left"] Alineación de campo al exportar a Excel.
* @param {number} [alType=101] Tipo del campo. Por defecto será texto.
* @param {string} [asFormatCli=""] Formato para cliente.
* @param {string} [asTootip=""] Tooltip de encabezado de columna.
* @param {number} [alMaxWidth=0] Ancho máximo ancho para lista de datos.
* @returns {*}
* @memberof jaxClass
*/
fnRowXls(asFieldName, asCaption, alWidth = 100, asFormat = '', asAlign = 'left', alType = 101, alListOrder = 0) {
if (this.useExcelWidth) { // Convierte ancho de Excel a unidades.
alWidth *= this.unitToXls;
}
const loRet = {
t: alType,
a: F.trim(asAlign),
n: F.trim(asFieldName),
f: F.trim(asFormat),
c: F.trim(asCaption),
w: alWidth,
lo: alListOrder,
};
return loRet;
}
fnMakeXlsParams(aoParams, asTitle, asTag, asSubject) {
// Factor de conversión para unidades de ancho de excel.
// Unidades a Excel: 1,42857142857143.
// Excel a Unidades: 0,7.
const loW = { title: asTitle, tag: asTag, subject: asSubject };
aoParams.wb = loW;
}
fnExportDataToExcel(aoParams) {
return new Promise((resolve, reject) => {
return this.fnExportDatasetXls(aoParams).then((d) => {
if (d.error) {
return reject(F.fnReturn(d.error, null, C.HttpCode.Error.ServerError));
}
else {
return resolve(F.fnReturn(null, d.json, C.HttpCode.Ok.OK));
}
});
});
}
/**
* Exporta lista de datos a Excel.
*/
fnExportDatasetXls(aoParams) {
return new Promise((resolve, reject) => {
const loUt = new obj_xls_1.ObjExcel();
aoParams.u = this.getUPRMValue('P_USR');
return loUt.fnExportDataset(aoParams).then((d) => {
return resolve(F.fnReturn(null, d.json, C.HttpCode.Ok.OK));
});
});
}
genericReturn(aoRet) {
return __awaiter(this, void 0, void 0, function* () {
if (aoRet.error) {
return aoRet;
}
if (aoRet.json.r !== 1) {
return F.fnRetErrInt(aoRet.json.rs[0]);
}
return F.fnRetOk(aoRet.json.rs[0]);
});
}
waitMe(alSec) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((rs, rj) => {
setTimeout(() => {
return rs(this.allRight());
}, alSec * 1000);
});
});
}
setIpUa(aoReq) {
this.auditMe(this.mbAudit, 'setIpUa...start', '');
const loUPRM = F.middlewareIpUa(aoReq);
this.auditMe(this.mbAudit, 'setIpUa...loUPRM', loUPRM);
this.msErrAuth = this.ensureAuth(loUPRM, aoReq ? aoReq.method : '');
return this.msErrAuth === '';
}
ensureAuth(aoUPRM, asMethod) {
this.auditMe(this.mbAudit, '001..........ensureAuth...aoUPRM', aoUPRM);
const loUPRM = aoUPRM ? aoUPRM : { IP: '', UA: '', UAO: '', TOKEN: '' };
if (!this.mbEnsureAuth) {
this.setFakeUserParam(loUPRM.IP, loUPRM.UA);
return '';
}
const lsErrNum = 'Wrong token.'; // 'Missing auth. headers.';
let lsErr = '';
const lsIpHead = loUPRM.IP;
const lsUAHead = loUPRM.UA;
let loObjPayload;
const lsToken = loUPRM.TOKEN;
this.auditMe(this.mbAudit, '002..........ensureAuth...token', lsToken);
const lsM = F.trim(asMethod).toUpperCase();
this.auditMe(this.mbAudit, '003..........ensureAuth...asMethod', asMethod);
// Validate Token, if needed.
if (lsM.toUpperCase() !== 'OPTIONS' && this.mbEnsureAuth) {
try {
const loObj = new jwt_1.PrgJwt();
loObjPayload = loObj.fnDecodeToken(lsToken);
this.auditMe(this.mbAudit, '004..........ensureAuth...loObjPayload', loObjPayload);
if (loObjPayload === null) {
F.fnLogError('Ataque. Token inválido.');
lsErr = `${lsErrNum} (1)`;
}
else {
if (loObjPayload.exp <= F.unixDate(new Date())) { // Valida fecha de expiración.
lsErr = 'Expired token.';
}
else {
const lsIpToken = loObjPayload.ip;
const lsUAToken = loObjPayload.ua;
if (lsIpToken !== undefined) { // Si corresponde, valida dirección IP.
if (lsIpHead !== loObjPayload.ip) { // Valida que la dirección IP de la petición coincidan con el token.
F.fnLogError(`Ataque de IP. Se espera: ${lsIpToken}. Se recibe: ${lsIpHead}.`);
lsErr = `${lsErrNum} (2)`;
}
if (lsUAHead !== loObjPayload.ua) { // Valida que el user-agent de la petición coincida con el token.
F.fnLogError(`Ataque de USER-AGENT. Se espera: ${lsUAToken}. Se recibe: ${lsUAHead}.`);
lsErr = `${lsErrNum} (3)`;
}
}
}
}
}
catch (error) {
F.fnLogError('Error en ensureAuth');
F.fnLogError(error);
lsErr = lsErrNum;
}
}
this.auditMe(this.mbAudit, '005..........ensureAuth...valida...error', lsErr);
if (lsErr !== '') {
this.setFakeUserParam(loUPRM.IP, loUPRM.UA);
return lsErr;
}
if (lsM !== 'OPTIONS') {
const loP = {
UA: loUPRM.UA,
UAO: loUPRM.UAO,
IP: loUPRM.IP,
P_USR: loObjPayload.sub,
P_SYS: loObjPayload.idsys,
P_EMP: loObjPayload.idemp,
P_SUC: loObjPayload.idsuc,
P_TKN: lsToken,
};
this.auditMe(this.mbAudit, '006..........ensureAuth...crea...UPRM...loP', loP);
this.moUPRM = loP;
this.auditMe(this.mbAudit, '007..........ensureAuth...asigna UPRM...this.moUPRM', this.moUPRM);
}
else {
this.auditMe(this.mbAudit, '008..........ensureAuth...methos...es...OPTIONS???', lsM);
}
return lsErr;
}
setFakeUserParam(asIP, asUA) {
const loP = {
UA: asUA,
IP: asIP,
P_USR: '-1',
P_SYS: '-1',
P_EMP: '-1',
P_SUC: '-1',
P_TKN: '',
};
this.moUPRM = loP;
}
getUPRM() {
return this.moUPRM;
}
getToken(aiIidUser, aiIdSys, aiIdEmp, aiIdSuc, asIp, asUserAgent) {
return new jwt_1.PrgJwt().fnCreateToken(aiIidUser, aiIdSys, aiIdEmp, aiIdSuc, asIp, asUserAgent);
}
}
exports.BaseClass = BaseClass;