import type { EntityManager, EntityRepository, QueryBuilder } from '@mikro-orm/postgresql'; import type { MaybePromise } from '@wener/utils'; import { getEntityManager } from '../../mikro-orm'; import { type EntityDef, getEntityDef } from '../defineEntity'; import type { StandardBaseEntity } from '../StandardBaseEntity'; import type { EntityClass } from './EntityClass'; export interface ResolveEntityContextOptions { Entity: EntityClass; repo?: EntityRepository; em?: EntityManager; def?: EntityDef; builder?: QueryBuilder; createQueryBuilder?: () => MaybePromise<{ builder: QueryBuilder }>; // avoid async cause exec } export interface ResolvedEntityContext { Entity: EntityClass; repo: EntityRepository; em: EntityManager; def?: EntityDef; // builder: QueryBuilder; createQueryBuilder(): Promise<{ builder: QueryBuilder }>; } export function resolveEntityContext( ctx: ResolveEntityContextOptions, ): ResolvedEntityContext { const { Entity, em = getEntityManager() as EntityManager, repo = em.getRepository(Entity) as EntityRepository, def = getEntityDef(Entity), createQueryBuilder, builder, } = ctx; return { Entity, repo, em, def, async createQueryBuilder() { let v = builder; if (!v && createQueryBuilder) { ({ builder: v } = await createQueryBuilder.call(ctx)); } if (!v) { v = repo.qb(); } return { builder: v }; }, }; }