import "reflect-metadata";
import * as mongoose from "mongoose";
import { IDataObject } from "../data-objects/data-object";
import { IListOptions } from "../list-interfaces/list-options";
import { ISearchCriteria } from "../list-interfaces/search-criteria";
export interface IDataAccessObject<TData extends IDataObject, TObject extends IDataObject> {
    create(data: TData): Promise<TObject & {
        id: string;
    }>;
    insertMany(data: TData[]): Promise<TObject[]>;
    insertMany(data: TData[], options: {
        rawResult: true;
    }): Promise<TData[]>;
    findById(id: string): Promise<TObject>;
    list(searchCriteria?: ISearchCriteria, listOptions?: IListOptions): Promise<{
        total: number;
        results: TObject[];
    }>;
    update(data: TData): Promise<TObject>;
    deleteById(id: string): Promise<TObject>;
}
export declare abstract class DataAccessObject<TData extends IDataObject, TObject extends IDataObject> implements IDataAccessObject<TData, TObject> {
    protected abstract model: mongoose.Model<TData & mongoose.Document>;
    protected abstract targetClass: new (data: TData) => TObject;
    protected dataObjectClass: "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function";
    create(data: TData): Promise<TObject & {
        id: string;
    }>;
    insertMany(data: TData[]): Promise<TObject[]>;
    insertMany(data: TData[], options: {
        rawResult: true;
    }): Promise<TData[]>;
    findById(id: string): Promise<TObject>;
    list(searchCriteria?: ISearchCriteria, listOptions?: IListOptions): Promise<{
        total: number;
        results: TObject[];
    }>;
    update(data: TData): Promise<TObject>;
    deleteById(id: string): Promise<TObject>;
    protected initObject(result: mongoose.MongooseDocument): TObject | null;
}
