UNPKG

mp-holistic

Version:

si prefigge l'umile compito di aiutare nella creazione di : - un server API REST mediante express - un semplice ORM per Postgres Questo tramite decoratori o classi particolari.

347 lines (311 loc) 11.1 kB
import { IMetaParametro } from "../../metadata/parametro.metadata"; import crypto from "crypto"; import { Request, Response } from "express"; import { ICache } from "../../main/main"; import { SanificatoreCampo } from "./SanificatoreCampo"; import { ErroreMio } from "./ErroreMio"; import { MainExpress } from "../main.express"; import { ITracciamentoQualita } from "../metodo.express"; import fs from "fs"; import { IFile } from "../metodo/MetodoParametri"; export type TypePosizione = "body" | "query" | 'header'; export type TypeDovePossoTrovarlo = TypeInterazone | "qui" | 'non-qui'; export type TypeInterazone = "rotta" | "middleware" | 'ambo'; /* export interface IRitornoValidatore { body?: any | string, approvato: boolean, messaggio: string, stato?: number, terminale?: IExpressParametro } */ export interface IResponse { body: string } export interface IParametri { body: string, query: string, header: string } export interface INonTrovato { nome: string, posizioneParametro: number } export interface IParametriEstratti { valoriParametri: any[], nontrovato: INonTrovato[], errori: IRitornoValidatore[] } export interface INonTrovato { nome: string, posizioneParametro: number } export interface IRitornoValidatore { body?: any /* object */ | string, approvato: boolean, messaggio: string, stato?: number, terminale?: IMetaParametro } export interface IReturn { body: any /* object */ | string; stato: number; nonTrovati?: INonTrovato[]; inErrore?: IRitornoValidatore[]; attore?: any; } export interface ISpawTrigger { nome: string, posizione: TypePosizione } export type TypeMetod = "get" | "put" | "post" | "patch" | "purge" | "delete" | "file"; export function IsJsonString(str: string): boolean { try { // eslint-disable-next-line no-useless-escape if (/^[\],:{}\s]*$/.test(str.replace(/\\["\\\/bfnrtu]/g, '@'). // eslint-disable-next-line no-useless-escape replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { //the json is ok if (typeof str === 'object') { return true; } else { return false; } } else { //the json is not ok return false; } } catch (e) { return false; } } export function SostituisciRicorsivo(sanific: SanificatoreCampo[], currentNode: any): any { // eslint-disable-next-line prefer-const for (let attribut in currentNode) { if (typeof currentNode[attribut] === 'object') { currentNode[attribut] = SostituisciRicorsivo(sanific, currentNode[attribut]); } else { for (let index = 0; index < sanific.length; index++) { const element = sanific[index]; if (attribut == element.campoDaCercare) { currentNode[attribut] = element.valoreFuturo; } } } return currentNode; } } /** * @messaggio : inserisci qui il messaggio sara incontenuto del body o del testo nel .send() di express * @codiceErrore inserisci qui l'errore che sara posi messo nello stato della risposta express * @nomeClasse inserire solo se si alla creazione ovvero nel throw new ErroreMio(....) * @nomeFunzione inserire solo se si alla creazione ovvero nel throw new ErroreMio(....) * @percorsoErrore campo gestito dala classe GestioneErrore, se proprio si vuole inserire solo se si è nella fase di rilancio di un errore */ export interface IErroreMio { messaggio: string, codiceErrore: number, nomeClasse?: string, nomeFunzione?: string, percorsoErrore?: string } export interface IGestioneErrore { error: Error, nomeClasse?: string, nomeFunzione?: string } export function GestioneErrore(item: IGestioneErrore): ErroreMio { let errore: ErroreMio; const messaggio = '_CLASSE_->' + item.nomeClasse ?? '' + '_FUNZIONE_->' + item.nomeFunzione; if (item.error instanceof ErroreMio) { const tmp: ErroreMio = <ErroreMio>item.error; tmp.percorsoErrore = messaggio + '->' + tmp.percorsoErrore; errore = tmp; } else { errore = new ErroreMio({ codiceErrore: 499, messaggio: '' + item.error, percorsoErrore: messaggio }); } return errore; } export function CalcolaChiaveMemoryCache(req: Request): string { const keySHA = 'Besagno' const headerTmp = req.headers['authorization'] != undefined ? String(req.headers['authorization']) : JSON.stringify({ "Aauthorization9X": "10" }) const tmp = '-' + JSON.stringify(req.body) + '-' + headerTmp + '-' + JSON.stringify(req.query) + '-'; const tmpmd = crypto.createHmac('sha1', keySHA) .update(tmp).digest('hex'); const ritorno = '__express__' + req.url + '__MP__' + tmpmd + '__'; return ritorno; } export interface ILogbase { data: Date; body: any; params: any; header: any; local: string; remote: string; url: string; nomeMetodo?: string } export function InizializzaLogbaseIn(req: Request, nomeMetodo?: string): ILogbase { const params = req.params; const body = req.body; const data = new Date(Date.now()); const header = JSON.parse(JSON.stringify(req.headers)); const local = req.socket.localAddress + " : " + req.socket.localPort; const remote = req.socket.remoteAddress + " : " + req.socket.remotePort; const url = req.originalUrl; /* const tmp = "Arrivato in : " + nomeMetodo + "\n" + "Data : " + new Date(Date.now()) + "\n" + "url : " + req.originalUrl + "\n" + "query : " + JSON.stringify(req.query) + "\n" + "body : " + JSON.stringify(req.body) + "\n" + "header : " + JSON.stringify(req.headers) + "\n" + "soket : " + "\n" + "local : " + req.socket.localAddress + " : " + req.socket.localPort + "\n" + "remote : " + req.socket.remoteAddress + " : " + req.socket.remotePort + "\n"; */ const tmp: ILogbase = { params: params, body: body, data: data, header: header, local: local, remote: remote, url: url, nomeMetodo: nomeMetodo }; return tmp; } export function Rispondi(res: Response, item: IReturn, id: ITracciamentoQualita, isFile?: IFile, key?: string, durationSecondi?: number /* , url: string */) { res.statusCode = Number.parseInt('' + item.stato); if (isFile) { try { if (isFile.send == undefined) { res.sendFile(isFile.path); } else { isFile.send(res, item); } } catch (error) { if (isFile.catch == undefined) { res.status(598).send({}); } else { try { isFile.catch(res, error); } catch (error) { res.status(598).send({}); } } } } else { res.send(item.body); } id.fine = new Date().getTime(); id.differenza = id.fine - id.inizio; if (id && 'res' in id && res) { id.res = res; } let cache: any = []; let tmpReq = ''; let tmpRes = ''; try { tmpReq = //id.req ?? ''; JSON.stringify(id.req, (key, value) => { if (typeof value === 'object' && value !== null && cache) { // Duplicate reference found, discard key if (cache.includes(value)) return; // Store value in our collection cache.push(value); } return value; }); cache = undefined; } catch (error) { tmpReq = 'errore : ' + error; } try { tmpRes = //id.res ?? ''; JSON.stringify(id.req, (key, value) => { if (typeof value === 'object' && value !== null && cache) { // Duplicate reference found, discard key if (cache.includes(value)) return; // Store value in our collection cache.push(value); } return value; }); cache = undefined; } catch (error) { tmpRes = 'error : ' + error; } const stamp = ` <!--################ processo:${MainExpress.portaProcesso} id:${id.id}; inizio:${new Date(id.inizio).toISOString()}; inizio-time: ${id.inizio} tempo:${id.differenza}; req: ${tmpReq} res: ${tmpRes} ################--!> `; console.log(stamp); //fs.writeFileSync('./LogExpress/Processo_' + MainExpress.portaProcesso + '/' + 'log.txt', stamp,); /* var logger = fs.createWriteStream('./LogExpress/Processo_' + MainExpress.portaProcesso + '/' + 'log.txt', { flags: 'a' }); logger.write(stamp); */ try { fs.appendFileSync('./LogExpress/Processo_' + MainExpress.portaProcesso + '/' + 'log.txt', stamp); } catch (error) { console.log(error); } if (key != undefined) { const tempo = (durationSecondi ?? 1); MainExpress.cache.set<ICache>(key, <ICache>{ body: item.body, stato: res.statusCode }, tempo /* 1000 */); } } export function ConstruisciErrore(messaggio: any): IReturn { return { stato: 500, body: { errore: messaggio } } } export function InizializzaLogbaseOut(res: Response, nomeMetodo?: string): ILogbase { const params = {}; const body = {}; const data = new Date(Date.now()); const header = res.getHeaders(); const local = res.socket?.localAddress + " : " + res.socket?.localPort; const remote = res.socket?.remoteAddress + " : " + res.socket?.remotePort; const url = ''; const tmp: ILogbase = { params: params, body: body, data: data, header: header, local: local, remote: remote, url: url, nomeMetodo: nomeMetodo }; /* const tmp = "Arrivato in : " + nomeMetodo + "\n" + "Data : " + new Date(Date.now()) + "\n" + "headersSent : " + req.headersSent + "\n" + "json : " + req.json + "\n" + "send : " + req.send + "\n" + "sendDate : " + req.sendDate + "\n" + "statusCode : " + req.statusCode + '\n' + "statuMessage : " + req.statusMessage + '\n' + "soket : " + "\n" + "local : " + t1 + "\n" + "remote : " + t2 + "\n"; */ return tmp; }