From afeed29f59209e55809ecdeb2f9a99a89a01d7ba Mon Sep 17 00:00:00 2001 From: Zak Henry Date: Thu, 30 Jun 2016 15:13:04 +0100 Subject: [PATCH] feat(models): Implement model timestamps --- src/common/metadata/metadata.ts | 4 ++ src/common/models/model.ts | 4 -- src/common/models/types/index.ts | 1 + .../models/types/timestamp.decorator.ts | 31 ++++++++++++++++ src/server/bootstrap/models.bootstrapper.ts | 37 +++++++++++++------ 5 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 src/common/models/types/timestamp.decorator.ts diff --git a/src/common/metadata/metadata.ts b/src/common/metadata/metadata.ts index 2f2c8a3..484505b 100644 --- a/src/common/metadata/metadata.ts +++ b/src/common/metadata/metadata.ts @@ -9,6 +9,10 @@ export interface ModelMetadata { relations?: Map>; storedProperties?: Map identifierKey?:string; + timestamps?: { + created?:string + updated?:string + } } export function initializeMetadata(target: RegistryEntityConstructor) { diff --git a/src/common/models/model.ts b/src/common/models/model.ts index e13cd08..2e8891c 100644 --- a/src/common/models/model.ts +++ b/src/common/models/model.ts @@ -4,10 +4,6 @@ import { RegistryEntityConstructor } from '../registry/entityRegistry'; import { RelationType, Relation } from './relations/index'; import { ModelMetadata } from '../metadata/metadata'; -export interface EntityNest extends Map> { - -} - export type identifier = string | number | symbol; /** diff --git a/src/common/models/types/index.ts b/src/common/models/types/index.ts index 9cb7cce..dab42c0 100644 --- a/src/common/models/types/index.ts +++ b/src/common/models/types/index.ts @@ -1,2 +1,3 @@ export * from './primary.decorator'; export * from './storedProperty.decorator'; +export * from './timestamp.decorator'; diff --git a/src/common/models/types/timestamp.decorator.ts b/src/common/models/types/timestamp.decorator.ts new file mode 100644 index 0000000..d5265d3 --- /dev/null +++ b/src/common/models/types/timestamp.decorator.ts @@ -0,0 +1,31 @@ +import { ModelConstructor } from '../model'; +import { initializeMetadata } from '../../metadata/metadata'; + +function initTimestamps(target: ModelConstructor) { + initializeMetadata(target); + + if (!target.constructor.__metadata.timestamps) { + target.constructor.__metadata.timestamps = {}; + } +} + +export function CreatedDate(): PropertyDecorator { + + return function createdDate(target: ModelConstructor, propertyKey: string): void { + initTimestamps(target); + + target.constructor.__metadata.timestamps.created = propertyKey; + }; + +} + +export function UpdatedDate(): PropertyDecorator { + + return function updatedDate(target: ModelConstructor, propertyKey: string): void { + + initTimestamps(target); + + target.constructor.__metadata.timestamps.updated = propertyKey; + }; + +} diff --git a/src/server/bootstrap/models.bootstrapper.ts b/src/server/bootstrap/models.bootstrapper.ts index 7ea9ec0..3f802a8 100644 --- a/src/server/bootstrap/models.bootstrapper.ts +++ b/src/server/bootstrap/models.bootstrapper.ts @@ -1,8 +1,8 @@ import { ResolvedReflectiveProvider } from '@angular/core'; import { EntityBootstrapper } from './entity.bootstrapper'; import { ModelStatic } from '../../common/models/model'; -import {Table} from 'typeorm/tables'; -import { PrimaryColumn, Column } from 'typeorm/columns'; +import { Table } from 'typeorm/tables'; +import { PrimaryColumn, Column, UpdateDateColumn, CreateDateColumn } from 'typeorm/columns'; import { ModelMetadata } from '../../common/metadata/metadata'; export class ModelBootstrapper extends EntityBootstrapper { @@ -12,21 +12,34 @@ export class ModelBootstrapper extends EntityBootstrapper { } public bootstrap(): void { - this.getFromRegistry('model').forEach((model: ModelStatic) => { - const meta:ModelMetadata = model.getMetadata(); + this.getFromRegistry('model') + .forEach((model: ModelStatic) => { + const meta: ModelMetadata = model.getMetadata(); - this.logger.info(`initializing ${model.name}`, meta); + this.logger.info(`initializing ${model.name}`, meta); - Table(meta.storageKey, meta.tableOptions)(model); - PrimaryColumn()(model.prototype, meta.identifierKey); + Table(meta.storageKey, meta.tableOptions)(model); + PrimaryColumn()(model.prototype, meta.identifierKey); - for(const [property, type] of meta.storedProperties){ - Column()(model.prototype, property) - } + for (const [property, type] of meta.storedProperties) { + Column()(model.prototype, property) + } - //@todo assign table/columns etc + if (meta.timestamps) { - }); + if (meta.timestamps.updated) { + UpdateDateColumn()(model.prototype, meta.timestamps.updated); + } + + if (meta.timestamps.created) { + CreateDateColumn()(model.prototype, meta.timestamps.created); + } + + } + + //@todo assign table/columns etc + + }); } }