import { BadRequestException, Injectable } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { DataSource, Repository } from 'typeorm'; import { getRepositoryToken } from '@nestjs/typeorm'; import { ConfigService } from '@nestjs/config'; @Injectable() export class ReflectionHelper { schema: string; constructor( private moduleRef: ModuleRef, private dataSource: DataSource, private readonly configService: ConfigService ) { this.schema = this.configService.get('DB_SCHEMA') || 'default'; } getRepoService(entityName: string): Repository { const entityMetadata: any = this.dataSource.entityMetadatas.find( (meta) => meta.name === entityName || (meta.target && (meta.target as any).name === entityName), ); if (!entityMetadata) { console.error(`Entity "${entityName}" not found in TypeORM metadata`); throw new BadRequestException(); } try { return this.moduleRef.get>( getRepositoryToken(entityMetadata.target), { strict: false }, ); } catch (error) { console.error(`Repository for "${entityName}" not found:`, error.message); throw new BadRequestException(); } } async getBean(beanName: string): Promise { try { const provider = this.moduleRef.get(beanName as any, { strict: false, }); if (!provider) { console.error(`Bean "${beanName}" not found in moduleRef.`); return null; } return provider; } catch (error) { console.error(`Bean "${beanName}" not found:`, error.message); return null; } } async getEntityData(id: number, tableName: string) { const entityList = await this.dataSource.query(`SELECT * FROM ${this.schema}.${tableName} WHERE id = $1`, [id]); return entityList.length > 0 ? entityList[0] : null; } }