feat: добавил Entity Manager
This commit is contained in:
parent
3b6e00ec1d
commit
d0942e59d9
14
orm.d.ts
vendored
14
orm.d.ts
vendored
@ -26,6 +26,20 @@ export declare abstract class Entity<T extends Data> {
|
||||
/** @public */
|
||||
export declare type EntityConstructor<T extends Data> = new (data?: T) => Entity<T>;
|
||||
|
||||
/** @public */
|
||||
export declare class EntityManager {
|
||||
private readonly _storage;
|
||||
private _saveMap;
|
||||
private _removeMap;
|
||||
constructor(storage: Storage_2);
|
||||
persist(entity: Entity<any>): this;
|
||||
persistMany(entities: Entity<any>[]): this;
|
||||
remove(entity: Entity<any>): this;
|
||||
forget(): this;
|
||||
flush(): Promise<this>;
|
||||
refresh(entity: Entity<any>): Promise<Entity<any>>;
|
||||
}
|
||||
|
||||
/** @public */
|
||||
export declare class ErrEntityHasNoUniqKeyValue extends Error {
|
||||
}
|
||||
|
64
src/app/entity/manager.ts
Normal file
64
src/app/entity/manager.ts
Normal file
@ -0,0 +1,64 @@
|
||||
import { Entity } from '../entity'
|
||||
import { Storage } from '../storage'
|
||||
|
||||
/** @public */
|
||||
export class EntityManager {
|
||||
private readonly _storage: Storage
|
||||
private _saveMap: Map<string, Entity<any>>
|
||||
private _removeMap: Map<string, Entity<any>>
|
||||
|
||||
constructor(storage: Storage) {
|
||||
this._storage = storage
|
||||
this._saveMap = new Map()
|
||||
this._removeMap = new Map()
|
||||
}
|
||||
|
||||
persist(entity: Entity<any>): this {
|
||||
const key = [entity.constructor.name, entity.getUniqKey()].join('&')
|
||||
this._saveMap.set(key, entity)
|
||||
return this
|
||||
}
|
||||
|
||||
persistMany(entities: Entity<any>[]): this {
|
||||
for (let entity of entities) {
|
||||
this.persist(entity)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
remove(entity: Entity<any>): this {
|
||||
const key = [entity.constructor.name, entity.getUniqKey()].join('&')
|
||||
this._removeMap.set(key, entity)
|
||||
return this
|
||||
}
|
||||
|
||||
forget(): this {
|
||||
this._saveMap = new Map()
|
||||
return this
|
||||
}
|
||||
|
||||
async flush() {
|
||||
if (!this._saveMap.size && !this._removeMap.size) return this
|
||||
|
||||
const session = this._storage.createSession()
|
||||
await session.start()
|
||||
await session.commit(async () => {
|
||||
for (let en of this._saveMap.values()) {
|
||||
await en._getRepo(this._storage).save(en)
|
||||
}
|
||||
this._saveMap = new Map()
|
||||
|
||||
for (let en of this._removeMap.values()) {
|
||||
await en._getRepo(this._storage).remove(en)
|
||||
}
|
||||
this._removeMap = new Map()
|
||||
})
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
async refresh(entity: Entity<any>) {
|
||||
const repo = entity._getRepo(this._storage)
|
||||
return repo.findById(entity.getUniqKey())
|
||||
}
|
||||
}
|
@ -6,3 +6,4 @@ export { Data, ValuesObject } from './app/data'
|
||||
export { Entity, EntityConstructor, ErrEntityHasNoUniqKeyValue } from './app/entity'
|
||||
export { Repo, ErrFoundNotUniqEntity, ErrEntityNotFound } from './app/repo'
|
||||
export { Storage, StorageCursor, ErrStorage, ErrNoSession, StorageSession } from './app/storage'
|
||||
export { EntityManager } from './app/entity/manager'
|
||||
|
Loading…
Reference in New Issue
Block a user