58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import { dataSource } from "../data-source";
|
|
import { DynamicQueryStructure } from "../type/dynamicQueries";
|
|
import { TableMeta } from "../type/tableMeta";
|
|
|
|
export default abstract class DynamicQueryBuilder {
|
|
public static allowedTables: Array<string> = [
|
|
"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<TableMeta> {
|
|
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
|
|
}
|