import { SnowflakeJSPrimitive } from '../snowflake-core'; import { SchemaStore } from './attributes'; import { plainToClass } from 'class-transformer' import "reflect-metadata"; export type Constructor = new (...args: any[]) => T export type SnowflakeObject = { [P in keyof T]: SnowflakeJSPrimitive } export interface TableDefinition { name: string columnNames: Array, propertyToColumnMappings: { [key: string]: string } } export const Mapper = { getSchema(ctr: Constructor): TableDefinition { const schema = SchemaStore.getSchema(ctr) return { name: schema.table, columnNames: Object.values(schema.mappings), propertyToColumnMappings: schema.mappings } }, fromRow(ctr: Constructor, row: Record): T { const schema = SchemaStore.getSchema(ctr) const switchMap: Record = Object.keys(schema.mappings) .reduce((p, n) => Object.assign({}, p, { [schema.mappings[n]]: n }), {}) const mapped = Object.keys(switchMap).reduce((p, n) => Object.assign({}, p, { [switchMap[n]]: row[n] }), {}) return plainToClass(ctr, mapped) }, toRow(ctr: Constructor, object: SnowflakeObject): SnowflakeObject { const schema = SchemaStore.getSchema(ctr) const keys= <(keyof T)[]>Object.keys(schema.mappings) return keys.reduce((p,k) => Object.assign({}, p, {[schema.mappings[k.toString()]]: object[k]} ), {} as SnowflakeObject) } }