import type { RequiredEntityData } from '@mikro-orm/core'; import type { EntityManager, EntityRepository, FindOneOptions, QueryBuilder } from '@mikro-orm/postgresql'; import type { MaybePromise } from '@wener/utils'; import type { StandardBaseEntity } from '../StandardBaseEntity'; import type { EntityClass } from './EntityClass'; import type { FindAllEntityOptions, FindAllEntityResult } from './findAllEntity'; import type { ResolveEntityOptions, ResolveEntityResult } from './resolveEntity'; import type { AssignOwnerRequest, AssignOwnerResponse, ClaimOwnerRequest, ClaimOwnerResponse, CountEntityRequest, CreateEntityRequest, DeleteEntityRequest, GeneralResponse, GetEntityRequest, ListEntityRequest, PatchEntityRequest, ReleaseOwnerRequest, ReleaseOwnerResponse, ResolveEntityRequest, UpdateEntityRequest, } from './types'; export type ResolveSearchOptions = { search: string }; export interface EntityService2 { applySearch: (opts: { builder: QueryBuilder; search: string }) => MaybePromise; resolveSearch: (opts: ResolveSearchOptions) => MaybePromise<{ and: any[]; or: any[] }>; createQueryBuilder({ em }: { em?: EntityManager }): Promise<{ builder: QueryBuilder }>; requireEntity(ent: ResolveEntityOptions, ext?: FindOneOptions): Promise>; resolveEntity(ent: ResolveEntityOptions, ext?: FindOneOptions): Promise>; findAllEntity(ent: FindAllEntityOptions): Promise>; deleteEntity(ent: ResolveEntityOptions): Promise<{ entity?: E }>; undeleteEntity(ent: ResolveEntityOptions): Promise<{ entity?: E }>; purgeEntity(ent: ResolveEntityOptions): Promise<{ entity?: E }>; createEntity(req: CreateEntityOptions>): Promise>; updateEntity(ent: ResolveEntityOptions, opts: UpdateEntityOptions): Promise>; patchEntity(ent: ResolveEntityOptions, opts: UpdateEntityOptions): Promise>; setEntityNotes(ent: ResolveEntityOptions, req: SetEntityNotesOptions): Promise>; } export interface CreateEntityOptions { data: T; upsert?: boolean; onConflict?: { fields?: string[]; action?: 'ignore' | 'merge'; merge?: string[]; exclude?: string[]; }; } export interface UpdateEntityOptions { data: T; } export interface EntityService extends EntityService2 { // readonly orm: MikroORM; readonly Entity: EntityClass; readonly em: EntityManager; readonly repo: EntityRepository; create(req: CreateEntityRequest & { data: RequiredEntityData }): Promise; update(req: UpdateEntityRequest & { data: Partial }): Promise; patch(req: PatchEntityRequest): Promise; delete(req: DeleteEntityRequest): Promise>; list(req: ListEntityRequest): Promise<{ total: number; data: E[] }>; count(req: CountEntityRequest): Promise; find(req: ListEntityRequest): Promise; get(req: GetEntityRequest): Promise; resolve(req: ResolveEntityRequest): Promise; claimOwner(req: ClaimOwnerRequest): Promise; assignOwner(req: AssignOwnerRequest): Promise; releaseOwner(req: ReleaseOwnerRequest): Promise; } export type EntityServiceStatic = { Entity: EntityClass }; // export interface HasImportEntityService { // import(req: ImportEntityRequest): Promise<{ total: number }>; // } export interface HasSoftDeleteEntityService { deleteEntity(req: ResolveEntityOptions): Promise<{ entity?: E }>; undeleteEntity(req: ResolveEntityOptions): Promise<{ entity?: E }>; purgeEntity(req: ResolveEntityOptions): Promise<{ entity?: E }>; } export type ClaimEntityOwnerOptions = {}; export interface AssignEntityOwnerOptions { ownerId: string; } export type ReleaseEntityOwnerOptions = {}; export type EntityResult = { entity: E }; export interface HasOwnerEntityService { claimEntityOwner(ent: ResolveEntityOptions, opts: ClaimEntityOwnerOptions): Promise>; assignEntityOwner(ent: ResolveEntityOptions, opts: AssignEntityOwnerOptions): Promise>; releaseEntityOwner(ent: ResolveEntityOptions, opts: ReleaseEntityOwnerOptions): Promise>; } export type SetEntityStatusOptions = { status: string; state?: string; comment?: string }; export type SetEntityNotesOptions = { notes: string }; export interface HasStatusEntityService { setEntityStatus(ent: ResolveEntityOptions, opts: SetEntityStatusOptions): Promise>; } export type BindEntityOptions = { entityId: string; entityType?: string; entity?: StandardBaseEntity }; export interface HasEntityRefService { bindEntity(ent: ResolveEntityOptions, ref: BindEntityOptions): Promise>; unbindEntity(req: ResolveEntityOptions): Promise>; } export type AnyEntityService = EntityService & HasOwnerEntityService & HasStatusEntityService & HasEntityRefService & HasSoftDeleteEntityService;