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.

864 lines (822 loc) 41.9 kB
import slowDown from "express-slow-down"; import rateLimit from "express-rate-limit"; import helmet from "helmet"; import cors from 'cors'; import { Request, Response } from "express"; import fs from 'fs'; import { IMetaMetodo, ListaMetadataMetodo, MetadataMetodo } from "../metadata/metodo.metadata"; import { ICache } from "../main/main"; import { exec } from "child_process"; import { ExpressParametro, ListaExpressParametro } from "./parametro.express"; import { IFile, IMetodoParametri, MetodoParametri } from "./metodo/MetodoParametri"; import { IMetodoVettori, MetodoVettori } from "./metodo/MetodoVettori"; import { IMetodoEventi, MetodoEventi } from "./metodo/MetodoEventi"; import { IMetodoLimitazioni, MetodoLimitazioni } from "./metodo/MetodoLimitazioni"; import { IReturn, CalcolaChiaveMemoryCache, InizializzaLogbaseIn, Rispondi, ConstruisciErrore, IRitornoValidatore, InizializzaLogbaseOut, IsJsonString, IParametriEstratti, SostituisciRicorsivo } from "./utility/utility"; import { IRaccoltaPercorsi } from "./metodo/utility"; import { ErroreMio } from "./utility/ErroreMio"; import { MainExpress } from "./main.express"; import { GenerateID } from "../utility"; import { IMetodoSpawProcess, MetodoSpawProcess } from "./metodo/MetodoSpawProcess"; import { randomUUID } from "crypto"; export interface ITracciamentoQualita { id: string, inizio: number, fine?: number, differenza?: number, req?: any, res?: any } export interface IExpressMetodo extends IMetaMetodo { metodoEventi?: IMetodoEventi; metodoParametri?: IMetodoParametri; metodoLimitazioni?: IMetodoLimitazioni; metodoVettori?: IMetodoVettori; /** * Attenzione! questo è da attivare solo sul metodo che determinera l'avvio del nuovo processo! */ metodoSpawProcess?: IMetodoSpawProcess; } export class ExpressMetodo extends MetadataMetodo implements IExpressMetodo { metodoSpawProcess: MetodoSpawProcess = new MetodoSpawProcess(); metodoEventi: MetodoEventi = new MetodoEventi(); metodoParametri: MetodoParametri = new MetodoParametri(); metodoLimitazioni: MetodoLimitazioni = new MetodoLimitazioni(); metodoVettori: MetodoVettori = new MetodoVettori(); constructor(item: IExpressMetodo) { super(item); this.listaParametri = new ListaExpressParametro(); if (item.metodoEventi) this.metodoEventi.Init(item.metodoEventi); if (item.metodoParametri) this.metodoParametri.Init(item.metodoParametri, this.nomeVariante); else this.metodoParametri.Init({ path: this.nomeVariante }); if (item.metodoLimitazioni) this.metodoLimitazioni.Init(item.metodoLimitazioni); if (item.metodoVettori) this.metodoVettori.Init(item.metodoVettori); if (item.metodoSpawProcess) this.metodoSpawProcess.Init(item.metodoSpawProcess); } Init(item: ExpressMetodo) { /* this.metodoParametri.path = item.nomeVariante; */ if (item.listaParametri != undefined) this.listaParametri = item.listaParametri; if (item.metodoAvviabile) this.metodoAvviabile = item.metodoAvviabile; this.metodoEventi.Init(item.metodoEventi); this.metodoParametri.Init(item.metodoParametri, this.nomeVariante); this.metodoLimitazioni.Init(item.metodoLimitazioni); this.metodoVettori.Init(item.metodoVettori); this.metodoSpawProcess.Init(item.metodoSpawProcess); } Mergia(item: ExpressMetodo) { super.Mergia(item); if (item.listaParametri != undefined && this.listaParametri != undefined) this.listaParametri.Mergia(item.listaParametri); if (item.metodoAvviabile) this.metodoAvviabile = item.metodoAvviabile; this.metodoEventi.Init(item.metodoEventi); this.metodoParametri.Init(item.metodoParametri, this.nomeVariante); this.metodoLimitazioni.Init(item.metodoLimitazioni); this.metodoVettori.Init(item.metodoVettori); this.metodoSpawProcess.Init(item.metodoSpawProcess); } GetThis() { return this; } ConfiguraRottaApplicazione(app: any, percorsi: IRaccoltaPercorsi) { this.metodoParametri.percorsi.patheader = percorsi.patheader; this.metodoParametri.percorsi.porta = percorsi.porta; const pathGlobalTmp = percorsi.pathGlobal; const pathGlobal = percorsi.pathGlobal + '/' + this.metodoParametri.path; this.metodoParametri.percorsi.pathGlobal = pathGlobal; /* */ const middlew: any[] = []; let percorsoTmp = ''; if (this.metodoParametri.percorsoIndipendente) { percorsoTmp = '/' + this.metodoParametri.path; this.metodoParametri.percorsi.pathGlobal = percorsoTmp; } else { percorsoTmp = this.metodoParametri.percorsi.pathGlobal; } if (this.metodoAvviabile != undefined) { this.ConfiguraRotteSwitch(app, percorsoTmp, middlew); } if (this.metodoVettori.listaHtml) { percorsoTmp = ''; for (let index = 0; index < this.metodoVettori.listaHtml.length; index++) { const element = this.metodoVettori.listaHtml[index]; if (element.percorsoIndipendente) percorsoTmp = '/' + element.path; else percorsoTmp = pathGlobalTmp + '/' + element.path; if (this.metodoAvviabile != undefined) { this.ConfiguraRotteHtml(app, percorsoTmp, element.contenuto); } } } } ConfiguraRotteHtml(app: any, percorsoTmp: string, contenuto: string) { (<IReturn>this.metodoAvviabile).body; let corsOptions = {}; corsOptions = { methods: 'GET', } if (this.metodoLimitazioni.cors == undefined) { this.metodoLimitazioni.cors = cors(corsOptions); } if (this.metodoLimitazioni.helmet == undefined) { this.metodoLimitazioni.helmet = helmet(); } app.get(percorsoTmp, /* this.cors, this.helmet, */ async (req: Request, res: Response) => { if (this.metodoVettori.listaHtml) res.send(contenuto); else res.sendStatus(404); }); } PrintStruttura(): string { let parametri = ""; for (let index = 0; index < this.listaParametri.length; index++) { const element = <ExpressParametro>this.listaParametri[index]; parametri = parametri + element.PrintStruttura() + '\n'; } if (this.metodoEventi) parametri = parametri + this.metodoEventi.PrintStruttura(); if (this.metodoParametri) parametri = parametri + this.metodoParametri.PrintStruttura(); if (this.metodoLimitazioni) parametri = parametri + this.metodoLimitazioni.PrintStruttura(); if (this.metodoVettori) parametri = parametri + this.metodoVettori.PrintStruttura(); const tmp = this.nomeVariante + ' | ' + this.metodoParametri.percorsi.pathGlobal + '\n' + parametri + '\n' + 'metodo : \n' + this.metodoAvviabile; ////console.log(tmp); return tmp; } ConfiguraRotteSwitch(app: any, percorsoTmp: string, middlew: any[]) { let corsOptions = {}; const apiRateLimiter = this.metodoLimitazioni.rate_limit ? rateLimit(this.metodoLimitazioni.rate_limit) : undefined; const apiSpeedLimiter = this.metodoLimitazioni.slow_down ? slowDown(this.metodoLimitazioni.slow_down) : undefined; if (this.metodoSpawProcess.isSpawTrigger && MainExpress.isSottoProcesso == true) { // (<IReturn>this.metodoAvviabile).body; corsOptions = { methods: 'GET', } if (this.metodoLimitazioni.cors == undefined) { this.metodoLimitazioni.cors = cors(this.metodoLimitazioni.corsOption ?? corsOptions); } if (this.metodoLimitazioni.helmet == undefined) { this.metodoLimitazioni.helmet = undefined;//helmet(); } app.get(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.cacheOptionRedis ?? <OptionsCache>{ expire: 1 , client: redisClient }), apiRateLimiter, apiSpeedLimiter, /*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("GET"); res.statusCode = 999; res.send({ dalleFondamentaConFurore: 'Hei? sei molto in basso ma non puoi scavare piu di cosi! Sei sicuro di stare ad andare nella direzione giusta?' }); }); } else { // //const csrfProtection = csrf({ cookie: true }) switch (this.metodoParametri.tipo) { case 'get': (<IReturn>this.metodoAvviabile).body; corsOptions = { methods: 'GET', } this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.get(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.metodoLimitazioni.cacheOptionRedis ?? <OptionsCache>{ expire: 1 , client: redisClient }), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("GET"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'post': corsOptions = { methods: 'POST' } this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.post(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.metodoLimitazioni.cacheOptionRedis ?? <OptionsCache>{ expire: 1 /* secondi */, client: redisClient }), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("POST"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'delete': corsOptions = { methods: "DELETE" } this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.delete(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.metodoLimitazioni.cacheOptionRedis ?? <OptionsCache>{ expire: 1 /* secondi */, client: redisClient }), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("DELETE"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'patch': corsOptions = { methods: "PATCH" }; this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.patch(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.metodoLimitazioni.cacheOptionRedis ?? <OptionsCache>{ expire: 1 /* secondi */, client: redisClient }), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("PATCH"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'purge': corsOptions = { methods: "PURGE" }; this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.purge(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.metodoLimitazioni.cacheOptionRedis ?? <OptionsCache>{ expire: 1 /* secondi */, client: redisClient }), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("PURGE"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'put': corsOptions = { methods: "PUT" }; this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.put(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.cacheOptionRedis ?? {}), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("PUT"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id); }); break; case 'file': corsOptions = { methods: "GET" }; this.CostruisciCors_e_Helmet(this.metodoLimitazioni.corsOption ?? corsOptions); app.get(percorsoTmp, this.metodoLimitazioni.cors, this.metodoLimitazioni.helmet, middlew, //cacheMiddleware.route(this.cacheOptionRedis ?? {}), apiRateLimiter, apiSpeedLimiter,/*csrfProtection,*/ async (req: Request, res: Response) => { //console.log("PUT"); const id: ITracciamentoQualita = { id: GenerateID(), inizio: new Date().getTime(), differenza: undefined, fine: undefined, req: undefined, res: undefined }; await this.ChiamataGenerica(req, res, id, this.metodoParametri.isFile); }); break; } } } async ChiamataGenerica(req: Request, res: Response, id: ITracciamentoQualita, isFile?: IFile) { let passato = false; let logIn: any; let logOut: any; let tmp: IReturn | undefined; if (id && 'req' in id && req) { id.req = req } const key = this.metodoLimitazioni.cacheOptionMemory != undefined ? CalcolaChiaveMemoryCache(req) : undefined; const durationSecondi = this.metodoLimitazioni.cacheOptionMemory != undefined ? this.metodoLimitazioni.cacheOptionMemory.durationSecondi : undefined; try { //console.log('Inizio Chiamata generica per : ' + this.percorsi.pathGlobal); logIn = InizializzaLogbaseIn(req, this.nomeOriginale.toString()); if (this.metodoEventi.onPrimaDiEseguire) req = await this.metodoEventi.onPrimaDiEseguire(req); const cachedBody = key == undefined ? undefined : MainExpress.cache.get<ICache>(key); if (cachedBody == undefined || cachedBody == null) { tmp = await this.Esegui(req); if (tmp != undefined) { if (this.metodoEventi.onRispostaControllatePradefinita && this.metodoVettori.VerificaPresenzaRispostaControllata(tmp) == false) { const rispostaPilotata = await this.metodoEventi.onRispostaControllatePradefinita(tmp) /* if (this.isSpawTrigger && this.VerificaPresenzaSpawnTrigger(this.isSpawTrigger, rispostaPilotata)) { console.log('è un evento scatenante dovrei avviare un nuovo processo.'); } */ Rispondi(res, rispostaPilotata, id, isFile, key, durationSecondi); //throw new Error("Attenzione, cosa stai facendo?"); } else { try { if (!this.metodoVettori.VerificaTrigger(req)) { if (this.metodoVettori.VerificaPresenzaRispostaControllata(tmp)) { tmp = await this.metodoVettori.EseguiRispostaControllata(tmp); } try { if (this.metodoSpawProcess.isSpawTrigger && this.metodoSpawProcess.VerificaPresenzaSpawnTrigger(tmp) /* && (tmp instanceof IReturn) */) { if (tmp.body instanceof Object) { const tt = (<any>tmp.body)[this.metodoSpawProcess.isSpawTrigger]; let t1 = false; for (let index = 0; index < MainExpress.vettoreProcessi.length && t1 == false; index++) { const x = MainExpress.vettoreProcessi[index]; if (String(x.nomeVariabile) == String(this.metodoSpawProcess.isSpawTrigger) && String(x.valoreValiabile) == String(tt)) { t1 = true; } } if (tt != undefined && tt != '' && t1 == false) { let porta = this.metodoParametri.percorsi.porta + 2; this.EseguiProcessoParallelo(this.metodoSpawProcess,tt,porta); } } } } catch (error) { console.log(error); } Rispondi(res, tmp ?? ConstruisciErrore('Attenzione! Rimpiazzato.'), id, isFile, key, durationSecondi); } else { const risposta = this.metodoVettori.CercaRispostaConTrigger(req); if (risposta) { let source = ""; if (risposta.stato >= 1 && risposta.stato < 600) { if (risposta.htmlPath != undefined) source = fs.readFileSync(risposta.htmlPath).toString(); else if (risposta.html != undefined) source = risposta.html; else throw new Error("Errorissimo"); Rispondi(res, { stato: risposta.stato, body: source }, id, isFile, key, durationSecondi); passato = true; } else { Rispondi(res, tmp, id, isFile, key, durationSecondi); passato = true; } } else { throw new Error("Errore nel trigger"); } } } catch (errore: any) { const err = ConstruisciErrore(errore); err.stato = 598; Rispondi(res, err, id, isFile, key, durationSecondi); } } //if (this.onPrimaDiTerminareLaChiamata) tmp = this.onPrimaDiTerminareLaChiamata(tmp); } else { throw new Error("Attenzione qualcosa è andato storto nell'Esegui(req), guarda @mpMet"); } } else { const parametri = (<ListaExpressParametro>this.listaParametri).EstraiParametriDaRequest(req); let valido: IRitornoValidatore | undefined | void = undefined; res.setHeader("specchio", "riflesso"); if (this.metodoEventi.Validatore) { valido = this.metodoEventi.Validatore(parametri, this.listaParametri) ?? undefined; if (valido && valido?.approvato == true && this.metodoEventi.Istanziatore) { await this.metodoEventi.Istanziatore(parametri, this.listaParametri); res.setHeader('Content-Type', 'application/json'); res.status(cachedBody.stato).send(cachedBody.body) } else { res.status(555).send({ errore: 'Errore cache.' }); } } else if (parametri.errori.length > 0) { valido = { approvato: false, stato: 400, messaggio: 'Parametri in errore.'/* parametri.errori.toString() */ }; res.status(555).send({ errore: 'Errore cache.' }); } else { valido = { approvato: true, stato: 200, messaggio: '' }; res.setHeader('Content-Type', 'application/json'); res.status(cachedBody.stato).send(cachedBody.body) } } logOut = InizializzaLogbaseOut(res, this.nomeOriginale.toString()); if (this.metodoEventi.onChiamataCompletata) { this.metodoEventi.onChiamataCompletata(logIn, tmp, logOut, undefined); } if (this.metodoEventi.onLog) { this.metodoEventi.onLog(logIn, tmp, logOut, undefined); } } catch (error) { if (this.metodoEventi.onChiamataInErrore) { tmp = await this.metodoEventi.onChiamataInErrore(logIn, tmp, logOut, error); /* let num = 0; num = tmp.stato; res.statusCode = Number.parseInt('' + num); res.send(tmp.body); */ Rispondi(res, tmp, id, isFile, key, durationSecondi); } else if (passato == false) { if (error instanceof ErroreMio) { //console.log("ciao"); /* return <IReturn>{ stato: (<ErroreMio>error).codiceErrore, body: { errore: (<ErroreMio>error).message } }; */ Rispondi(res, { stato: (<ErroreMio>error).codiceErrore, body: { errore: (<ErroreMio>error).message } }, id, isFile, key, durationSecondi); } else { Rispondi(res, { stato: 500, body: { error: error, passato: passato, info: '' } }, id, isFile, key, durationSecondi); } } else { Rispondi(res, { stato: 500, body: { error: error, passato: passato, info: '' } }, id, isFile, key, durationSecondi); } if (this.metodoEventi.onLog) { this.metodoEventi.onLog(logIn, tmp, logOut, error); } } } EseguiProcessoParallelo(metodoSpawProcess: MetodoSpawProcess, valoreValiabile: string, porta: number) { MainExpress.AggiungiProcessoParallelo(metodoSpawProcess, valoreValiabile, porta); /* try { if (MainExpress.vettoreProcessi.length > 0) { if ('porta' in MainExpress.vettoreProcessi[MainExpress.vettoreProcessi.length - 1]) porta = MainExpress.vettoreProcessi[MainExpress.vettoreProcessi.length - 1].porta + 1; } if (MainExpress.vettoreProcessi.length == 0) { porta = porta + (Math.random() * 100 + 30) + ( (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) + (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) - (Math.random() * 10 * Math.random() * 20 * Math.random() * 10) + (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) - (Math.random() * 10 * Math.random() * 20 * Math.random() * 5) ); } } catch (error) { porta = porta + (Math.random() * 100 + 30) + ( (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) + (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) - (Math.random() * 10 * Math.random() * 20 * Math.random() * 10) + (Math.random() * 10 * Math.random() * 20 * Math.random() * 30) - (Math.random() * 10 * Math.random() * 20 * Math.random() * 5) ); } try { porta = Number(porta.toFixed(0)); const temporaneamente = `node ./${MainExpress.pathExe}`; console.log(temporaneamente); const proc = exec(`node ./${MainExpress.pathExe}${MainExpress.pathExeIIparte}${porta}`); //exec(`npm run start-esempio`); MainExpress.vettoreProcessi.push({ porta: porta, nomeVariabile: metodoSpawProcess.isSpawTrigger ?? String(randomUUID()), valoreValiabile: valoreValiabile, vettorePossibiliPosizioni: metodoSpawProcess.checkSpawTrigger ?? [], processo: proc }); } catch (error) { console.log(error); } */ } async Esegui(req: Request): Promise<IReturn | undefined> { try { const parametri = (<ListaExpressParametro>this.listaParametri).EstraiParametriDaRequest(req); /*!!! Qui bisogna che ci metto qualcosa per convertire i parametri in una chimata, quindi connettermi al db ed estrarli con una query. i parametri devono essere segnalati come tali. come fare a gestire il ritorno, perche io cosi facendo sto eseguendo una select come eseguire una delete o una set? */ let valido: IRitornoValidatore | undefined | void = undefined; if (this.metodoEventi.Validatore) { valido = this.metodoEventi.Validatore(parametri, this.listaParametri) ?? undefined; } else if (parametri.errori.length > 0) { valido = { approvato: false, stato: 400, messaggio: 'Parametri in errore.'/* parametri.errori.toString() */ }; } else { valido = { approvato: true, stato: 200, messaggio: '' }; } /* verifico che il metodo possa essere eseguito come volevasi ovvero approvato = true o undefiend */ if ((valido && (valido.approvato == undefined || valido.approvato == true)) || (!valido && parametri.errori.length == 0)) { let tmp: IReturn = { body: {}, nonTrovati: parametri.nontrovato, inErrore: parametri.errori, stato: 200 }; try { const tmpRitorno = await this.EseguiMetodo(parametri); const tmpReturn: any = tmpRitorno.result; if (IsJsonString(tmpReturn)) { if (tmpReturn.name === "ErroreMio" || tmpReturn.name === "ErroreGenerico") { //console.log("ciao"); } if ('body' in tmpReturn) { tmp.body = tmpReturn.body; } else { if (typeof tmpReturn === 'object' && tmpReturn !== null) tmp.body = tmpReturn; else { tmp.body = { tmpReturn }; } } if ('stato' in tmpReturn) { tmp.stato = tmpReturn.stato; } else { tmp.stato = 298; } } else { /* if ('body' in tmpReturn && 'stato' in tmpReturn && typeof tmpReturn.body === 'string') { tmp.stato = tmpReturn.stato; tmp.body = tmpReturn.body; } else */if (typeof tmpReturn === 'object' && tmpReturn !== null && 'stato' in tmpReturn && 'body' in tmpReturn) { // eslint-disable-next-line prefer-const for (let attribut in tmpReturn.body) { (<any>tmp.body)[attribut] = tmpReturn.body[attribut]; } tmp.body = Object.assign({}, tmpReturn.body); tmp.stato = tmpReturn.stato; } else if (typeof tmpReturn === 'object') { tmp.body = tmpReturn; tmp.stato = 200//299; } else if (tmpReturn) { tmp.body = tmpReturn;//{ 'messaggio': tmpReturn }; tmp.stato = 200//299; } else { tmp = { body: { "Errore Interno filtrato ": 'internal error!!!!' }, stato: 599, nonTrovati: parametri.nontrovato }; } } tmp.attore = tmpRitorno.attore; return tmp; } catch (error) { if (error instanceof ErroreMio) { throw error; } else { throw new ErroreMio({ codiceErrore: 598, messaggio: (<Error>error).message, percorsoErrore: (<Error>error).stack, }); } return tmp; } }/* altrimenti lo vado a costruire */ else { let tmp: IReturn = { body: parametri.errori, nonTrovati: parametri.nontrovato, inErrore: parametri.errori, stato: 597 }; if (valido) { if (valido.body != undefined) { tmp = { body: valido.body, stato: valido.stato ?? 596, } } else { tmp = { body: tmp.body, stato: valido.stato ?? 595, } } } return tmp; } throw new Error("Attenzione qualcosa è andato storto."); } catch (error: any) { console.log(''); throw error; } } async EseguiMetodo(parametri: IParametriEstratti) { let tmpReturn: any = ''; let attore = undefined; if (this.metodoEventi.onPrimaDiEseguireMetodo) parametri = await this.metodoEventi.onPrimaDiEseguireMetodo(parametri); /* let count = 0; */ if (this.metodoEventi.Istanziatore) { const classeInstanziata = await this.metodoEventi.Istanziatore(parametri, this.listaParametri); attore = classeInstanziata; // eslint-disable-next-line prefer-spread tmpReturn = await classeInstanziata[this.nomeOriginale.toString()].apply(classeInstanziata, parametri.valoriParametri); } else { tmpReturn = await this.metodoAvviabile/* .value */.apply(this.metodoAvviabile/* .value */, parametri.valoriParametri); } if (this.metodoVettori.ListaSanificatori && 'length' in this.metodoVettori.ListaSanificatori && this.metodoVettori.ListaSanificatori.length > 0) tmpReturn = SostituisciRicorsivo(this.metodoVettori.ListaSanificatori, tmpReturn); if (this.metodoEventi.onDopoAverTerminatoLaFunzione) tmpReturn = this.metodoEventi.onDopoAverTerminatoLaFunzione(tmpReturn); return { attore: attore, result: tmpReturn }; } CostruisciCors_e_Helmet(corsOptions: any) { if (this.metodoLimitazioni.cors == undefined && this.metodoLimitazioni.cors != false) { this.metodoLimitazioni.cors = cors(corsOptions); } else if (this.metodoLimitazioni.cors == false) { this.metodoLimitazioni.cors = []; } if (this.metodoLimitazioni.helmet == undefined && this.metodoLimitazioni.helmet != false) { this.metodoLimitazioni.helmet = helmet(); } else if (this.metodoLimitazioni.helmet == false) { this.metodoLimitazioni.helmet = []; } } } export class ListaExpressMetodo extends ListaMetadataMetodo { constructor(item?: ListaMetadataMetodo) { super(); if (item) for (let index = 0; index < item.length; index++) { const element = new ExpressMetodo(item[index]); const tmp = this.Cerca(element); if (tmp) tmp.Mergia(element); } } Mergia(item: ListaExpressMetodo) { const t = super.Mergia(item); return t; /* for (let index = 0; index < item.length; index++) { const element = item[index]; const elementoCercato = this.Cerca(element); if (elementoCercato == undefined) { const tmp = element; this.push(tmp); } else { elementoCercato.Mergia(elementoCercato); } } */ } /* Init(item: IListaMetadataMetodo) { for (let index = 0; index < item.length; index++) { const element = item[index]; const tmp = new MetadataMetodo(element); this.push(tmp); } } */ CercaSeNoAggiungi(item: ExpressMetodo) { const t = super.CercaSeNoAggiungi(item); return <ExpressMetodo>t; /* let metodo = undefined; for (let index = 0; index < this.length && metodo == undefined; index++) { const element = this[index]; if (Meta.Compara(element, item) == 0) metodo = element.GetThis(); } if (metodo == undefined) { if (item.GetThis) { metodo = <ExpressMetodo>item.GetThis(item); } else { metodo = new MetadataMetodo(item); } this.AggiungiElemento(metodo); } return metodo; */ } Cerca(item: ExpressMetodo): ExpressMetodo | undefined { const t = super.Cerca(item); return <ExpressMetodo>t; /* for (let index = 0; index < this.length; index++) { const element = this[index]; if (Meta.Compara(element, item) == 0) return element; } return undefined; */ } AggiungiElemento(item: ExpressMetodo) { const t = super.AggiungiElemento(item); return <ExpressMetodo>t; /* for (let index = 0; index < this.length; index++) { const element = this[index]; if (Meta.Compara(element, item) == 0) { this[index].Mergia(item); return this[index]; } } this.push(item); return item; */ } ConfiguraListaRotteApplicazione(app: any, percorsi: IRaccoltaPercorsi) { for (let index = 0; index < this.length; index++) { const element = <ExpressMetodo>this[index]; if (element.metodoParametri.interazione == 'rotta' || element.metodoParametri.interazione == 'ambo') { //element.ConfiguraRotta(this.rotte, this.percorsi); element.ConfiguraRottaApplicazione(app, percorsi); } //element.listaRotteGeneraChiavi=this.listaMetodiGeneraKey; } } }