import type { RequiredEntityData } from '@mikro-orm/core'; import type { EntityManager, EntityRepository, FindOneOptions, MikroORM, QueryBuilder } from '@mikro-orm/postgresql'; import { Injectable } from '@nestjs/common'; import { Errors } from '@wener/utils'; import { getEntityDef } from '../defineEntity'; import { StandardBaseEntity } from '../StandardBaseEntity'; import { EntityBaseService } from './EntityBaseService'; import type { FindAllEntityOptions, FindAllEntityResult } from './findAllEntity'; import type { ResolveEntityOptions, ResolveEntityResult } from './resolveEntity'; import type { AnyEntityService, AssignEntityOwnerOptions, BindEntityOptions, ClaimEntityOwnerOptions, CreateEntityOptions, EntityResult, EntityService, HasOwnerEntityService, HasStatusEntityService, ReleaseEntityOwnerOptions, SetEntityNotesOptions, SetEntityStatusOptions, UpdateEntityOptions, } from './services'; import type { AssignOwnerRequest, ClaimOwnerRequest, CountEntityRequest, CreateEntityRequest, DeleteEntityRequest, GetEntityRequest, ListEntityRequest, PatchEntityRequest, ReleaseOwnerRequest, ResolveEntityRequest, UpdateEntityRequest, } from './types'; @Injectable() export class AutoEntityService implements EntityService, HasOwnerEntityService, HasStatusEntityService { readonly Entity = StandardBaseEntity; constructor( protected readonly orm: MikroORM, readonly em: EntityManager = orm.em, ) {} applySearch() {} resolveSearch() { return { and: [], or: [] }; } createEntity( _req: CreateEntityOptions>, ): Promise> { throw Errors.NotImplemented.throw(); } updateEntity( _ent: ResolveEntityOptions, _opts: UpdateEntityOptions, ): Promise> { throw Errors.NotImplemented.throw(); } patchEntity( _ent: ResolveEntityOptions, _opts: UpdateEntityOptions, ): Promise> { throw Errors.NotImplemented.throw(); } createQueryBuilder({ em: _em }: { em?: EntityManager }): Promise<{ builder: QueryBuilder }> { throw Errors.NotImplemented.throw(); } findAllEntity(_req: FindAllEntityOptions): Promise> { throw Errors.NotImplemented.throw(); } get repo(): EntityRepository { throw Errors.NotImplemented.throw(); } create(_req: CreateEntityRequest & { data: RequiredEntityData }): Promise { throw Errors.NotImplemented.throw(); } list(_req: ListEntityRequest): Promise<{ total: number; data: StandardBaseEntity[] }> { throw Errors.NotImplemented.throw(); } find(_req: ListEntityRequest): Promise { throw Errors.NotImplemented.throw(); } count(_req: CountEntityRequest): Promise { throw Errors.NotImplemented.throw(); } patch(req: PatchEntityRequest) { return this.getEntityService(req).patch(req); } update(req: UpdateEntityRequest & { data: Partial }): Promise { return this.getEntityService(req).update(req); } getEntityService({ id }: ResolveEntityOptions): AnyEntityService { const def = getEntityDef(id); if (!def) { throw new Error(`Invalid entity id: ${id}`); } let service = EntityBaseService.getService>(def.Entity); if (!service) { throw new Error(`Entity service not found: ${id}`); } return service; } get(req: GetEntityRequest) { return this.getEntityService(req).get(req); } resolve(req: ResolveEntityRequest) { return this.getEntityService(req).resolve(req); } claimOwner(req: ClaimOwnerRequest) { return this.getEntityService(req).claimOwner(req); } releaseOwner(req: ReleaseOwnerRequest) { return this.getEntityService(req).releaseOwner(req); } assignOwner(req: AssignOwnerRequest) { return this.getEntityService(req).assignOwner(req); } delete(req: DeleteEntityRequest) { return this.getEntityService(req).delete(req); } async setEntityStatus(ent: ResolveEntityOptions, opts: SetEntityStatusOptions) { return this.getEntityService(ent).setEntityStatus(ent, opts); } requireEntity( req: ResolveEntityOptions, ext?: FindOneOptions, ): Promise<{ entity: E }> { return this.getEntityService(req).requireEntity(req, ext); } resolveEntity( req: ResolveEntityOptions, ext?: FindOneOptions, ): Promise> { return this.getEntityService(req).requireEntity(req, ext); } deleteEntity(req: ResolveEntityOptions): Promise<{ entity?: E }> { return this.getEntityService(req).deleteEntity(req); } undeleteEntity(req: ResolveEntityOptions): Promise<{ entity?: E }> { return this.getEntityService(req).undeleteEntity(req); } purgeEntity(req: ResolveEntityOptions): Promise<{ entity?: E }> { return this.getEntityService(req).purgeEntity(req); } bindEntity( ent: ResolveEntityOptions, ref: BindEntityOptions, ): Promise<{ entity?: E }> { return this.getEntityService(ent).bindEntity(ent, ref); } unbindEntity(req: ResolveEntityOptions) { return this.getEntityService(req).unbindEntity(req); } claimEntityOwner( ent: ResolveEntityOptions, opts: ClaimEntityOwnerOptions, ): Promise> { return this.getEntityService(ent).claimEntityOwner(ent, opts); } assignEntityOwner( ent: ResolveEntityOptions, opts: AssignEntityOwnerOptions, ): Promise> { return this.getEntityService(ent).assignEntityOwner(ent, opts); } releaseEntityOwner( ent: ResolveEntityOptions, opts: ReleaseEntityOwnerOptions, ): Promise> { return this.getEntityService(ent).releaseEntityOwner(ent, opts); } setEntityNotes( ent: ResolveEntityOptions, req: SetEntityNotesOptions, ): Promise> { return this.getEntityService(ent).setEntityNotes(ent, req); } }