import { Context, DAL, RepositoryTransformOptions } from "@medusajs/types" import { MedusaContext } from "../decorators" class AbstractBase { protected readonly manager_: any protected constructor({ manager }) { this.manager_ = manager } getActiveManager( @MedusaContext() { transactionManager, manager }: Context = {} ): TManager { return (transactionManager ?? manager ?? this.manager_) as TManager } async transaction( task: (transactionManager: TManager) => Promise, { transaction, isolationLevel, enableNestedTransactions = false, }: { isolationLevel?: string enableNestedTransactions?: boolean transaction?: TManager } = {} ): Promise { // @ts-ignore return await transactionWrapper.apply(this, arguments) } } export abstract class AbstractBaseRepository extends AbstractBase implements DAL.RepositoryService { abstract find(options?: DAL.FindOptions, context?: Context) abstract findAndCount( options?: DAL.FindOptions, context?: Context ): Promise<[T[], number]> abstract create(data: unknown[], context?: Context): Promise abstract update(data: unknown[], context?: Context): Promise abstract delete(ids: string[], context?: Context): Promise abstract softDelete( ids: string[], context?: Context ): Promise<[T[], Record]> abstract restore( ids: string[], context?: Context ): Promise<[T[], Record]> abstract getFreshManager(): TManager abstract serialize( data: any, options?: any ): Promise } export abstract class AbstractTreeRepositoryBase extends AbstractBase implements DAL.TreeRepositoryService { protected constructor({ manager }) { // @ts-ignore super(...arguments) } abstract find( options?: DAL.FindOptions, transformOptions?: RepositoryTransformOptions, context?: Context ) abstract findAndCount( options?: DAL.FindOptions, transformOptions?: RepositoryTransformOptions, context?: Context ): Promise<[T[], number]> abstract create(data: unknown, context?: Context): Promise abstract delete(id: string, context?: Context): Promise abstract getFreshManager(): TManager abstract serialize( data: any, options?: any ): Promise }