import { asyncMap } from "../utils/async"; export class BaseRepository { private nextRelations: string[]; constructor() { this.nextRelations = []; } /** * Primes the specified relation(s) to be used in the next database operation. * Can be chained. */ public with(relations: string | string[]): this { if (Array.isArray(relations)) { this.nextRelations.push(...relations); } else { this.nextRelations.push(relations); } return this; } /** * Gets and resets the relations primed using with() */ protected getRelations(): string[] { const relations = this.nextRelations || []; this.nextRelations = []; return relations; } protected async _processEntityFromDB(entity) { // No-op, override in repository return entity; } protected async _processEntityToDB(entity) { // No-op, override in repository return entity; } protected async processEntityFromDB(entity: T): Promise { return this._processEntityFromDB(entity); } protected async processMultipleEntitiesFromDB(entities: TArr): Promise { return asyncMap(entities, (entity) => this.processEntityFromDB(entity)) as Promise; } protected async processEntityToDB>(entity: T): Promise { return this._processEntityToDB(entity); } }