diff --git a/src/auth/models/UserEmail.ts b/src/auth/models/UserEmail.ts index 9af530c..3da41e3 100644 --- a/src/auth/models/UserEmail.ts +++ b/src/auth/models/UserEmail.ts @@ -1,4 +1,5 @@ import User from "./User"; +import Model from "../../db/Model"; import {OneModelRelation} from "../../db/ModelRelation"; import ModelFactory from "../../db/ModelFactory"; import {EMAIL_REGEX} from "../../db/Validator"; diff --git a/src/db/Model.ts b/src/db/Model.ts index 3bec1a7..4ed6648 100644 --- a/src/db/Model.ts +++ b/src/db/Model.ts @@ -5,7 +5,7 @@ import ModelComponent from "./ModelComponent"; import {Type} from "../Utils"; import ModelFactory from "./ModelFactory"; import ModelRelation from "./ModelRelation"; -import ModelQuery, {ModelQueryResult, SelectFields, SelectFieldValue} from "./ModelQuery"; +import ModelQuery, {ModelQueryResult} from "./ModelQuery"; import {Request} from "express"; export default abstract class Model { @@ -16,27 +16,31 @@ export default abstract class Model { + 's'; } - public static create(this: Type, data: any): T { + public static getPrimaryKeyFields(): string[] { + return ['id']; + } + + public static create(this: ModelType, data: any): T { return ModelFactory.get(this).create(data); } - public static select(this: Type, ...fields: string[]): ModelQuery { + public static select(this: ModelType, ...fields: string[]): ModelQuery { return ModelFactory.get(this).select(...fields); } - public static update(this: Type, data: { [key: string]: any }): ModelQuery { + public static update(this: ModelType, data: { [key: string]: any }): ModelQuery { return ModelFactory.get(this).update(data); } - public static delete(this: Type): ModelQuery { + public static delete(this: ModelType): ModelQuery { return ModelFactory.get(this).delete(); } - public static async getById(this: Type, ...id: any): Promise { + public static async getById(this: ModelType, ...id: any): Promise { return ModelFactory.get(this).getById(...id); } - public static async paginate(this: Type, request: Request, perPage: number = 20, query?: ModelQuery): Promise> { + public static async paginate(this: ModelType, request: Request, perPage: number = 20, query?: ModelQuery): Promise> { return ModelFactory.get(this).paginate(request, perPage, query); } @@ -222,3 +226,9 @@ export default abstract class Model { }); } } + +export interface ModelType extends Type { + table: string; + + getPrimaryKeyFields(): string[]; +} diff --git a/src/db/ModelFactory.ts b/src/db/ModelFactory.ts index d54d794..f27d1b6 100644 --- a/src/db/ModelFactory.ts +++ b/src/db/ModelFactory.ts @@ -1,27 +1,26 @@ import ModelComponent from "./ModelComponent"; -import Model from "./Model"; +import Model, {ModelType} from "./Model"; import ModelQuery, {ModelQueryResult, SelectFields} from "./ModelQuery"; import {Request} from "express"; -import {Type} from "../Utils"; export default class ModelFactory { private static readonly factories: { [modelType: string]: ModelFactory } = {}; - public static register(modelType: Type) { + public static register(modelType: ModelType) { if (this.factories[modelType.name]) throw new Error(`Factory for type ${modelType.name} already defined.`); this.factories[modelType.name] = new ModelFactory(modelType); } - public static get(modelType: Type): ModelFactory { + public static get(modelType: ModelType): ModelFactory { const factory = this.factories[modelType.name]; if (!factory) throw new Error(`No factory registered for ${modelType.name}.`); return factory; } - private readonly modelType: Type; + private readonly modelType: ModelType; private readonly components: ModelComponentFactory[] = []; - protected constructor(modelType: Type) { + protected constructor(modelType: ModelType) { this.modelType = modelType; } @@ -39,7 +38,6 @@ export default class ModelFactory { } public get table(): string { - // @ts-ignore return this.modelType.table; } @@ -56,7 +54,7 @@ export default class ModelFactory { } public getPrimaryKeyFields(): string[] { - return ['id']; + return this.modelType.getPrimaryKeyFields(); } public getPrimaryKey(modelData: any): any[] {