import { EventEmitter } from 'events';
export interface CrudEvent<T> {
    created: [T[]];
    updated: [T[]];
    deleted: [T[]];
}
/**
 * Represents a generic CRUD repository.
 *
 * @template T - The type of the values stored in the repository.
 */
export declare abstract class CrudRepository<T> extends EventEmitter {
    constructor();
    /**
     * Creates a new entry in the database with the specified value.
     */
    create(tenantId: number, value: T, namespace?: string): Promise<T>;
    /**
     * Attempts to read a value from storage based on the given query, or throws if more than one value is found.
     */
    readOnlyOneByQuery(tenantId: number, query: object, namespace?: string): Promise<T | undefined>;
    /**
     * Reads a value from storage or creates it if none exists.
     */
    readOrCreateByQuery(tenantId: number, query: object, namespace?: string): Promise<[T, boolean]>;
    /**
     * Updates the value associated with the given key.
     */
    updateByKey(tenantId: number, value: Partial<T>, key: string, namespace?: string): Promise<T | undefined>;
    /**
     * Updates all values matching the given query.
     */
    updateAllByQuery(tenantId: number, value: Partial<T>, query: object, namespace?: string): Promise<T[]>;
    /**
     * Deletes the entry with the given key.
     */
    deleteByKey(tenantId: number, key: string, namespace?: string): Promise<T | undefined>;
    /**
     * Deletes all values associated with a query from the specified namespace.
     */
    deleteAllByQuery(tenantId: number, query: object, namespace?: string): Promise<T[]>;
    abstract readByKey(tenantId: number, key: string | number, namespace?: string): Promise<T | undefined>;
    abstract readAllByQuery(tenantId: number, query: object, namespace?: string): Promise<T[]>;
    abstract readNextValue(tenantId: number, columnName: string, query?: object, startValue?: number, namespace?: string): Promise<number>;
    abstract existsByKey(tenantId: number, key: string, namespace?: string): Promise<boolean>;
    abstract existByQuery(tenantId: number, query: object, namespace?: string): Promise<number>;
    protected abstract _create(tenantId: number, value: T, namespace?: string): Promise<T>;
    protected abstract _readOrCreateByQuery(tenantId: number, query: object, namespace?: string): Promise<[T, boolean]>;
    protected abstract _updateByKey(tenantId: number, value: Partial<T>, key: string, namespace?: string): Promise<T | undefined>;
    protected abstract _updateAllByQuery(tenantId: number, value: Partial<T>, query: object, namespace?: string): Promise<T[]>;
    protected abstract _deleteByKey(tenantId: number, key: string, namespace?: string): Promise<T | undefined>;
    protected abstract _deleteAllByQuery(tenantId: number, query: object, namespace?: string): Promise<T[]>;
}
