import { Models } from 'appwrite';
import { Observable } from 'rxjs';
import * as i0 from "@angular/core";
export declare abstract class AppwriteAdapter<DocumentShape extends Models.Document> {
    private databases;
    protected abstract collectionId: string;
    protected abstract validationFn: undefined | ((data: unknown) => DocumentShape);
    /**
     * Create Document
     *
     * Create a new Document. Before using this route, you should create a new
     * collection resource using either a [server
     * integration](/docs/server/databases#databasesCreateCollection) API or
     * directly from your database console.
     * @param {DocumentShape} awDocument
     * @param {string[]} [permissions]
     * @param {string} [alternativeDatabaseId]
     * @throws {AppwriteException}
     * @returns {Promise<DocumentShape>}
     */
    create(awDocument: Omit<DocumentShape, '$id' | '$collectionId' | '$databaseId' | '$updatedAt' | '$createdAt' | '$permissions'>, permissions?: string[], documentId?: string, alternativeDatabaseId?: string): Promise<DocumentShape>;
    /**
     * Update Document
     *
     * Updates a Document. Before using this route, you should create a new
     * collection resource using either a [server
     * integration](/docs/server/databases#databasesCreateCollection) API or
     * directly from your database console.
     * @param {Partial<DocumentShape>} awDocument
     * @param {string[]} [permissions]
     * @param {string} [alternativeDatabaseId]
     * @throws {AppwriteException}
     * @returns {Promise<T & Models.Document>}
     */
    update(awDocument: Partial<DocumentShape> & {
        $id: string;
    }, permissions?: string[], alternativeDatabaseId?: string): Promise<DocumentShape>;
    /**
     * Upsert Document
     *
     * Upserts a Document. If an { $id: string } exists on the document, it is updated, otherwise a new document is created
     * Before using this route, you should create a new
     * collection resource using either a [server
     * integration](/docs/server/databases#databasesCreateCollection) API or
     * directly from your database console.
     * @param {DocumentShape} awDocument
     * @param {string[]} [permissions]
     * @param {string} [alternativeDatabaseId]
     * @throws {AppwriteException}
     * @returns {Promise<T & Models.Document>}
     */
    upsert(awDocument: Partial<DocumentShape>, permissions?: string[], alternativeDatabaseId?: string): Promise<DocumentShape>;
    /**
     * Delete Document
     *
     * Deletes a Document.
     * Takes either a document id or a document object with an id
     * @param {DocumentShape | string} awDocumentIdOrAwDocument
     * @param {string} [alternateDatabaseId]
     * @throws {AppwriteException}
     * @returns {Promise<T & Models.Document>}
     */
    delete(awDocumentIdOrAwDocument: string | (Partial<DocumentShape> & {
        $id: string;
    }), alternateDatabaseId?: string): Promise<Record<string, unknown>>;
    document(documentId: string, alternativeDatabaseId?: string): Promise<DocumentShape>;
    documentList(queries?: string[], alternativeDatabaseId?: string): Promise<Models.DocumentList<DocumentShape>>;
    documentList$(queries?: string[], events?: string[], alternativeDatabaseId?: string): Observable<Models.DocumentList<DocumentShape>>;
    document$(documentId: string, queries?: string[], alternativeDatabaseId?: string): Observable<DocumentShape | null>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AppwriteAdapter<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AppwriteAdapter<any>>;
}
