diff --git a/src/repository/EntityModel.ts b/src/repository/EntityModel.ts index 705066df2..c906e8259 100644 --- a/src/repository/EntityModel.ts +++ b/src/repository/EntityModel.ts @@ -7,6 +7,7 @@ import {FindOneOptions} from "../find-options/FindOneOptions"; import {RemoveOptions} from "./RemoveOptions"; import {FindManyOptions} from "../find-options/FindManyOptions"; import {Connection} from "../connection/Connection"; +import {ObjectType} from "../common/ObjectType"; /** * Base abstract entity for all entities, used in ActiveRecord patterns. @@ -63,8 +64,8 @@ export class EntityModel { /** * Gets current entity's Repository. */ - static getRepository(): Repository { - const connection = this.usedConnection || getConnection(); + static getRepository(this: ObjectType, ): Repository { + const connection: Connection = (this as any).usedConnection || getConnection(); return connection.getRepository(this); } @@ -88,29 +89,29 @@ export class EntityModel { /** * Gets entity mixed id. */ - static getId(entity: T): any { - return this.getRepository().getId(entity); + static getId(this: ObjectType, entity: T): any { + return (this as any).getRepository().getId(entity); } /** * Creates a new query builder that can be used to build a sql query. */ - static createQueryBuilder(alias: string): QueryBuilder { - return this.getRepository().createQueryBuilder(alias); + static createQueryBuilder(this: ObjectType, alias: string): QueryBuilder { + return (this as any).getRepository().createQueryBuilder(alias); } /** * Creates a new entity instance. */ - static create(): T { - return this.getRepository().create(); + static create(this: ObjectType): T { + return (this as any).getRepository().create(); } /** * Merges multiple entities (or entity-like objects) into a given entity. */ - static merge(mergeIntoEntity: T, ...entityLikes: DeepPartial[]): T { - return this.getRepository().merge(mergeIntoEntity, ...entityLikes); + static merge(this: ObjectType, mergeIntoEntity: T, ...entityLikes: DeepPartial[]): T { + return (this as any).getRepository().merge(mergeIntoEntity, ...entityLikes); } /** @@ -122,109 +123,109 @@ export class EntityModel { * Note that given entity-like object must have an entity id / primary key to find entity by. * Returns undefined if entity with given id was not found. */ - static preload(entityLike: DeepPartial): Promise { - return this.getRepository().preload(entityLike); + static preload(this: ObjectType, entityLike: DeepPartial): Promise { + return (this as any).getRepository().preload(entityLike); } /** * Saves all given entities in the database. * If entities do not exist in the database then inserts, otherwise updates. */ - static save(entities: T[], options?: SaveOptions): Promise; + static save(this: ObjectType, entities: T[], options?: SaveOptions): Promise; /** * Saves a given entity in the database. * If entity does not exist in the database then inserts, otherwise updates. */ - static save(entity: T, options?: SaveOptions): Promise; + static save(this: ObjectType, entity: T, options?: SaveOptions): Promise; /** * Saves one or many given entities. */ - static save(entityOrEntities: T|T[], options?: SaveOptions): Promise { - return this.getRepository().save(entityOrEntities as any, options); + static save(this: ObjectType, entityOrEntities: T|T[], options?: SaveOptions): Promise { + return (this as any).getRepository().save(entityOrEntities as any, options); } /** * Updates entity partially. Entity can be found by a given conditions. */ - static update(conditions: Partial, partialEntity: DeepPartial, options?: SaveOptions): Promise; + static update(this: ObjectType, conditions: Partial, partialEntity: DeepPartial, options?: SaveOptions): Promise; /** * Updates entity partially. Entity can be found by a given find options. */ - static update(findOptions: FindOneOptions, partialEntity: DeepPartial, options?: SaveOptions): Promise; + static update(this: ObjectType, findOptions: FindOneOptions, partialEntity: DeepPartial, options?: SaveOptions): Promise; /** * Updates entity partially. Entity can be found by a given conditions. */ - static update(conditionsOrFindOptions: Partial|FindOneOptions, partialEntity: DeepPartial, options?: SaveOptions): Promise { - return this.getRepository().update(conditionsOrFindOptions as any, partialEntity, options); + static update(this: ObjectType, conditionsOrFindOptions: Partial|FindOneOptions, partialEntity: DeepPartial, options?: SaveOptions): Promise { + return (this as any).getRepository().update(conditionsOrFindOptions as any, partialEntity, options); } /** * Updates entity partially. Entity will be found by a given id. */ - static updateById(id: any, partialEntity: DeepPartial, options?: SaveOptions): Promise { - return this.getRepository().updateById(id, partialEntity, options); + static updateById(this: ObjectType, id: any, partialEntity: DeepPartial, options?: SaveOptions): Promise { + return (this as any).getRepository().updateById(id, partialEntity, options); } /** * Removes a given entities from the database. */ - static remove(entities: T[], options?: RemoveOptions): Promise; + static remove(this: ObjectType, entities: T[], options?: RemoveOptions): Promise; /** * Removes a given entity from the database. */ - static remove(entity: T, options?: RemoveOptions): Promise; + static remove(this: ObjectType, entity: T, options?: RemoveOptions): Promise; /** * Removes one or many given entities. */ - static remove(entityOrEntities: T|T[], options?: RemoveOptions): Promise { - return this.getRepository().remove(entityOrEntities as any, options); + static remove(this: ObjectType, entityOrEntities: T|T[], options?: RemoveOptions): Promise { + return (this as any).getRepository().remove(entityOrEntities as any, options); } /** * Removes entity by a given entity id. */ - static removeById(id: any, options?: RemoveOptions): Promise { - return this.getRepository().removeById(id, options); + static removeById(this: ObjectType, id: any, options?: RemoveOptions): Promise { + return (this as any).getRepository().removeById(id, options); } /** * Counts entities that match given options. */ - static count(options?: FindManyOptions): Promise; + static count(this: ObjectType, options?: FindManyOptions): Promise; /** * Counts entities that match given conditions. */ - static count(conditions?: DeepPartial): Promise; + static count(this: ObjectType, conditions?: DeepPartial): Promise; /** * Counts entities that match given find options or conditions. */ - static count(optionsOrConditions?: FindManyOptions|DeepPartial): Promise { - return this.getRepository().count(optionsOrConditions as any); + static count(this: ObjectType, optionsOrConditions?: FindManyOptions|DeepPartial): Promise { + return (this as any).getRepository().count(optionsOrConditions as any); } /** * Finds entities that match given options. */ - static find(options?: FindManyOptions): Promise; + static find(this: ObjectType, options?: FindManyOptions): Promise; /** * Finds entities that match given conditions. */ - static find(conditions?: DeepPartial): Promise; + static find(this: ObjectType, conditions?: DeepPartial): Promise; /** * Finds entities that match given find options or conditions. */ - static find(optionsOrConditions?: FindManyOptions|DeepPartial): Promise { - return this.getRepository().find(optionsOrConditions as any); + static find(this: ObjectType, optionsOrConditions?: FindManyOptions|DeepPartial): Promise { + return (this as any).getRepository().find(optionsOrConditions as any); } /** @@ -232,94 +233,94 @@ export class EntityModel { * Also counts all entities that match given conditions, * but ignores pagination settings (from and take options). */ - static findAndCount(options?: FindManyOptions): Promise<[ T[], number ]>; + static findAndCount(this: ObjectType, options?: FindManyOptions): Promise<[ T[], number ]>; /** * Finds entities that match given conditions. * Also counts all entities that match given conditions, * but ignores pagination settings (from and take options). */ - static findAndCount(conditions?: DeepPartial): Promise<[ T[], number ]>; + static findAndCount(this: ObjectType, conditions?: DeepPartial): Promise<[ T[], number ]>; /** * Finds entities that match given find options or conditions. * Also counts all entities that match given conditions, * but ignores pagination settings (from and take options). */ - static findAndCount(optionsOrConditions?: FindManyOptions|DeepPartial): Promise<[ T[], number ]> { - return this.getRepository().findAndCount(optionsOrConditions as any); + static findAndCount(this: ObjectType, optionsOrConditions?: FindManyOptions|DeepPartial): Promise<[ T[], number ]> { + return (this as any).getRepository().findAndCount(optionsOrConditions as any); } /** * Finds entities by ids. * Optionally find options can be applied. */ - static findByIds(ids: any[], options?: FindManyOptions): Promise; + static findByIds(this: ObjectType, ids: any[], options?: FindManyOptions): Promise; /** * Finds entities by ids. * Optionally conditions can be applied. */ - static findByIds(ids: any[], conditions?: DeepPartial): Promise; + static findByIds(this: ObjectType, ids: any[], conditions?: DeepPartial): Promise; /** * Finds entities by ids. * Optionally find options can be applied. */ - static findByIds(ids: any[], optionsOrConditions?: FindManyOptions|DeepPartial): Promise { - return this.getRepository().findByIds(ids, optionsOrConditions as any); + static findByIds(this: ObjectType, ids: any[], optionsOrConditions?: FindManyOptions|DeepPartial): Promise { + return (this as any).getRepository().findByIds(ids, optionsOrConditions as any); } /** * Finds first entity that matches given options. */ - static findOne(options?: FindOneOptions): Promise; + static findOne(this: ObjectType, options?: FindOneOptions): Promise; /** * Finds first entity that matches given conditions. */ - static findOne(conditions?: DeepPartial): Promise; + static findOne(this: ObjectType, conditions?: DeepPartial): Promise; /** * Finds first entity that matches given conditions. */ - static findOne(optionsOrConditions?: FindOneOptions|DeepPartial): Promise { - return this.getRepository().findOne(optionsOrConditions as any); + static findOne(this: ObjectType, optionsOrConditions?: FindOneOptions|DeepPartial): Promise { + return (this as any).getRepository().findOne(optionsOrConditions as any); } /** * Finds entity by given id. * Optionally find options can be applied. */ - static findOneById(id: any, options?: FindOneOptions): Promise; + static findOneById(this: ObjectType, id: any, options?: FindOneOptions): Promise; /** * Finds entity by given id. * Optionally conditions can be applied. */ - static findOneById(id: any, conditions?: DeepPartial): Promise; + static findOneById(this: ObjectType, id: any, conditions?: DeepPartial): Promise; /** * Finds entity by given id. * Optionally find options or conditions can be applied. */ - static findOneById(id: any, optionsOrConditions?: FindOneOptions|DeepPartial): Promise { - return this.getRepository().findOneById(id, optionsOrConditions as any); + static findOneById(this: ObjectType, id: any, optionsOrConditions?: FindOneOptions|DeepPartial): Promise { + return (this as any).getRepository().findOneById(id, optionsOrConditions as any); } /** * Executes a raw SQL query and returns a raw database results. * Raw query execution is supported only by relational databases (MongoDB is not supported). */ - static query(query: string, parameters?: any[]): Promise { - return this.getRepository().query(query, parameters); + static query(this: ObjectType, query: string, parameters?: any[]): Promise { + return (this as any).getRepository().query(query, parameters); } /** * Clears all the data from the given table/collection (truncates/drops it). */ - static clear(): Promise { - return this.getRepository().clear(); + static clear(this: ObjectType, ): Promise { + return (this as any).getRepository().clear(); } } \ No newline at end of file diff --git a/test/functional/entity-model/entity-model.ts b/test/functional/entity-model/entity-model.ts index a3ab44c4a..eedbd077f 100644 --- a/test/functional/entity-model/entity-model.ts +++ b/test/functional/entity-model/entity-model.ts @@ -18,12 +18,12 @@ describe("entity-model", () => { it("should save successfully and use static methods successfully", () => PromiseUtils.runInSequence(connections, async connection => { Post.useConnection(connection); // change connection each time because of AR specifics - const post = new Post(); + const post = Post.create(); post.title = "About ActiveRecord"; post.text = "Huge discussion how good or bad ActiveRecord is."; await post.save(); - const loadedPost = await Post.findOneById(1); + const loadedPost = await Post.findOneById(1); loadedPost!.should.be.instanceOf(Post); loadedPost!.id.should.be.eql(1);