UNPKG

prg-class

Version:

Clases genéricas utilizadas por microservicios Programamos SPA.

405 lines (404 loc) 15.8 kB
"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.UAO); return ''; } const lsErrNum = '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; } 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; } 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; } } } } } 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.UAO); return lsErr; } if (lsM !== 'OPTIONS') { const loP = { UA: loUPRM.UA, // loUPRM.UAO 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;