import { dataSource } from "../data-source"; import { DynamicQueryStructure } from "../type/dynamicQueries"; import { TableMeta } from "../type/tableMeta"; export default abstract class DynamicQueryBuilder { public static allowedTables: Array = [ "award", "communication", "communicationType", "executivePosition", "membershipStatus", "qualification", "member", "memberAwards", "memberExecutivePositions", "memberQualifications", "membership", ]; public static getTableMeta(tableName: string): TableMeta { let { name, columns, relations } = dataSource.getMetadata(tableName); const uniqueColumns = columns.map((c) => ({ column: c.propertyName, type: c.type })); return { tableName: name, columns: [ ...uniqueColumns, ...relations .filter((r) => !uniqueColumns.some((c) => r.propertyName == c.column)) .map((r) => ({ column: r.propertyName, type: r.inverseEntityMetadata?.columns.find((col) => col.propertyName === r.inverseSidePropertyPath)?.type, })), ], relations: relations.map((r) => ({ column: r.propertyName, relationType: r.relationType, referencedTableName: r.inverseEntityMetadata?.tableName, })), }; } public static getAllTableMeta(): Array { return this.allowedTables.map((table) => this.getTableMeta(table)); } public static buildQuery(query: DynamicQueryStructure, offset: number = 0, count: number = 25) { // execute: // .offset(offset) // .limit(count) // .getManyAndCount() } // use switch... for compare functions // use NotBrackets/Brackets for nested conditions // use joins by requesting table schema and setting correct column }