import { Query } from './query'; import { Entity } from '../domain/entity'; import { DHContext } from '../utils/context'; export interface IDatabase { list(query?: Query, _id_empresa?: string ,sortBy?: keyof T, orderByDirection?: 'asc' | 'desc'): Promise | T[]>; find(query: Query): Promise | Array>; findOne(query: Query): Promise; findById(_id: string): Promise; findByIdPessoa(_id_pessoa: string): Promise; upsert(entity: T, query?: Query): Promise; insert(entity: T): Promise; remove(entity: T): Promise; } export interface ResultSet { rows: T[], total: number, totalOffline?: number, page: number, limit: number } export interface IDatabaseOptions { collection: string mergeOnUpsert?: boolean } export abstract class DatabaseOptions implements IDatabaseOptions { collection: string; mergeOnUpsert?: boolean = true; constructor(dbOptions: IDatabaseOptions & CustomDatabaseOptions) { Object.keys(dbOptions) .map(key => this[key] = dbOptions[key]) } } export abstract class DatabaseImp, DbGenericInstance = {}, DbGenericModel = {}> implements IDatabase { abstract list(query?: Query, _id_empresa?: string, sortBy?: keyof T, orderByDirection?: 'asc' | 'desc'): Promise | T[]> abstract find(query: Query): Promise | T[]> abstract findOne(query: Query): Promise abstract findById(_id: string): Promise abstract findByIdPessoa(_id_pessoa: string): Promise abstract upsert(entity: T, query?: Query): Promise abstract insert(entity: T): Promise abstract remove(entity: T): Promise constructor( protected dbInstance: DbGenericInstance, protected dbOptions: DatabaseOptions, protected fromJson: (doc: DbGenericModel) => T | Promise, protected toJson: (entity: T) => DbGenericModel ) { } } export abstract class DatabaseService, K extends DatabaseImp, DbGenericInstance = {}, DbGenericModel = {}> { constructor( protected service: K, protected dbInstance: DbGenericInstance, protected dbOptions: DatabaseOptions, protected fromJson: (doc: DbGenericModel) => T | Promise, protected toJson: (entity: T) => DbGenericModel, ) { } }