import _ = require('underscore'); import IEntityStatic = require('./IEntityStatic'); import IEntityListStatic = require('./IEntityListStatic'); import EntityMapper = require('../Mapping/EntityMapper'); import EntityUpdater = require('./Updater'); import List = require('./List'); export = Converter; class Converter { private entityMapper: EntityMapper; private entityUpdater: EntityUpdater; constructor( private EntityStatic: IEntityStatic ) { this.entityMapper = new EntityMapper(EntityStatic); this.entityUpdater = new EntityUpdater(this.entityMapper); } getList, Entity>( EntityListStatic: IEntityListStatic, EntityStatic: IEntityStatic, objects: any[] ) { return objects ? new EntityListStatic(_.map(objects, (object: any) => this.createEntity(EntityStatic, object))) : null; } toArray(list: List): EntityObject[] { return list.toArray((entity: Entity) => this.toObject(entity)); } fromObject(object: EntityObject): Entity { var convertedObject = this.convertObject(object, []); return this.createEntity(this.EntityStatic, convertedObject); } toObject(entity: Entity): EntityObject { var objectPropertyName = this.entityMapper.getObjectPropertyName(); var object = entity[objectPropertyName]; return this.convertObject(object, []); } private createEntity(EntityStatic: IEntityStatic, object: any) { var entityMapper = new EntityMapper(EntityStatic); var objectPropertyName = entityMapper.getObjectPropertyName(); var entity = new EntityStatic(); entity[objectPropertyName] = object; return entity; } private convertObject(object: EntityObject, keyPath: string[]): EntityObject { var convertedObject = this.entityUpdater.updateObject(object, {}, keyPath); return convertedObject; } fromRow(row: any): Entity { var object = this.convertRowToObject(row, []); return this.fromObject(object); } private convertRowToObject(row: any, keyPath: string[]): any { var keys = this.entityMapper.getEmbeddedKeys.apply(this.entityMapper, keyPath); var object: any = {}; keys.forEach((key: string) => { var embeddedKeyPath = [].concat(keyPath, [key]); var name = this.entityMapper.getPropertyNameByKey.apply( this.entityMapper, embeddedKeyPath ); if (this.entityMapper.isEmbeddedByKey.apply(this.entityMapper, embeddedKeyPath)) { object[key] = row[name] ? this.convertRowToObject(row[name], embeddedKeyPath) : null; } else { object[key] = row[name]; } }); return object; } toRow(entity: Entity): any { var converterObject = this.toObject(entity); var convertedRow = this.convertObjectToRow(converterObject, []); return convertedRow; } private convertObjectToRow(object: any, keyPath: string[]): any { var keys = this.entityMapper.getEmbeddedKeys.apply(this.entityMapper, keyPath); var row: any = {}; keys.forEach((key: string) => { var embeddedKeyPath = [].concat(keyPath, [key]); var name = this.entityMapper.getPropertyNameByKey.apply( this.entityMapper, embeddedKeyPath ); if (this.entityMapper.isEmbeddedByKey.apply(this.entityMapper, embeddedKeyPath)) { row[name] = object[key] ? this.convertObjectToRow(object[key], embeddedKeyPath) : null; } else { row[name] = object[key]; } }); return row; } }