import { Injectable, NotFoundException } from '@nestjs/common'; import { getFunctionsOfInstance } from './common/getFunctionsOfInstance'; import { OEMC_METHOD } from './nestjs-oemc.constants'; export interface OemcController { controllerAlias: string; oemcController: any; } export interface OemcMethod { methodAlias: string; methodName: string; } @Injectable() export class NestjsOemcService { private readonly oemcControllers: OemcController[] = []; registerOemcController(oemcController: OemcController): void { this.oemcControllers.push(oemcController); } getOemcMethods(controllerAlias: string): OemcMethod[] { const oemcController = this.getOemcController(controllerAlias); const oemcControllerMethodNames = getFunctionsOfInstance(oemcController.oemcController).filter( (oemcFunctionName) => { return Reflect.getMetadata(OEMC_METHOD, oemcController.oemcController[oemcFunctionName]) ? oemcFunctionName : null; }, ); return oemcControllerMethodNames.map((oemcControllerMethodName) => ({ methodAlias: Reflect.getMetadata(OEMC_METHOD, oemcController.oemcController[oemcControllerMethodName]), methodName: oemcControllerMethodName, })); } getOemcControllerNames(): object[] { return this.oemcControllers.map((oemcController) => { return { controllerAlias: oemcController.controllerAlias, methods: this.getOemcMethods(oemcController.controllerAlias), }; }); } getOemcController(controllerAlias: string): OemcController { const oemcControllers = this.oemcControllers.filter( (oemcController) => oemcController.controllerAlias === controllerAlias, ); if (oemcControllers.length > 0) { return oemcControllers[0]; } else { throw new NotFoundException( `OemcController ${controllerAlias} is Not Found or Not Registered to NestjsOemcService`, ); } } async executeOemcFunction(controllerAlias: string, methodAlias: string, body: object): Promise { const oemcController = this.getOemcController(controllerAlias); const oemcMethod = this.getOemcMethods(controllerAlias).find( (findingOemcMethod: OemcMethod) => findingOemcMethod.methodAlias === methodAlias, ); if (oemcMethod) { return await oemcController.oemcController[oemcMethod.methodName](body); } else { throw new NotFoundException( `OemcMethod ${controllerAlias}.${methodAlias} is Not Found or Not Registed as OemcMethod`, ); } } }