import { Observable } from 'rxjs'; import { FirestoreService } from './firestore.service'; import { FirestoreDocument, PaginatedResult, QueryOptions } from './types'; import * as i0 from "@angular/core"; /** * Opciones de configuración para una colección. */ export interface CollectionOptions { /** * Si true, usa soft delete (marca deletedAt en lugar de eliminar). * Default: false */ softDelete?: boolean; /** * Si true, maneja automáticamente createdAt/updatedAt. * Default: true */ timestamps?: boolean; /** * Si true, el path se trata como global y NO se prefija con `apps/{appId}/`. * * Usar para colecciones cross-app a nivel user/global, p.ej. * `users/{uid}/notifications` (inbox global), `profiles/{uid}` o `public/...`. * * Las reglas de Firestore deben permitir el path absoluto correspondiente. * * Default: false (path prefijado a `apps/{appId}/...`). */ skipAppPrefix?: boolean; } /** * Referencia a una sub-colección tipada. */ export interface SubCollectionRef { getById(id: string): Promise; getAll(options?: QueryOptions): Promise; watch(id: string): Observable; watchAll(options?: QueryOptions): Observable; create(data: Omit): Promise; update(id: string, data: Partial): Promise; delete(id: string): Promise; } /** * Factory para crear instancias de colección tipadas. * * @example * ```typescript * @Injectable({ providedIn: 'root' }) * export class UsersService { * private users = inject(FirestoreCollectionFactory).create('users'); * * getAll = () => this.users.getAll(); * getById = (id: string) => this.users.getById(id); * create = (data: Omit) => this.users.create(data); * * // Métodos personalizados * async getActiveUsers(): Promise { * return this.users.query({ * where: [{ field: 'active', operator: '==', value: true }] * }); * } * } * ``` */ export declare class FirestoreCollectionFactory { private firestore; constructor(firestore: FirestoreService); /** * Crea una instancia de colección tipada. * * @param collectionPath - Ruta de la colección en Firestore * @param options - Opciones de configuración * @returns Instancia de TypedCollection */ create(collectionPath: string, options?: CollectionOptions): TypedCollection; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; } /** * Colección tipada con métodos CRUD. * * NO usa inject() - recibe FirestoreService por constructor. * Esto evita el error NG0203. */ export declare class TypedCollection { private firestore; private readonly options; private readonly collectionPath; constructor(firestore: FirestoreService, collectionPath: string, options?: CollectionOptions); /** * Obtiene un documento por ID. */ getById(id: string): Promise; /** * Obtiene todos los documentos de la colección. */ getAll(options?: QueryOptions): Promise; /** * Ejecuta una query personalizada. */ query(options: QueryOptions): Promise; /** * Obtiene documentos con paginación. */ paginate(options: QueryOptions & { limit: number; }): Promise>; /** * Obtiene el primer documento que coincida con la query. */ getFirst(options?: QueryOptions): Promise; /** * Cuenta los documentos que coinciden con la query (server-side aggregation). * No descarga documentos — usa getCountFromServer() de Firestore. */ count(options?: QueryOptions): Promise; /** * Obtiene todos los documentos (one-time fetch sin listener). * A diferencia de watchAll(), no mantiene subscripciones activas. */ getAllOnce(options?: QueryOptions): Promise; /** * Verifica si un documento existe. */ exists(id: string): Promise; /** * Suscribe a cambios de un documento. */ watch(id: string): Observable; /** * Suscribe a cambios de la colección. */ watchAll(options?: QueryOptions): Observable; /** * Suscribe a una query personalizada. */ watchQuery(options: QueryOptions): Observable; /** * Crea un nuevo documento con ID auto-generado. */ create(data: Omit): Promise; /** * Crea un documento con ID específico. */ createWithId(id: string, data: Omit): Promise; /** * Actualiza campos de un documento. */ update(id: string, data: Partial>): Promise; /** * Elimina un documento. * Si softDelete está habilitado, marca como eliminado en lugar de borrar. */ delete(id: string): Promise; /** * Actualiza múltiples documentos en una sola operación atómica. */ batchUpdate(ids: string[], data: Partial>): Promise; /** * Elimina múltiples documentos en una sola operación atómica. */ batchDelete(ids: string[]): Promise; /** * Restaura un documento soft-deleted. */ restore(id: string): Promise; /** * Obtiene una referencia a una sub-colección. * * @example * ```typescript * // En UsersService * getUserDocuments(userId: string) { * return this.users.subcollection(userId, 'documents'); * } * * // Uso * const docs = await users.getUserDocuments('user123').getAll(); * ``` */ subcollection(parentId: string, subcollectionName: string): SubCollectionRef; /** * Aplica filtros por defecto a las queries. */ private applyDefaultFilters; /** * Genera un nuevo ID sin crear el documento. */ generateId(): string; /** * Obtiene la ruta de la colección. */ getPath(): string; } /** * @deprecated Use FirestoreCollectionFactory.create() instead. * Type alias for backwards compatibility. */ export type FirestoreCollection = TypedCollection;