import { Client, Databases, IndexType, Models } from 'node-appwrite';
import { ClientWithToken } from './domain/client-with-token';
import { PermissionType } from './domain/permission-type.enum';
import { Document } from './domain/document.type';
type PartialDocumentType = Omit<Document, keyof Document>;
export declare class AppwriteRepository<Schema extends PartialDocumentType> {
    private readonly client;
    protected readonly databaseId: string;
    protected readonly collectionId: string;
    protected databases: Databases;
    constructor(client: Client | ClientWithToken, databaseId: string, collectionId: string);
    attributeExistsByKey(key: string): Promise<boolean>;
    listDocuments(queries?: string[]): Promise<Models.DocumentList<Schema & Document>>;
    listByProperties(properties: Partial<Schema>, extraQueries?: string[]): Promise<Models.DocumentList<Schema & Document>>;
    createDocument(data: Schema, permissions?: string[]): Promise<Schema & Document>;
    createDocumentWithId(documentId: string, data: Schema, permissions?: string[]): Promise<Schema & Document>;
    getDocument(documentId: string, queries?: string[]): Promise<(Schema & Document) | null>;
    getDocumentBy(query: Partial<Schema & Document>): Promise<Schema & Document | null>;
    updateDocument(documentId: string, data?: Partial<Schema>, permissions?: string[]): Promise<Schema & Document>;
    deleteDocument(documentId: string): Promise<void>;
    createOrUpdateDocument(query: Partial<Schema & Document>, data: Schema, permissions?: string[]): Promise<Schema & Document>;
    createOrUpdateBooleanAttribute(key: string, required: boolean, xdefault?: boolean, array?: boolean): Promise<void>;
    createOrUpdateStringAttribute(key: string, size: number, required: boolean, xdefault?: string, array?: boolean, encrypt?: boolean): Promise<void>;
    createOrUpdateDateTimeAttribute(key: string, required: boolean, xdefault?: string, array?: boolean): Promise<void>;
    createOrUpdateEmailAttribute(key: string, required: boolean, xdefault?: string, array?: boolean): Promise<void>;
    createOrUpdateEnumAttribute(key: string, elements: string[], required: boolean, xdefault?: string, array?: boolean): Promise<void>;
    createOrUpdateFloatAttribute(key: string, required: boolean, min?: number, max?: number, xdefault?: number, array?: boolean): Promise<void>;
    createOrUpdateIntegerAttribute(key: string, required: boolean, min?: number, max?: number, xdefault?: number): Promise<void>;
    createOrUpdateIndex(key: string, type: IndexType, attributes: string[], orders?: string[]): Promise<Models.Index>;
    getIndex(key: string): Promise<Models.Index>;
    private attributeExists;
    private getAttribute;
    deleteAttribute(key: string): Promise<void>;
    getCollection(): Promise<Models.Collection>;
    createOrUpdateCollection(name: string, permissions?: string[], documentSecurity?: boolean, enabled?: boolean): Promise<Models.Collection>;
    hasCollectionPermission(client: ClientWithToken, permissionType: PermissionType): Promise<boolean>;
    hasDocumentPermission(client: ClientWithToken, document: Document, permissionType: PermissionType): Promise<boolean>;
    private hasPermission;
    private getTeamIdFromTeamRolePermission;
    private findAllTeams;
    asAppClient(client: ClientWithToken): AppwriteRepository<Schema>;
}
export {};
